162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci// 362306a36Sopenharmony_ci// rt5682.c -- RT5682 ALSA SoC audio component driver 462306a36Sopenharmony_ci// 562306a36Sopenharmony_ci// Copyright 2018 Realtek Semiconductor Corp. 662306a36Sopenharmony_ci// Author: Bard Liao <bardliao@realtek.com> 762306a36Sopenharmony_ci// 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/module.h> 1062306a36Sopenharmony_ci#include <linux/moduleparam.h> 1162306a36Sopenharmony_ci#include <linux/init.h> 1262306a36Sopenharmony_ci#include <linux/delay.h> 1362306a36Sopenharmony_ci#include <linux/pm.h> 1462306a36Sopenharmony_ci#include <linux/pm_runtime.h> 1562306a36Sopenharmony_ci#include <linux/platform_device.h> 1662306a36Sopenharmony_ci#include <linux/spi/spi.h> 1762306a36Sopenharmony_ci#include <linux/acpi.h> 1862306a36Sopenharmony_ci#include <linux/gpio/consumer.h> 1962306a36Sopenharmony_ci#include <linux/mutex.h> 2062306a36Sopenharmony_ci#include <sound/core.h> 2162306a36Sopenharmony_ci#include <sound/pcm.h> 2262306a36Sopenharmony_ci#include <sound/pcm_params.h> 2362306a36Sopenharmony_ci#include <sound/jack.h> 2462306a36Sopenharmony_ci#include <sound/soc.h> 2562306a36Sopenharmony_ci#include <sound/soc-dapm.h> 2662306a36Sopenharmony_ci#include <sound/initval.h> 2762306a36Sopenharmony_ci#include <sound/tlv.h> 2862306a36Sopenharmony_ci#include <sound/rt5682.h> 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#include "rl6231.h" 3162306a36Sopenharmony_ci#include "rt5682.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciconst char *rt5682_supply_names[RT5682_NUM_SUPPLIES] = { 3462306a36Sopenharmony_ci "AVDD", 3562306a36Sopenharmony_ci "MICVDD", 3662306a36Sopenharmony_ci "VBAT", 3762306a36Sopenharmony_ci "DBVDD", 3862306a36Sopenharmony_ci "LDO1-IN", 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_supply_names); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic const struct reg_sequence patch_list[] = { 4362306a36Sopenharmony_ci {RT5682_HP_IMP_SENS_CTRL_19, 0x1000}, 4462306a36Sopenharmony_ci {RT5682_DAC_ADC_DIG_VOL1, 0xa020}, 4562306a36Sopenharmony_ci {RT5682_I2C_CTRL, 0x000f}, 4662306a36Sopenharmony_ci {RT5682_PLL2_INTERNAL, 0x8266}, 4762306a36Sopenharmony_ci {RT5682_SAR_IL_CMD_1, 0x22b7}, 4862306a36Sopenharmony_ci {RT5682_SAR_IL_CMD_3, 0x0365}, 4962306a36Sopenharmony_ci {RT5682_SAR_IL_CMD_6, 0x0110}, 5062306a36Sopenharmony_ci {RT5682_CHARGE_PUMP_1, 0x0210}, 5162306a36Sopenharmony_ci {RT5682_HP_LOGIC_CTRL_2, 0x0007}, 5262306a36Sopenharmony_ci {RT5682_SAR_IL_CMD_2, 0xac00}, 5362306a36Sopenharmony_ci {RT5682_CBJ_CTRL_7, 0x0104}, 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_civoid rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci int ret; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci ret = regmap_multi_reg_write(rt5682->regmap, patch_list, 6162306a36Sopenharmony_ci ARRAY_SIZE(patch_list)); 6262306a36Sopenharmony_ci if (ret) 6362306a36Sopenharmony_ci dev_warn(dev, "Failed to apply regmap patch: %d\n", ret); 6462306a36Sopenharmony_ci} 6562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_apply_patch_list); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ciconst struct reg_default rt5682_reg[RT5682_REG_NUM] = { 6862306a36Sopenharmony_ci {0x0002, 0x8080}, 6962306a36Sopenharmony_ci {0x0003, 0x8000}, 7062306a36Sopenharmony_ci {0x0005, 0x0000}, 7162306a36Sopenharmony_ci {0x0006, 0x0000}, 7262306a36Sopenharmony_ci {0x0008, 0x800f}, 7362306a36Sopenharmony_ci {0x000b, 0x0000}, 7462306a36Sopenharmony_ci {0x0010, 0x4040}, 7562306a36Sopenharmony_ci {0x0011, 0x0000}, 7662306a36Sopenharmony_ci {0x0012, 0x1404}, 7762306a36Sopenharmony_ci {0x0013, 0x1000}, 7862306a36Sopenharmony_ci {0x0014, 0xa00a}, 7962306a36Sopenharmony_ci {0x0015, 0x0404}, 8062306a36Sopenharmony_ci {0x0016, 0x0404}, 8162306a36Sopenharmony_ci {0x0019, 0xafaf}, 8262306a36Sopenharmony_ci {0x001c, 0x2f2f}, 8362306a36Sopenharmony_ci {0x001f, 0x0000}, 8462306a36Sopenharmony_ci {0x0022, 0x5757}, 8562306a36Sopenharmony_ci {0x0023, 0x0039}, 8662306a36Sopenharmony_ci {0x0024, 0x000b}, 8762306a36Sopenharmony_ci {0x0026, 0xc0c4}, 8862306a36Sopenharmony_ci {0x0029, 0x8080}, 8962306a36Sopenharmony_ci {0x002a, 0xa0a0}, 9062306a36Sopenharmony_ci {0x002b, 0x0300}, 9162306a36Sopenharmony_ci {0x0030, 0x0000}, 9262306a36Sopenharmony_ci {0x003c, 0x0080}, 9362306a36Sopenharmony_ci {0x0044, 0x0c0c}, 9462306a36Sopenharmony_ci {0x0049, 0x0000}, 9562306a36Sopenharmony_ci {0x0061, 0x0000}, 9662306a36Sopenharmony_ci {0x0062, 0x0000}, 9762306a36Sopenharmony_ci {0x0063, 0x003f}, 9862306a36Sopenharmony_ci {0x0064, 0x0000}, 9962306a36Sopenharmony_ci {0x0065, 0x0000}, 10062306a36Sopenharmony_ci {0x0066, 0x0030}, 10162306a36Sopenharmony_ci {0x0067, 0x0000}, 10262306a36Sopenharmony_ci {0x006b, 0x0000}, 10362306a36Sopenharmony_ci {0x006c, 0x0000}, 10462306a36Sopenharmony_ci {0x006d, 0x2200}, 10562306a36Sopenharmony_ci {0x006e, 0x0a10}, 10662306a36Sopenharmony_ci {0x0070, 0x8000}, 10762306a36Sopenharmony_ci {0x0071, 0x8000}, 10862306a36Sopenharmony_ci {0x0073, 0x0000}, 10962306a36Sopenharmony_ci {0x0074, 0x0000}, 11062306a36Sopenharmony_ci {0x0075, 0x0002}, 11162306a36Sopenharmony_ci {0x0076, 0x0001}, 11262306a36Sopenharmony_ci {0x0079, 0x0000}, 11362306a36Sopenharmony_ci {0x007a, 0x0000}, 11462306a36Sopenharmony_ci {0x007b, 0x0000}, 11562306a36Sopenharmony_ci {0x007c, 0x0100}, 11662306a36Sopenharmony_ci {0x007e, 0x0000}, 11762306a36Sopenharmony_ci {0x0080, 0x0000}, 11862306a36Sopenharmony_ci {0x0081, 0x0000}, 11962306a36Sopenharmony_ci {0x0082, 0x0000}, 12062306a36Sopenharmony_ci {0x0083, 0x0000}, 12162306a36Sopenharmony_ci {0x0084, 0x0000}, 12262306a36Sopenharmony_ci {0x0085, 0x0000}, 12362306a36Sopenharmony_ci {0x0086, 0x0005}, 12462306a36Sopenharmony_ci {0x0087, 0x0000}, 12562306a36Sopenharmony_ci {0x0088, 0x0000}, 12662306a36Sopenharmony_ci {0x008c, 0x0003}, 12762306a36Sopenharmony_ci {0x008d, 0x0000}, 12862306a36Sopenharmony_ci {0x008e, 0x0060}, 12962306a36Sopenharmony_ci {0x008f, 0x1000}, 13062306a36Sopenharmony_ci {0x0091, 0x0c26}, 13162306a36Sopenharmony_ci {0x0092, 0x0073}, 13262306a36Sopenharmony_ci {0x0093, 0x0000}, 13362306a36Sopenharmony_ci {0x0094, 0x0080}, 13462306a36Sopenharmony_ci {0x0098, 0x0000}, 13562306a36Sopenharmony_ci {0x009a, 0x0000}, 13662306a36Sopenharmony_ci {0x009b, 0x0000}, 13762306a36Sopenharmony_ci {0x009c, 0x0000}, 13862306a36Sopenharmony_ci {0x009d, 0x0000}, 13962306a36Sopenharmony_ci {0x009e, 0x100c}, 14062306a36Sopenharmony_ci {0x009f, 0x0000}, 14162306a36Sopenharmony_ci {0x00a0, 0x0000}, 14262306a36Sopenharmony_ci {0x00a3, 0x0002}, 14362306a36Sopenharmony_ci {0x00a4, 0x0001}, 14462306a36Sopenharmony_ci {0x00ae, 0x2040}, 14562306a36Sopenharmony_ci {0x00af, 0x0000}, 14662306a36Sopenharmony_ci {0x00b6, 0x0000}, 14762306a36Sopenharmony_ci {0x00b7, 0x0000}, 14862306a36Sopenharmony_ci {0x00b8, 0x0000}, 14962306a36Sopenharmony_ci {0x00b9, 0x0002}, 15062306a36Sopenharmony_ci {0x00be, 0x0000}, 15162306a36Sopenharmony_ci {0x00c0, 0x0160}, 15262306a36Sopenharmony_ci {0x00c1, 0x82a0}, 15362306a36Sopenharmony_ci {0x00c2, 0x0000}, 15462306a36Sopenharmony_ci {0x00d0, 0x0000}, 15562306a36Sopenharmony_ci {0x00d1, 0x2244}, 15662306a36Sopenharmony_ci {0x00d2, 0x3300}, 15762306a36Sopenharmony_ci {0x00d3, 0x2200}, 15862306a36Sopenharmony_ci {0x00d4, 0x0000}, 15962306a36Sopenharmony_ci {0x00d9, 0x0009}, 16062306a36Sopenharmony_ci {0x00da, 0x0000}, 16162306a36Sopenharmony_ci {0x00db, 0x0000}, 16262306a36Sopenharmony_ci {0x00dc, 0x00c0}, 16362306a36Sopenharmony_ci {0x00dd, 0x2220}, 16462306a36Sopenharmony_ci {0x00de, 0x3131}, 16562306a36Sopenharmony_ci {0x00df, 0x3131}, 16662306a36Sopenharmony_ci {0x00e0, 0x3131}, 16762306a36Sopenharmony_ci {0x00e2, 0x0000}, 16862306a36Sopenharmony_ci {0x00e3, 0x4000}, 16962306a36Sopenharmony_ci {0x00e4, 0x0aa0}, 17062306a36Sopenharmony_ci {0x00e5, 0x3131}, 17162306a36Sopenharmony_ci {0x00e6, 0x3131}, 17262306a36Sopenharmony_ci {0x00e7, 0x3131}, 17362306a36Sopenharmony_ci {0x00e8, 0x3131}, 17462306a36Sopenharmony_ci {0x00ea, 0xb320}, 17562306a36Sopenharmony_ci {0x00eb, 0x0000}, 17662306a36Sopenharmony_ci {0x00f0, 0x0000}, 17762306a36Sopenharmony_ci {0x00f1, 0x00d0}, 17862306a36Sopenharmony_ci {0x00f2, 0x00d0}, 17962306a36Sopenharmony_ci {0x00f6, 0x0000}, 18062306a36Sopenharmony_ci {0x00fa, 0x0000}, 18162306a36Sopenharmony_ci {0x00fb, 0x0000}, 18262306a36Sopenharmony_ci {0x00fc, 0x0000}, 18362306a36Sopenharmony_ci {0x00fd, 0x0000}, 18462306a36Sopenharmony_ci {0x00fe, 0x10ec}, 18562306a36Sopenharmony_ci {0x00ff, 0x6530}, 18662306a36Sopenharmony_ci {0x0100, 0xa0a0}, 18762306a36Sopenharmony_ci {0x010b, 0x0000}, 18862306a36Sopenharmony_ci {0x010c, 0xae00}, 18962306a36Sopenharmony_ci {0x010d, 0xaaa0}, 19062306a36Sopenharmony_ci {0x010e, 0x8aa2}, 19162306a36Sopenharmony_ci {0x010f, 0x02a2}, 19262306a36Sopenharmony_ci {0x0110, 0xc000}, 19362306a36Sopenharmony_ci {0x0111, 0x04a2}, 19462306a36Sopenharmony_ci {0x0112, 0x2800}, 19562306a36Sopenharmony_ci {0x0113, 0x0000}, 19662306a36Sopenharmony_ci {0x0117, 0x0100}, 19762306a36Sopenharmony_ci {0x0125, 0x0410}, 19862306a36Sopenharmony_ci {0x0132, 0x6026}, 19962306a36Sopenharmony_ci {0x0136, 0x5555}, 20062306a36Sopenharmony_ci {0x0138, 0x3700}, 20162306a36Sopenharmony_ci {0x013a, 0x2000}, 20262306a36Sopenharmony_ci {0x013b, 0x2000}, 20362306a36Sopenharmony_ci {0x013c, 0x2005}, 20462306a36Sopenharmony_ci {0x013f, 0x0000}, 20562306a36Sopenharmony_ci {0x0142, 0x0000}, 20662306a36Sopenharmony_ci {0x0145, 0x0002}, 20762306a36Sopenharmony_ci {0x0146, 0x0000}, 20862306a36Sopenharmony_ci {0x0147, 0x0000}, 20962306a36Sopenharmony_ci {0x0148, 0x0000}, 21062306a36Sopenharmony_ci {0x0149, 0x0000}, 21162306a36Sopenharmony_ci {0x0150, 0x79a1}, 21262306a36Sopenharmony_ci {0x0156, 0xaaaa}, 21362306a36Sopenharmony_ci {0x0160, 0x4ec0}, 21462306a36Sopenharmony_ci {0x0161, 0x0080}, 21562306a36Sopenharmony_ci {0x0162, 0x0200}, 21662306a36Sopenharmony_ci {0x0163, 0x0800}, 21762306a36Sopenharmony_ci {0x0164, 0x0000}, 21862306a36Sopenharmony_ci {0x0165, 0x0000}, 21962306a36Sopenharmony_ci {0x0166, 0x0000}, 22062306a36Sopenharmony_ci {0x0167, 0x000f}, 22162306a36Sopenharmony_ci {0x0168, 0x000f}, 22262306a36Sopenharmony_ci {0x0169, 0x0021}, 22362306a36Sopenharmony_ci {0x0190, 0x413d}, 22462306a36Sopenharmony_ci {0x0194, 0x0000}, 22562306a36Sopenharmony_ci {0x0195, 0x0000}, 22662306a36Sopenharmony_ci {0x0197, 0x0022}, 22762306a36Sopenharmony_ci {0x0198, 0x0000}, 22862306a36Sopenharmony_ci {0x0199, 0x0000}, 22962306a36Sopenharmony_ci {0x01af, 0x0000}, 23062306a36Sopenharmony_ci {0x01b0, 0x0400}, 23162306a36Sopenharmony_ci {0x01b1, 0x0000}, 23262306a36Sopenharmony_ci {0x01b2, 0x0000}, 23362306a36Sopenharmony_ci {0x01b3, 0x0000}, 23462306a36Sopenharmony_ci {0x01b4, 0x0000}, 23562306a36Sopenharmony_ci {0x01b5, 0x0000}, 23662306a36Sopenharmony_ci {0x01b6, 0x01c3}, 23762306a36Sopenharmony_ci {0x01b7, 0x02a0}, 23862306a36Sopenharmony_ci {0x01b8, 0x03e9}, 23962306a36Sopenharmony_ci {0x01b9, 0x1389}, 24062306a36Sopenharmony_ci {0x01ba, 0xc351}, 24162306a36Sopenharmony_ci {0x01bb, 0x0009}, 24262306a36Sopenharmony_ci {0x01bc, 0x0018}, 24362306a36Sopenharmony_ci {0x01bd, 0x002a}, 24462306a36Sopenharmony_ci {0x01be, 0x004c}, 24562306a36Sopenharmony_ci {0x01bf, 0x0097}, 24662306a36Sopenharmony_ci {0x01c0, 0x433d}, 24762306a36Sopenharmony_ci {0x01c2, 0x0000}, 24862306a36Sopenharmony_ci {0x01c3, 0x0000}, 24962306a36Sopenharmony_ci {0x01c4, 0x0000}, 25062306a36Sopenharmony_ci {0x01c5, 0x0000}, 25162306a36Sopenharmony_ci {0x01c6, 0x0000}, 25262306a36Sopenharmony_ci {0x01c7, 0x0000}, 25362306a36Sopenharmony_ci {0x01c8, 0x40af}, 25462306a36Sopenharmony_ci {0x01c9, 0x0702}, 25562306a36Sopenharmony_ci {0x01ca, 0x0000}, 25662306a36Sopenharmony_ci {0x01cb, 0x0000}, 25762306a36Sopenharmony_ci {0x01cc, 0x5757}, 25862306a36Sopenharmony_ci {0x01cd, 0x5757}, 25962306a36Sopenharmony_ci {0x01ce, 0x5757}, 26062306a36Sopenharmony_ci {0x01cf, 0x5757}, 26162306a36Sopenharmony_ci {0x01d0, 0x5757}, 26262306a36Sopenharmony_ci {0x01d1, 0x5757}, 26362306a36Sopenharmony_ci {0x01d2, 0x5757}, 26462306a36Sopenharmony_ci {0x01d3, 0x5757}, 26562306a36Sopenharmony_ci {0x01d4, 0x5757}, 26662306a36Sopenharmony_ci {0x01d5, 0x5757}, 26762306a36Sopenharmony_ci {0x01d6, 0x0000}, 26862306a36Sopenharmony_ci {0x01d7, 0x0008}, 26962306a36Sopenharmony_ci {0x01d8, 0x0029}, 27062306a36Sopenharmony_ci {0x01d9, 0x3333}, 27162306a36Sopenharmony_ci {0x01da, 0x0000}, 27262306a36Sopenharmony_ci {0x01db, 0x0004}, 27362306a36Sopenharmony_ci {0x01dc, 0x0000}, 27462306a36Sopenharmony_ci {0x01de, 0x7c00}, 27562306a36Sopenharmony_ci {0x01df, 0x0320}, 27662306a36Sopenharmony_ci {0x01e0, 0x06a1}, 27762306a36Sopenharmony_ci {0x01e1, 0x0000}, 27862306a36Sopenharmony_ci {0x01e2, 0x0000}, 27962306a36Sopenharmony_ci {0x01e3, 0x0000}, 28062306a36Sopenharmony_ci {0x01e4, 0x0000}, 28162306a36Sopenharmony_ci {0x01e6, 0x0001}, 28262306a36Sopenharmony_ci {0x01e7, 0x0000}, 28362306a36Sopenharmony_ci {0x01e8, 0x0000}, 28462306a36Sopenharmony_ci {0x01ea, 0x0000}, 28562306a36Sopenharmony_ci {0x01eb, 0x0000}, 28662306a36Sopenharmony_ci {0x01ec, 0x0000}, 28762306a36Sopenharmony_ci {0x01ed, 0x0000}, 28862306a36Sopenharmony_ci {0x01ee, 0x0000}, 28962306a36Sopenharmony_ci {0x01ef, 0x0000}, 29062306a36Sopenharmony_ci {0x01f0, 0x0000}, 29162306a36Sopenharmony_ci {0x01f1, 0x0000}, 29262306a36Sopenharmony_ci {0x01f2, 0x0000}, 29362306a36Sopenharmony_ci {0x01f3, 0x0000}, 29462306a36Sopenharmony_ci {0x01f4, 0x0000}, 29562306a36Sopenharmony_ci {0x0210, 0x6297}, 29662306a36Sopenharmony_ci {0x0211, 0xa005}, 29762306a36Sopenharmony_ci {0x0212, 0x824c}, 29862306a36Sopenharmony_ci {0x0213, 0xf7ff}, 29962306a36Sopenharmony_ci {0x0214, 0xf24c}, 30062306a36Sopenharmony_ci {0x0215, 0x0102}, 30162306a36Sopenharmony_ci {0x0216, 0x00a3}, 30262306a36Sopenharmony_ci {0x0217, 0x0048}, 30362306a36Sopenharmony_ci {0x0218, 0xa2c0}, 30462306a36Sopenharmony_ci {0x0219, 0x0400}, 30562306a36Sopenharmony_ci {0x021a, 0x00c8}, 30662306a36Sopenharmony_ci {0x021b, 0x00c0}, 30762306a36Sopenharmony_ci {0x021c, 0x0000}, 30862306a36Sopenharmony_ci {0x0250, 0x4500}, 30962306a36Sopenharmony_ci {0x0251, 0x40b3}, 31062306a36Sopenharmony_ci {0x0252, 0x0000}, 31162306a36Sopenharmony_ci {0x0253, 0x0000}, 31262306a36Sopenharmony_ci {0x0254, 0x0000}, 31362306a36Sopenharmony_ci {0x0255, 0x0000}, 31462306a36Sopenharmony_ci {0x0256, 0x0000}, 31562306a36Sopenharmony_ci {0x0257, 0x0000}, 31662306a36Sopenharmony_ci {0x0258, 0x0000}, 31762306a36Sopenharmony_ci {0x0259, 0x0000}, 31862306a36Sopenharmony_ci {0x025a, 0x0005}, 31962306a36Sopenharmony_ci {0x0270, 0x0000}, 32062306a36Sopenharmony_ci {0x02ff, 0x0110}, 32162306a36Sopenharmony_ci {0x0300, 0x001f}, 32262306a36Sopenharmony_ci {0x0301, 0x032c}, 32362306a36Sopenharmony_ci {0x0302, 0x5f21}, 32462306a36Sopenharmony_ci {0x0303, 0x4000}, 32562306a36Sopenharmony_ci {0x0304, 0x4000}, 32662306a36Sopenharmony_ci {0x0305, 0x06d5}, 32762306a36Sopenharmony_ci {0x0306, 0x8000}, 32862306a36Sopenharmony_ci {0x0307, 0x0700}, 32962306a36Sopenharmony_ci {0x0310, 0x4560}, 33062306a36Sopenharmony_ci {0x0311, 0xa4a8}, 33162306a36Sopenharmony_ci {0x0312, 0x7418}, 33262306a36Sopenharmony_ci {0x0313, 0x0000}, 33362306a36Sopenharmony_ci {0x0314, 0x0006}, 33462306a36Sopenharmony_ci {0x0315, 0xffff}, 33562306a36Sopenharmony_ci {0x0316, 0xc400}, 33662306a36Sopenharmony_ci {0x0317, 0x0000}, 33762306a36Sopenharmony_ci {0x03c0, 0x7e00}, 33862306a36Sopenharmony_ci {0x03c1, 0x8000}, 33962306a36Sopenharmony_ci {0x03c2, 0x8000}, 34062306a36Sopenharmony_ci {0x03c3, 0x8000}, 34162306a36Sopenharmony_ci {0x03c4, 0x8000}, 34262306a36Sopenharmony_ci {0x03c5, 0x8000}, 34362306a36Sopenharmony_ci {0x03c6, 0x8000}, 34462306a36Sopenharmony_ci {0x03c7, 0x8000}, 34562306a36Sopenharmony_ci {0x03c8, 0x8000}, 34662306a36Sopenharmony_ci {0x03c9, 0x8000}, 34762306a36Sopenharmony_ci {0x03ca, 0x8000}, 34862306a36Sopenharmony_ci {0x03cb, 0x8000}, 34962306a36Sopenharmony_ci {0x03cc, 0x8000}, 35062306a36Sopenharmony_ci {0x03d0, 0x0000}, 35162306a36Sopenharmony_ci {0x03d1, 0x0000}, 35262306a36Sopenharmony_ci {0x03d2, 0x0000}, 35362306a36Sopenharmony_ci {0x03d3, 0x0000}, 35462306a36Sopenharmony_ci {0x03d4, 0x2000}, 35562306a36Sopenharmony_ci {0x03d5, 0x2000}, 35662306a36Sopenharmony_ci {0x03d6, 0x0000}, 35762306a36Sopenharmony_ci {0x03d7, 0x0000}, 35862306a36Sopenharmony_ci {0x03d8, 0x2000}, 35962306a36Sopenharmony_ci {0x03d9, 0x2000}, 36062306a36Sopenharmony_ci {0x03da, 0x2000}, 36162306a36Sopenharmony_ci {0x03db, 0x2000}, 36262306a36Sopenharmony_ci {0x03dc, 0x0000}, 36362306a36Sopenharmony_ci {0x03dd, 0x0000}, 36462306a36Sopenharmony_ci {0x03de, 0x0000}, 36562306a36Sopenharmony_ci {0x03df, 0x2000}, 36662306a36Sopenharmony_ci {0x03e0, 0x0000}, 36762306a36Sopenharmony_ci {0x03e1, 0x0000}, 36862306a36Sopenharmony_ci {0x03e2, 0x0000}, 36962306a36Sopenharmony_ci {0x03e3, 0x0000}, 37062306a36Sopenharmony_ci {0x03e4, 0x0000}, 37162306a36Sopenharmony_ci {0x03e5, 0x0000}, 37262306a36Sopenharmony_ci {0x03e6, 0x0000}, 37362306a36Sopenharmony_ci {0x03e7, 0x0000}, 37462306a36Sopenharmony_ci {0x03e8, 0x0000}, 37562306a36Sopenharmony_ci {0x03e9, 0x0000}, 37662306a36Sopenharmony_ci {0x03ea, 0x0000}, 37762306a36Sopenharmony_ci {0x03eb, 0x0000}, 37862306a36Sopenharmony_ci {0x03ec, 0x0000}, 37962306a36Sopenharmony_ci {0x03ed, 0x0000}, 38062306a36Sopenharmony_ci {0x03ee, 0x0000}, 38162306a36Sopenharmony_ci {0x03ef, 0x0000}, 38262306a36Sopenharmony_ci {0x03f0, 0x0800}, 38362306a36Sopenharmony_ci {0x03f1, 0x0800}, 38462306a36Sopenharmony_ci {0x03f2, 0x0800}, 38562306a36Sopenharmony_ci {0x03f3, 0x0800}, 38662306a36Sopenharmony_ci}; 38762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_reg); 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_cibool rt5682_volatile_register(struct device *dev, unsigned int reg) 39062306a36Sopenharmony_ci{ 39162306a36Sopenharmony_ci switch (reg) { 39262306a36Sopenharmony_ci case RT5682_RESET: 39362306a36Sopenharmony_ci case RT5682_CBJ_CTRL_2: 39462306a36Sopenharmony_ci case RT5682_INT_ST_1: 39562306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_1: 39662306a36Sopenharmony_ci case RT5682_AJD1_CTRL: 39762306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_1: 39862306a36Sopenharmony_ci case RT5682_DEVICE_ID: 39962306a36Sopenharmony_ci case RT5682_I2C_MODE: 40062306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_10: 40162306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_2: 40262306a36Sopenharmony_ci case RT5682_JD_TOP_VC_VTRL: 40362306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_19: 40462306a36Sopenharmony_ci case RT5682_IL_CMD_1: 40562306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_2: 40662306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_4: 40762306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_10: 40862306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_11: 40962306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_6...RT5682_EFUSE_CTRL_11: 41062306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_1...RT5682_HP_CALIB_STA_11: 41162306a36Sopenharmony_ci return true; 41262306a36Sopenharmony_ci default: 41362306a36Sopenharmony_ci return false; 41462306a36Sopenharmony_ci } 41562306a36Sopenharmony_ci} 41662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_volatile_register); 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_cibool rt5682_readable_register(struct device *dev, unsigned int reg) 41962306a36Sopenharmony_ci{ 42062306a36Sopenharmony_ci switch (reg) { 42162306a36Sopenharmony_ci case RT5682_RESET: 42262306a36Sopenharmony_ci case RT5682_VERSION_ID: 42362306a36Sopenharmony_ci case RT5682_VENDOR_ID: 42462306a36Sopenharmony_ci case RT5682_DEVICE_ID: 42562306a36Sopenharmony_ci case RT5682_HP_CTRL_1: 42662306a36Sopenharmony_ci case RT5682_HP_CTRL_2: 42762306a36Sopenharmony_ci case RT5682_HPL_GAIN: 42862306a36Sopenharmony_ci case RT5682_HPR_GAIN: 42962306a36Sopenharmony_ci case RT5682_I2C_CTRL: 43062306a36Sopenharmony_ci case RT5682_CBJ_BST_CTRL: 43162306a36Sopenharmony_ci case RT5682_CBJ_CTRL_1: 43262306a36Sopenharmony_ci case RT5682_CBJ_CTRL_2: 43362306a36Sopenharmony_ci case RT5682_CBJ_CTRL_3: 43462306a36Sopenharmony_ci case RT5682_CBJ_CTRL_4: 43562306a36Sopenharmony_ci case RT5682_CBJ_CTRL_5: 43662306a36Sopenharmony_ci case RT5682_CBJ_CTRL_6: 43762306a36Sopenharmony_ci case RT5682_CBJ_CTRL_7: 43862306a36Sopenharmony_ci case RT5682_DAC1_DIG_VOL: 43962306a36Sopenharmony_ci case RT5682_STO1_ADC_DIG_VOL: 44062306a36Sopenharmony_ci case RT5682_STO1_ADC_BOOST: 44162306a36Sopenharmony_ci case RT5682_HP_IMP_GAIN_1: 44262306a36Sopenharmony_ci case RT5682_HP_IMP_GAIN_2: 44362306a36Sopenharmony_ci case RT5682_SIDETONE_CTRL: 44462306a36Sopenharmony_ci case RT5682_STO1_ADC_MIXER: 44562306a36Sopenharmony_ci case RT5682_AD_DA_MIXER: 44662306a36Sopenharmony_ci case RT5682_STO1_DAC_MIXER: 44762306a36Sopenharmony_ci case RT5682_A_DAC1_MUX: 44862306a36Sopenharmony_ci case RT5682_DIG_INF2_DATA: 44962306a36Sopenharmony_ci case RT5682_REC_MIXER: 45062306a36Sopenharmony_ci case RT5682_CAL_REC: 45162306a36Sopenharmony_ci case RT5682_ALC_BACK_GAIN: 45262306a36Sopenharmony_ci case RT5682_PWR_DIG_1: 45362306a36Sopenharmony_ci case RT5682_PWR_DIG_2: 45462306a36Sopenharmony_ci case RT5682_PWR_ANLG_1: 45562306a36Sopenharmony_ci case RT5682_PWR_ANLG_2: 45662306a36Sopenharmony_ci case RT5682_PWR_ANLG_3: 45762306a36Sopenharmony_ci case RT5682_PWR_MIXER: 45862306a36Sopenharmony_ci case RT5682_PWR_VOL: 45962306a36Sopenharmony_ci case RT5682_CLK_DET: 46062306a36Sopenharmony_ci case RT5682_RESET_LPF_CTRL: 46162306a36Sopenharmony_ci case RT5682_RESET_HPF_CTRL: 46262306a36Sopenharmony_ci case RT5682_DMIC_CTRL_1: 46362306a36Sopenharmony_ci case RT5682_I2S1_SDP: 46462306a36Sopenharmony_ci case RT5682_I2S2_SDP: 46562306a36Sopenharmony_ci case RT5682_ADDA_CLK_1: 46662306a36Sopenharmony_ci case RT5682_ADDA_CLK_2: 46762306a36Sopenharmony_ci case RT5682_I2S1_F_DIV_CTRL_1: 46862306a36Sopenharmony_ci case RT5682_I2S1_F_DIV_CTRL_2: 46962306a36Sopenharmony_ci case RT5682_TDM_CTRL: 47062306a36Sopenharmony_ci case RT5682_TDM_ADDA_CTRL_1: 47162306a36Sopenharmony_ci case RT5682_TDM_ADDA_CTRL_2: 47262306a36Sopenharmony_ci case RT5682_DATA_SEL_CTRL_1: 47362306a36Sopenharmony_ci case RT5682_TDM_TCON_CTRL: 47462306a36Sopenharmony_ci case RT5682_GLB_CLK: 47562306a36Sopenharmony_ci case RT5682_PLL_CTRL_1: 47662306a36Sopenharmony_ci case RT5682_PLL_CTRL_2: 47762306a36Sopenharmony_ci case RT5682_PLL_TRACK_1: 47862306a36Sopenharmony_ci case RT5682_PLL_TRACK_2: 47962306a36Sopenharmony_ci case RT5682_PLL_TRACK_3: 48062306a36Sopenharmony_ci case RT5682_PLL_TRACK_4: 48162306a36Sopenharmony_ci case RT5682_PLL_TRACK_5: 48262306a36Sopenharmony_ci case RT5682_PLL_TRACK_6: 48362306a36Sopenharmony_ci case RT5682_PLL_TRACK_11: 48462306a36Sopenharmony_ci case RT5682_SDW_REF_CLK: 48562306a36Sopenharmony_ci case RT5682_DEPOP_1: 48662306a36Sopenharmony_ci case RT5682_DEPOP_2: 48762306a36Sopenharmony_ci case RT5682_HP_CHARGE_PUMP_1: 48862306a36Sopenharmony_ci case RT5682_HP_CHARGE_PUMP_2: 48962306a36Sopenharmony_ci case RT5682_MICBIAS_1: 49062306a36Sopenharmony_ci case RT5682_MICBIAS_2: 49162306a36Sopenharmony_ci case RT5682_PLL_TRACK_12: 49262306a36Sopenharmony_ci case RT5682_PLL_TRACK_14: 49362306a36Sopenharmony_ci case RT5682_PLL2_CTRL_1: 49462306a36Sopenharmony_ci case RT5682_PLL2_CTRL_2: 49562306a36Sopenharmony_ci case RT5682_PLL2_CTRL_3: 49662306a36Sopenharmony_ci case RT5682_PLL2_CTRL_4: 49762306a36Sopenharmony_ci case RT5682_RC_CLK_CTRL: 49862306a36Sopenharmony_ci case RT5682_I2S_M_CLK_CTRL_1: 49962306a36Sopenharmony_ci case RT5682_I2S2_F_DIV_CTRL_1: 50062306a36Sopenharmony_ci case RT5682_I2S2_F_DIV_CTRL_2: 50162306a36Sopenharmony_ci case RT5682_EQ_CTRL_1: 50262306a36Sopenharmony_ci case RT5682_EQ_CTRL_2: 50362306a36Sopenharmony_ci case RT5682_IRQ_CTRL_1: 50462306a36Sopenharmony_ci case RT5682_IRQ_CTRL_2: 50562306a36Sopenharmony_ci case RT5682_IRQ_CTRL_3: 50662306a36Sopenharmony_ci case RT5682_IRQ_CTRL_4: 50762306a36Sopenharmony_ci case RT5682_INT_ST_1: 50862306a36Sopenharmony_ci case RT5682_GPIO_CTRL_1: 50962306a36Sopenharmony_ci case RT5682_GPIO_CTRL_2: 51062306a36Sopenharmony_ci case RT5682_GPIO_CTRL_3: 51162306a36Sopenharmony_ci case RT5682_HP_AMP_DET_CTRL_1: 51262306a36Sopenharmony_ci case RT5682_HP_AMP_DET_CTRL_2: 51362306a36Sopenharmony_ci case RT5682_MID_HP_AMP_DET: 51462306a36Sopenharmony_ci case RT5682_LOW_HP_AMP_DET: 51562306a36Sopenharmony_ci case RT5682_DELAY_BUF_CTRL: 51662306a36Sopenharmony_ci case RT5682_SV_ZCD_1: 51762306a36Sopenharmony_ci case RT5682_SV_ZCD_2: 51862306a36Sopenharmony_ci case RT5682_IL_CMD_1: 51962306a36Sopenharmony_ci case RT5682_IL_CMD_2: 52062306a36Sopenharmony_ci case RT5682_IL_CMD_3: 52162306a36Sopenharmony_ci case RT5682_IL_CMD_4: 52262306a36Sopenharmony_ci case RT5682_IL_CMD_5: 52362306a36Sopenharmony_ci case RT5682_IL_CMD_6: 52462306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_1: 52562306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_2: 52662306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_3: 52762306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_4: 52862306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_5: 52962306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_6: 53062306a36Sopenharmony_ci case RT5682_4BTN_IL_CMD_7: 53162306a36Sopenharmony_ci case RT5682_ADC_STO1_HP_CTRL_1: 53262306a36Sopenharmony_ci case RT5682_ADC_STO1_HP_CTRL_2: 53362306a36Sopenharmony_ci case RT5682_AJD1_CTRL: 53462306a36Sopenharmony_ci case RT5682_JD1_THD: 53562306a36Sopenharmony_ci case RT5682_JD2_THD: 53662306a36Sopenharmony_ci case RT5682_JD_CTRL_1: 53762306a36Sopenharmony_ci case RT5682_DUMMY_1: 53862306a36Sopenharmony_ci case RT5682_DUMMY_2: 53962306a36Sopenharmony_ci case RT5682_DUMMY_3: 54062306a36Sopenharmony_ci case RT5682_DAC_ADC_DIG_VOL1: 54162306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_2: 54262306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_3: 54362306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_4: 54462306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_5: 54562306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_6: 54662306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_7: 54762306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_8: 54862306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_9: 54962306a36Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_10: 55062306a36Sopenharmony_ci case RT5682_VREF_REC_OP_FB_CAP_CTRL: 55162306a36Sopenharmony_ci case RT5682_CHARGE_PUMP_1: 55262306a36Sopenharmony_ci case RT5682_DIG_IN_CTRL_1: 55362306a36Sopenharmony_ci case RT5682_PAD_DRIVING_CTRL: 55462306a36Sopenharmony_ci case RT5682_SOFT_RAMP_DEPOP: 55562306a36Sopenharmony_ci case RT5682_CHOP_DAC: 55662306a36Sopenharmony_ci case RT5682_CHOP_ADC: 55762306a36Sopenharmony_ci case RT5682_CALIB_ADC_CTRL: 55862306a36Sopenharmony_ci case RT5682_VOL_TEST: 55962306a36Sopenharmony_ci case RT5682_SPKVDD_DET_STA: 56062306a36Sopenharmony_ci case RT5682_TEST_MODE_CTRL_1: 56162306a36Sopenharmony_ci case RT5682_TEST_MODE_CTRL_2: 56262306a36Sopenharmony_ci case RT5682_TEST_MODE_CTRL_3: 56362306a36Sopenharmony_ci case RT5682_TEST_MODE_CTRL_4: 56462306a36Sopenharmony_ci case RT5682_TEST_MODE_CTRL_5: 56562306a36Sopenharmony_ci case RT5682_PLL1_INTERNAL: 56662306a36Sopenharmony_ci case RT5682_PLL2_INTERNAL: 56762306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_1: 56862306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_2: 56962306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_3: 57062306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_4: 57162306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_5: 57262306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_6: 57362306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_7: 57462306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_8: 57562306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_9: 57662306a36Sopenharmony_ci case RT5682_STO_NG2_CTRL_10: 57762306a36Sopenharmony_ci case RT5682_STO1_DAC_SIL_DET: 57862306a36Sopenharmony_ci case RT5682_SIL_PSV_CTRL1: 57962306a36Sopenharmony_ci case RT5682_SIL_PSV_CTRL2: 58062306a36Sopenharmony_ci case RT5682_SIL_PSV_CTRL3: 58162306a36Sopenharmony_ci case RT5682_SIL_PSV_CTRL4: 58262306a36Sopenharmony_ci case RT5682_SIL_PSV_CTRL5: 58362306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_01: 58462306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_02: 58562306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_03: 58662306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_04: 58762306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_05: 58862306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_06: 58962306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_07: 59062306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_08: 59162306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_09: 59262306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_10: 59362306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_11: 59462306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_12: 59562306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_13: 59662306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_14: 59762306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_15: 59862306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_16: 59962306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_17: 60062306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_18: 60162306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_19: 60262306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_20: 60362306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_21: 60462306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_22: 60562306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_23: 60662306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_24: 60762306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_25: 60862306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_26: 60962306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_27: 61062306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_28: 61162306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_29: 61262306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_30: 61362306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_31: 61462306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_32: 61562306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_33: 61662306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_34: 61762306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_35: 61862306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_36: 61962306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_37: 62062306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_38: 62162306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_39: 62262306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_40: 62362306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_41: 62462306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_42: 62562306a36Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_43: 62662306a36Sopenharmony_ci case RT5682_HP_LOGIC_CTRL_1: 62762306a36Sopenharmony_ci case RT5682_HP_LOGIC_CTRL_2: 62862306a36Sopenharmony_ci case RT5682_HP_LOGIC_CTRL_3: 62962306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_1: 63062306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_2: 63162306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_3: 63262306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_4: 63362306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_5: 63462306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_6: 63562306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_7: 63662306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_9: 63762306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_10: 63862306a36Sopenharmony_ci case RT5682_HP_CALIB_CTRL_11: 63962306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_1: 64062306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_2: 64162306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_3: 64262306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_4: 64362306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_5: 64462306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_6: 64562306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_7: 64662306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_8: 64762306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_9: 64862306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_10: 64962306a36Sopenharmony_ci case RT5682_HP_CALIB_STA_11: 65062306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_1: 65162306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_2: 65262306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_3: 65362306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_4: 65462306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_5: 65562306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_6: 65662306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_7: 65762306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_8: 65862306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_9: 65962306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_10: 66062306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_11: 66162306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_12: 66262306a36Sopenharmony_ci case RT5682_SAR_IL_CMD_13: 66362306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_1: 66462306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_2: 66562306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_3: 66662306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_4: 66762306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_5: 66862306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_6: 66962306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_7: 67062306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_8: 67162306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_9: 67262306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_10: 67362306a36Sopenharmony_ci case RT5682_EFUSE_CTRL_11: 67462306a36Sopenharmony_ci case RT5682_JD_TOP_VC_VTRL: 67562306a36Sopenharmony_ci case RT5682_DRC1_CTRL_0: 67662306a36Sopenharmony_ci case RT5682_DRC1_CTRL_1: 67762306a36Sopenharmony_ci case RT5682_DRC1_CTRL_2: 67862306a36Sopenharmony_ci case RT5682_DRC1_CTRL_3: 67962306a36Sopenharmony_ci case RT5682_DRC1_CTRL_4: 68062306a36Sopenharmony_ci case RT5682_DRC1_CTRL_5: 68162306a36Sopenharmony_ci case RT5682_DRC1_CTRL_6: 68262306a36Sopenharmony_ci case RT5682_DRC1_HARD_LMT_CTRL_1: 68362306a36Sopenharmony_ci case RT5682_DRC1_HARD_LMT_CTRL_2: 68462306a36Sopenharmony_ci case RT5682_DRC1_PRIV_1: 68562306a36Sopenharmony_ci case RT5682_DRC1_PRIV_2: 68662306a36Sopenharmony_ci case RT5682_DRC1_PRIV_3: 68762306a36Sopenharmony_ci case RT5682_DRC1_PRIV_4: 68862306a36Sopenharmony_ci case RT5682_DRC1_PRIV_5: 68962306a36Sopenharmony_ci case RT5682_DRC1_PRIV_6: 69062306a36Sopenharmony_ci case RT5682_DRC1_PRIV_7: 69162306a36Sopenharmony_ci case RT5682_DRC1_PRIV_8: 69262306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL1: 69362306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL2: 69462306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL3: 69562306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL4: 69662306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL5: 69762306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL6: 69862306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL7: 69962306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL8: 70062306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL9: 70162306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL10: 70262306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL11: 70362306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL12: 70462306a36Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL13: 70562306a36Sopenharmony_ci case RT5682_ADC_L_EQ_LPF1_A1: 70662306a36Sopenharmony_ci case RT5682_R_EQ_LPF1_A1: 70762306a36Sopenharmony_ci case RT5682_L_EQ_LPF1_H0: 70862306a36Sopenharmony_ci case RT5682_R_EQ_LPF1_H0: 70962306a36Sopenharmony_ci case RT5682_L_EQ_BPF1_A1: 71062306a36Sopenharmony_ci case RT5682_R_EQ_BPF1_A1: 71162306a36Sopenharmony_ci case RT5682_L_EQ_BPF1_A2: 71262306a36Sopenharmony_ci case RT5682_R_EQ_BPF1_A2: 71362306a36Sopenharmony_ci case RT5682_L_EQ_BPF1_H0: 71462306a36Sopenharmony_ci case RT5682_R_EQ_BPF1_H0: 71562306a36Sopenharmony_ci case RT5682_L_EQ_BPF2_A1: 71662306a36Sopenharmony_ci case RT5682_R_EQ_BPF2_A1: 71762306a36Sopenharmony_ci case RT5682_L_EQ_BPF2_A2: 71862306a36Sopenharmony_ci case RT5682_R_EQ_BPF2_A2: 71962306a36Sopenharmony_ci case RT5682_L_EQ_BPF2_H0: 72062306a36Sopenharmony_ci case RT5682_R_EQ_BPF2_H0: 72162306a36Sopenharmony_ci case RT5682_L_EQ_BPF3_A1: 72262306a36Sopenharmony_ci case RT5682_R_EQ_BPF3_A1: 72362306a36Sopenharmony_ci case RT5682_L_EQ_BPF3_A2: 72462306a36Sopenharmony_ci case RT5682_R_EQ_BPF3_A2: 72562306a36Sopenharmony_ci case RT5682_L_EQ_BPF3_H0: 72662306a36Sopenharmony_ci case RT5682_R_EQ_BPF3_H0: 72762306a36Sopenharmony_ci case RT5682_L_EQ_BPF4_A1: 72862306a36Sopenharmony_ci case RT5682_R_EQ_BPF4_A1: 72962306a36Sopenharmony_ci case RT5682_L_EQ_BPF4_A2: 73062306a36Sopenharmony_ci case RT5682_R_EQ_BPF4_A2: 73162306a36Sopenharmony_ci case RT5682_L_EQ_BPF4_H0: 73262306a36Sopenharmony_ci case RT5682_R_EQ_BPF4_H0: 73362306a36Sopenharmony_ci case RT5682_L_EQ_HPF1_A1: 73462306a36Sopenharmony_ci case RT5682_R_EQ_HPF1_A1: 73562306a36Sopenharmony_ci case RT5682_L_EQ_HPF1_H0: 73662306a36Sopenharmony_ci case RT5682_R_EQ_HPF1_H0: 73762306a36Sopenharmony_ci case RT5682_L_EQ_PRE_VOL: 73862306a36Sopenharmony_ci case RT5682_R_EQ_PRE_VOL: 73962306a36Sopenharmony_ci case RT5682_L_EQ_POST_VOL: 74062306a36Sopenharmony_ci case RT5682_R_EQ_POST_VOL: 74162306a36Sopenharmony_ci case RT5682_I2C_MODE: 74262306a36Sopenharmony_ci return true; 74362306a36Sopenharmony_ci default: 74462306a36Sopenharmony_ci return false; 74562306a36Sopenharmony_ci } 74662306a36Sopenharmony_ci} 74762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_readable_register); 74862306a36Sopenharmony_ci 74962306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0); 75062306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0); 75162306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ 75462306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(bst_tlv, 75562306a36Sopenharmony_ci 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0), 75662306a36Sopenharmony_ci 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0), 75762306a36Sopenharmony_ci 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0), 75862306a36Sopenharmony_ci 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0), 75962306a36Sopenharmony_ci 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0), 76062306a36Sopenharmony_ci 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0), 76162306a36Sopenharmony_ci 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0) 76262306a36Sopenharmony_ci); 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci/* Interface data select */ 76562306a36Sopenharmony_cistatic const char * const rt5682_data_select[] = { 76662306a36Sopenharmony_ci "L/R", "R/L", "L/L", "R/R" 76762306a36Sopenharmony_ci}; 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if2_adc_enum, 77062306a36Sopenharmony_ci RT5682_DIG_INF2_DATA, RT5682_IF2_ADC_SEL_SFT, rt5682_data_select); 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_01_adc_enum, 77362306a36Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC1_SEL_SFT, rt5682_data_select); 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_23_adc_enum, 77662306a36Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC2_SEL_SFT, rt5682_data_select); 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_45_adc_enum, 77962306a36Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC3_SEL_SFT, rt5682_data_select); 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_67_adc_enum, 78262306a36Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC4_SEL_SFT, rt5682_data_select); 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if2_adc_swap_mux = 78562306a36Sopenharmony_ci SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682_if2_adc_enum); 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_01_adc_swap_mux = 78862306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", rt5682_if1_01_adc_enum); 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_23_adc_swap_mux = 79162306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", rt5682_if1_23_adc_enum); 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_45_adc_swap_mux = 79462306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", rt5682_if1_45_adc_enum); 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_67_adc_swap_mux = 79762306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", rt5682_if1_67_adc_enum); 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_cistatic const char * const rt5682_dac_select[] = { 80062306a36Sopenharmony_ci "IF1", "SOUND" 80162306a36Sopenharmony_ci}; 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_dacl_enum, 80462306a36Sopenharmony_ci RT5682_AD_DA_MIXER, RT5682_DAC1_L_SEL_SFT, rt5682_dac_select); 80562306a36Sopenharmony_ci 80662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_l_mux = 80762306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC L Mux", rt5682_dacl_enum); 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_dacr_enum, 81062306a36Sopenharmony_ci RT5682_AD_DA_MIXER, RT5682_DAC1_R_SEL_SFT, rt5682_dac_select); 81162306a36Sopenharmony_ci 81262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_r_mux = 81362306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC R Mux", rt5682_dacr_enum); 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_civoid rt5682_reset(struct rt5682_priv *rt5682) 81662306a36Sopenharmony_ci{ 81762306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_RESET, 0); 81862306a36Sopenharmony_ci if (!rt5682->is_sdw) 81962306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_I2C_MODE, 1); 82062306a36Sopenharmony_ci} 82162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_reset); 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci/** 82462306a36Sopenharmony_ci * rt5682_sel_asrc_clk_src - select ASRC clock source for a set of filters 82562306a36Sopenharmony_ci * @component: SoC audio component device. 82662306a36Sopenharmony_ci * @filter_mask: mask of filters. 82762306a36Sopenharmony_ci * @clk_src: clock source 82862306a36Sopenharmony_ci * 82962306a36Sopenharmony_ci * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5682 can 83062306a36Sopenharmony_ci * only support standard 32fs or 64fs i2s format, ASRC should be enabled to 83162306a36Sopenharmony_ci * support special i2s clock format such as Intel's 100fs(100 * sampling rate). 83262306a36Sopenharmony_ci * ASRC function will track i2s clock and generate a corresponding system clock 83362306a36Sopenharmony_ci * for codec. This function provides an API to select the clock source for a 83462306a36Sopenharmony_ci * set of filters specified by the mask. And the component driver will turn on 83562306a36Sopenharmony_ci * ASRC for these filters if ASRC is selected as their clock source. 83662306a36Sopenharmony_ci */ 83762306a36Sopenharmony_ciint rt5682_sel_asrc_clk_src(struct snd_soc_component *component, 83862306a36Sopenharmony_ci unsigned int filter_mask, unsigned int clk_src) 83962306a36Sopenharmony_ci{ 84062306a36Sopenharmony_ci switch (clk_src) { 84162306a36Sopenharmony_ci case RT5682_CLK_SEL_SYS: 84262306a36Sopenharmony_ci case RT5682_CLK_SEL_I2S1_ASRC: 84362306a36Sopenharmony_ci case RT5682_CLK_SEL_I2S2_ASRC: 84462306a36Sopenharmony_ci break; 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci default: 84762306a36Sopenharmony_ci return -EINVAL; 84862306a36Sopenharmony_ci } 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci if (filter_mask & RT5682_DA_STEREO1_FILTER) { 85162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PLL_TRACK_2, 85262306a36Sopenharmony_ci RT5682_FILTER_CLK_SEL_MASK, 85362306a36Sopenharmony_ci clk_src << RT5682_FILTER_CLK_SEL_SFT); 85462306a36Sopenharmony_ci } 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci if (filter_mask & RT5682_AD_STEREO1_FILTER) { 85762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PLL_TRACK_3, 85862306a36Sopenharmony_ci RT5682_FILTER_CLK_SEL_MASK, 85962306a36Sopenharmony_ci clk_src << RT5682_FILTER_CLK_SEL_SFT); 86062306a36Sopenharmony_ci } 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci return 0; 86362306a36Sopenharmony_ci} 86462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_sel_asrc_clk_src); 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_cistatic int rt5682_button_detect(struct snd_soc_component *component) 86762306a36Sopenharmony_ci{ 86862306a36Sopenharmony_ci int btn_type, val; 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5682_4BTN_IL_CMD_1); 87162306a36Sopenharmony_ci btn_type = val & 0xfff0; 87262306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_4BTN_IL_CMD_1, val); 87362306a36Sopenharmony_ci dev_dbg(component->dev, "%s btn_type=%x\n", __func__, btn_type); 87462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 87562306a36Sopenharmony_ci RT5682_SAR_IL_CMD_2, 0x10, 0x10); 87662306a36Sopenharmony_ci 87762306a36Sopenharmony_ci return btn_type; 87862306a36Sopenharmony_ci} 87962306a36Sopenharmony_ci 88062306a36Sopenharmony_cistatic void rt5682_enable_push_button_irq(struct snd_soc_component *component, 88162306a36Sopenharmony_ci bool enable) 88262306a36Sopenharmony_ci{ 88362306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci if (enable) { 88662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 88762306a36Sopenharmony_ci RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_EN); 88862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13, 88962306a36Sopenharmony_ci RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_BTN); 89062306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_IL_CMD_1, 0x0040); 89162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2, 89262306a36Sopenharmony_ci RT5682_4BTN_IL_MASK | RT5682_4BTN_IL_RST_MASK, 89362306a36Sopenharmony_ci RT5682_4BTN_IL_EN | RT5682_4BTN_IL_NOR); 89462306a36Sopenharmony_ci if (rt5682->is_sdw) 89562306a36Sopenharmony_ci snd_soc_component_update_bits(component, 89662306a36Sopenharmony_ci RT5682_IRQ_CTRL_3, 89762306a36Sopenharmony_ci RT5682_IL_IRQ_MASK | RT5682_IL_IRQ_TYPE_MASK, 89862306a36Sopenharmony_ci RT5682_IL_IRQ_EN | RT5682_IL_IRQ_PUL); 89962306a36Sopenharmony_ci else 90062306a36Sopenharmony_ci snd_soc_component_update_bits(component, 90162306a36Sopenharmony_ci RT5682_IRQ_CTRL_3, RT5682_IL_IRQ_MASK, 90262306a36Sopenharmony_ci RT5682_IL_IRQ_EN); 90362306a36Sopenharmony_ci } else { 90462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_IRQ_CTRL_3, 90562306a36Sopenharmony_ci RT5682_IL_IRQ_MASK, RT5682_IL_IRQ_DIS); 90662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 90762306a36Sopenharmony_ci RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_DIS); 90862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2, 90962306a36Sopenharmony_ci RT5682_4BTN_IL_MASK, RT5682_4BTN_IL_DIS); 91062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2, 91162306a36Sopenharmony_ci RT5682_4BTN_IL_RST_MASK, RT5682_4BTN_IL_RST); 91262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13, 91362306a36Sopenharmony_ci RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_TYPE); 91462306a36Sopenharmony_ci } 91562306a36Sopenharmony_ci} 91662306a36Sopenharmony_ci 91762306a36Sopenharmony_ci/** 91862306a36Sopenharmony_ci * rt5682_headset_detect - Detect headset. 91962306a36Sopenharmony_ci * @component: SoC audio component device. 92062306a36Sopenharmony_ci * @jack_insert: Jack insert or not. 92162306a36Sopenharmony_ci * 92262306a36Sopenharmony_ci * Detect whether is headset or not when jack inserted. 92362306a36Sopenharmony_ci * 92462306a36Sopenharmony_ci * Returns detect status. 92562306a36Sopenharmony_ci */ 92662306a36Sopenharmony_cistatic int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert) 92762306a36Sopenharmony_ci{ 92862306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 92962306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = &component->dapm; 93062306a36Sopenharmony_ci unsigned int val, count; 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ci if (jack_insert) { 93362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 93462306a36Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB, 93562306a36Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB); 93662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 93762306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0); 93862306a36Sopenharmony_ci usleep_range(15000, 20000); 93962306a36Sopenharmony_ci snd_soc_component_update_bits(component, 94062306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2); 94162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3, 94262306a36Sopenharmony_ci RT5682_PWR_CBJ, RT5682_PWR_CBJ); 94362306a36Sopenharmony_ci snd_soc_component_update_bits(component, 94462306a36Sopenharmony_ci RT5682_HP_CHARGE_PUMP_1, 94562306a36Sopenharmony_ci RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0); 94662306a36Sopenharmony_ci rt5682_enable_push_button_irq(component, false); 94762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 94862306a36Sopenharmony_ci RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW); 94962306a36Sopenharmony_ci usleep_range(55000, 60000); 95062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 95162306a36Sopenharmony_ci RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH); 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci count = 0; 95462306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5682_CBJ_CTRL_2) 95562306a36Sopenharmony_ci & RT5682_JACK_TYPE_MASK; 95662306a36Sopenharmony_ci while (val == 0 && count < 50) { 95762306a36Sopenharmony_ci usleep_range(10000, 15000); 95862306a36Sopenharmony_ci val = snd_soc_component_read(component, 95962306a36Sopenharmony_ci RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK; 96062306a36Sopenharmony_ci count++; 96162306a36Sopenharmony_ci } 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci switch (val) { 96462306a36Sopenharmony_ci case 0x1: 96562306a36Sopenharmony_ci case 0x2: 96662306a36Sopenharmony_ci rt5682->jack_type = SND_JACK_HEADSET; 96762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 96862306a36Sopenharmony_ci RT5682_FAST_OFF_MASK, RT5682_FAST_OFF_EN); 96962306a36Sopenharmony_ci rt5682_enable_push_button_irq(component, true); 97062306a36Sopenharmony_ci break; 97162306a36Sopenharmony_ci default: 97262306a36Sopenharmony_ci rt5682->jack_type = SND_JACK_HEADPHONE; 97362306a36Sopenharmony_ci break; 97462306a36Sopenharmony_ci } 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 97762306a36Sopenharmony_ci RT5682_HP_CHARGE_PUMP_1, 97862306a36Sopenharmony_ci RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 97962306a36Sopenharmony_ci RT5682_OSW_L_EN | RT5682_OSW_R_EN); 98062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_MICBIAS_2, 98162306a36Sopenharmony_ci RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK, 98262306a36Sopenharmony_ci RT5682_PWR_CLK25M_PU | RT5682_PWR_CLK1M_PU); 98362306a36Sopenharmony_ci } else { 98462306a36Sopenharmony_ci rt5682_enable_push_button_irq(component, false); 98562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 98662306a36Sopenharmony_ci RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW); 98762306a36Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(dapm, "MICBIAS") && 98862306a36Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL1") && 98962306a36Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL2B")) 99062306a36Sopenharmony_ci snd_soc_component_update_bits(component, 99162306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0); 99262306a36Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(dapm, "Vref2") && 99362306a36Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL1") && 99462306a36Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL2B")) 99562306a36Sopenharmony_ci snd_soc_component_update_bits(component, 99662306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0); 99762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3, 99862306a36Sopenharmony_ci RT5682_PWR_CBJ, 0); 99962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_MICBIAS_2, 100062306a36Sopenharmony_ci RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK, 100162306a36Sopenharmony_ci RT5682_PWR_CLK25M_PD | RT5682_PWR_CLK1M_PD); 100262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 100362306a36Sopenharmony_ci RT5682_FAST_OFF_MASK, RT5682_FAST_OFF_DIS); 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_ci rt5682->jack_type = 0; 100662306a36Sopenharmony_ci } 100762306a36Sopenharmony_ci 100862306a36Sopenharmony_ci dev_dbg(component->dev, "jack_type = %d\n", rt5682->jack_type); 100962306a36Sopenharmony_ci return rt5682->jack_type; 101062306a36Sopenharmony_ci} 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_cistatic int rt5682_set_jack_detect(struct snd_soc_component *component, 101362306a36Sopenharmony_ci struct snd_soc_jack *hs_jack, void *data) 101462306a36Sopenharmony_ci{ 101562306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 101662306a36Sopenharmony_ci 101762306a36Sopenharmony_ci rt5682->hs_jack = hs_jack; 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ci if (rt5682->is_sdw && !rt5682->first_hw_init) 102062306a36Sopenharmony_ci return 0; 102162306a36Sopenharmony_ci 102262306a36Sopenharmony_ci if (!hs_jack) { 102362306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2, 102462306a36Sopenharmony_ci RT5682_JD1_EN_MASK, RT5682_JD1_DIS); 102562306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL, 102662306a36Sopenharmony_ci RT5682_POW_JDH | RT5682_POW_JDL, 0); 102762306a36Sopenharmony_ci cancel_delayed_work_sync(&rt5682->jack_detect_work); 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_ci return 0; 103062306a36Sopenharmony_ci } 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ci if (!rt5682->is_sdw) { 103362306a36Sopenharmony_ci switch (rt5682->pdata.jd_src) { 103462306a36Sopenharmony_ci case RT5682_JD1: 103562306a36Sopenharmony_ci snd_soc_component_update_bits(component, 103662306a36Sopenharmony_ci RT5682_CBJ_CTRL_5, 0x0700, 0x0600); 103762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 103862306a36Sopenharmony_ci RT5682_CBJ_CTRL_2, RT5682_EXT_JD_SRC, 103962306a36Sopenharmony_ci RT5682_EXT_JD_SRC_MANUAL); 104062306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_CBJ_CTRL_1, 104162306a36Sopenharmony_ci 0xd142); 104262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 104362306a36Sopenharmony_ci RT5682_CBJ_CTRL_3, RT5682_CBJ_IN_BUF_EN, 104462306a36Sopenharmony_ci RT5682_CBJ_IN_BUF_EN); 104562306a36Sopenharmony_ci snd_soc_component_update_bits(component, 104662306a36Sopenharmony_ci RT5682_SAR_IL_CMD_1, RT5682_SAR_POW_MASK, 104762306a36Sopenharmony_ci RT5682_SAR_POW_EN); 104862306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_GPIO_CTRL_1, 104962306a36Sopenharmony_ci RT5682_GP1_PIN_MASK, RT5682_GP1_PIN_IRQ); 105062306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL, 105162306a36Sopenharmony_ci RT5682_POW_IRQ | RT5682_POW_JDH | 105262306a36Sopenharmony_ci RT5682_POW_ANA, RT5682_POW_IRQ | 105362306a36Sopenharmony_ci RT5682_POW_JDH | RT5682_POW_ANA); 105462306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_2, 105562306a36Sopenharmony_ci RT5682_PWR_JDH, RT5682_PWR_JDH); 105662306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2, 105762306a36Sopenharmony_ci RT5682_JD1_EN_MASK | RT5682_JD1_POL_MASK, 105862306a36Sopenharmony_ci RT5682_JD1_EN | RT5682_JD1_POL_NOR); 105962306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_4, 106062306a36Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 106162306a36Sopenharmony_ci rt5682->pdata.btndet_delay)); 106262306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_5, 106362306a36Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 106462306a36Sopenharmony_ci rt5682->pdata.btndet_delay)); 106562306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_6, 106662306a36Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 106762306a36Sopenharmony_ci rt5682->pdata.btndet_delay)); 106862306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_7, 106962306a36Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 107062306a36Sopenharmony_ci rt5682->pdata.btndet_delay)); 107162306a36Sopenharmony_ci mod_delayed_work(system_power_efficient_wq, 107262306a36Sopenharmony_ci &rt5682->jack_detect_work, 107362306a36Sopenharmony_ci msecs_to_jiffies(250)); 107462306a36Sopenharmony_ci break; 107562306a36Sopenharmony_ci 107662306a36Sopenharmony_ci case RT5682_JD_NULL: 107762306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2, 107862306a36Sopenharmony_ci RT5682_JD1_EN_MASK, RT5682_JD1_DIS); 107962306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL, 108062306a36Sopenharmony_ci RT5682_POW_JDH | RT5682_POW_JDL, 0); 108162306a36Sopenharmony_ci break; 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_ci default: 108462306a36Sopenharmony_ci dev_warn(component->dev, "Wrong JD source\n"); 108562306a36Sopenharmony_ci break; 108662306a36Sopenharmony_ci } 108762306a36Sopenharmony_ci } 108862306a36Sopenharmony_ci 108962306a36Sopenharmony_ci return 0; 109062306a36Sopenharmony_ci} 109162306a36Sopenharmony_ci 109262306a36Sopenharmony_civoid rt5682_jack_detect_handler(struct work_struct *work) 109362306a36Sopenharmony_ci{ 109462306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 109562306a36Sopenharmony_ci container_of(work, struct rt5682_priv, jack_detect_work.work); 109662306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm; 109762306a36Sopenharmony_ci int val, btn_type; 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_ci if (!rt5682->component || 110062306a36Sopenharmony_ci !snd_soc_card_is_instantiated(rt5682->component->card)) { 110162306a36Sopenharmony_ci /* card not yet ready, try later */ 110262306a36Sopenharmony_ci mod_delayed_work(system_power_efficient_wq, 110362306a36Sopenharmony_ci &rt5682->jack_detect_work, msecs_to_jiffies(15)); 110462306a36Sopenharmony_ci return; 110562306a36Sopenharmony_ci } 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci if (rt5682->is_sdw) { 110862306a36Sopenharmony_ci if (pm_runtime_status_suspended(rt5682->slave->dev.parent)) { 110962306a36Sopenharmony_ci dev_dbg(&rt5682->slave->dev, 111062306a36Sopenharmony_ci "%s: parent device is pm_runtime_status_suspended, skipping jack detection\n", 111162306a36Sopenharmony_ci __func__); 111262306a36Sopenharmony_ci return; 111362306a36Sopenharmony_ci } 111462306a36Sopenharmony_ci } 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci dapm = snd_soc_component_get_dapm(rt5682->component); 111762306a36Sopenharmony_ci 111862306a36Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 111962306a36Sopenharmony_ci mutex_lock(&rt5682->calibrate_mutex); 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_ci val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL) 112262306a36Sopenharmony_ci & RT5682_JDH_RS_MASK; 112362306a36Sopenharmony_ci if (!val) { 112462306a36Sopenharmony_ci /* jack in */ 112562306a36Sopenharmony_ci if (rt5682->jack_type == 0) { 112662306a36Sopenharmony_ci /* jack was out, report jack type */ 112762306a36Sopenharmony_ci rt5682->jack_type = 112862306a36Sopenharmony_ci rt5682_headset_detect(rt5682->component, 1); 112962306a36Sopenharmony_ci rt5682->irq_work_delay_time = 0; 113062306a36Sopenharmony_ci } else if ((rt5682->jack_type & SND_JACK_HEADSET) == 113162306a36Sopenharmony_ci SND_JACK_HEADSET) { 113262306a36Sopenharmony_ci /* jack is already in, report button event */ 113362306a36Sopenharmony_ci rt5682->jack_type = SND_JACK_HEADSET; 113462306a36Sopenharmony_ci btn_type = rt5682_button_detect(rt5682->component); 113562306a36Sopenharmony_ci /** 113662306a36Sopenharmony_ci * rt5682 can report three kinds of button behavior, 113762306a36Sopenharmony_ci * one click, double click and hold. However, 113862306a36Sopenharmony_ci * currently we will report button pressed/released 113962306a36Sopenharmony_ci * event. So all the three button behaviors are 114062306a36Sopenharmony_ci * treated as button pressed. 114162306a36Sopenharmony_ci */ 114262306a36Sopenharmony_ci switch (btn_type) { 114362306a36Sopenharmony_ci case 0x8000: 114462306a36Sopenharmony_ci case 0x4000: 114562306a36Sopenharmony_ci case 0x2000: 114662306a36Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_0; 114762306a36Sopenharmony_ci break; 114862306a36Sopenharmony_ci case 0x1000: 114962306a36Sopenharmony_ci case 0x0800: 115062306a36Sopenharmony_ci case 0x0400: 115162306a36Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_1; 115262306a36Sopenharmony_ci break; 115362306a36Sopenharmony_ci case 0x0200: 115462306a36Sopenharmony_ci case 0x0100: 115562306a36Sopenharmony_ci case 0x0080: 115662306a36Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_2; 115762306a36Sopenharmony_ci break; 115862306a36Sopenharmony_ci case 0x0040: 115962306a36Sopenharmony_ci case 0x0020: 116062306a36Sopenharmony_ci case 0x0010: 116162306a36Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_3; 116262306a36Sopenharmony_ci break; 116362306a36Sopenharmony_ci case 0x0000: /* unpressed */ 116462306a36Sopenharmony_ci break; 116562306a36Sopenharmony_ci default: 116662306a36Sopenharmony_ci dev_err(rt5682->component->dev, 116762306a36Sopenharmony_ci "Unexpected button code 0x%04x\n", 116862306a36Sopenharmony_ci btn_type); 116962306a36Sopenharmony_ci break; 117062306a36Sopenharmony_ci } 117162306a36Sopenharmony_ci } 117262306a36Sopenharmony_ci } else { 117362306a36Sopenharmony_ci /* jack out */ 117462306a36Sopenharmony_ci rt5682->jack_type = rt5682_headset_detect(rt5682->component, 0); 117562306a36Sopenharmony_ci rt5682->irq_work_delay_time = 50; 117662306a36Sopenharmony_ci } 117762306a36Sopenharmony_ci 117862306a36Sopenharmony_ci mutex_unlock(&rt5682->calibrate_mutex); 117962306a36Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 118062306a36Sopenharmony_ci 118162306a36Sopenharmony_ci snd_soc_jack_report(rt5682->hs_jack, rt5682->jack_type, 118262306a36Sopenharmony_ci SND_JACK_HEADSET | 118362306a36Sopenharmony_ci SND_JACK_BTN_0 | SND_JACK_BTN_1 | 118462306a36Sopenharmony_ci SND_JACK_BTN_2 | SND_JACK_BTN_3); 118562306a36Sopenharmony_ci 118662306a36Sopenharmony_ci if (!rt5682->is_sdw) { 118762306a36Sopenharmony_ci if (rt5682->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 | 118862306a36Sopenharmony_ci SND_JACK_BTN_2 | SND_JACK_BTN_3)) 118962306a36Sopenharmony_ci schedule_delayed_work(&rt5682->jd_check_work, 0); 119062306a36Sopenharmony_ci else 119162306a36Sopenharmony_ci cancel_delayed_work_sync(&rt5682->jd_check_work); 119262306a36Sopenharmony_ci } 119362306a36Sopenharmony_ci} 119462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_jack_detect_handler); 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_snd_controls[] = { 119762306a36Sopenharmony_ci /* DAC Digital Volume */ 119862306a36Sopenharmony_ci SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682_DAC1_DIG_VOL, 119962306a36Sopenharmony_ci RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 87, 0, dac_vol_tlv), 120062306a36Sopenharmony_ci 120162306a36Sopenharmony_ci /* IN Boost Volume */ 120262306a36Sopenharmony_ci SOC_SINGLE_TLV("CBJ Boost Volume", RT5682_CBJ_BST_CTRL, 120362306a36Sopenharmony_ci RT5682_BST_CBJ_SFT, 8, 0, bst_tlv), 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_ci /* ADC Digital Volume Control */ 120662306a36Sopenharmony_ci SOC_DOUBLE("STO1 ADC Capture Switch", RT5682_STO1_ADC_DIG_VOL, 120762306a36Sopenharmony_ci RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1), 120862306a36Sopenharmony_ci SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682_STO1_ADC_DIG_VOL, 120962306a36Sopenharmony_ci RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 63, 0, adc_vol_tlv), 121062306a36Sopenharmony_ci 121162306a36Sopenharmony_ci /* ADC Boost Volume Control */ 121262306a36Sopenharmony_ci SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682_STO1_ADC_BOOST, 121362306a36Sopenharmony_ci RT5682_STO1_ADC_L_BST_SFT, RT5682_STO1_ADC_R_BST_SFT, 121462306a36Sopenharmony_ci 3, 0, adc_bst_tlv), 121562306a36Sopenharmony_ci}; 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_cistatic int rt5682_div_sel(struct rt5682_priv *rt5682, 121862306a36Sopenharmony_ci int target, const int div[], int size) 121962306a36Sopenharmony_ci{ 122062306a36Sopenharmony_ci int i; 122162306a36Sopenharmony_ci 122262306a36Sopenharmony_ci if (rt5682->sysclk < target) { 122362306a36Sopenharmony_ci dev_err(rt5682->component->dev, 122462306a36Sopenharmony_ci "sysclk rate %d is too low\n", rt5682->sysclk); 122562306a36Sopenharmony_ci return 0; 122662306a36Sopenharmony_ci } 122762306a36Sopenharmony_ci 122862306a36Sopenharmony_ci for (i = 0; i < size - 1; i++) { 122962306a36Sopenharmony_ci dev_dbg(rt5682->component->dev, "div[%d]=%d\n", i, div[i]); 123062306a36Sopenharmony_ci if (target * div[i] == rt5682->sysclk) 123162306a36Sopenharmony_ci return i; 123262306a36Sopenharmony_ci if (target * div[i + 1] > rt5682->sysclk) { 123362306a36Sopenharmony_ci dev_dbg(rt5682->component->dev, 123462306a36Sopenharmony_ci "can't find div for sysclk %d\n", 123562306a36Sopenharmony_ci rt5682->sysclk); 123662306a36Sopenharmony_ci return i; 123762306a36Sopenharmony_ci } 123862306a36Sopenharmony_ci } 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_ci if (target * div[i] < rt5682->sysclk) 124162306a36Sopenharmony_ci dev_err(rt5682->component->dev, 124262306a36Sopenharmony_ci "sysclk rate %d is too high\n", rt5682->sysclk); 124362306a36Sopenharmony_ci 124462306a36Sopenharmony_ci return size - 1; 124562306a36Sopenharmony_ci} 124662306a36Sopenharmony_ci 124762306a36Sopenharmony_ci/** 124862306a36Sopenharmony_ci * set_dmic_clk - Set parameter of dmic. 124962306a36Sopenharmony_ci * 125062306a36Sopenharmony_ci * @w: DAPM widget. 125162306a36Sopenharmony_ci * @kcontrol: The kcontrol of this widget. 125262306a36Sopenharmony_ci * @event: Event id. 125362306a36Sopenharmony_ci * 125462306a36Sopenharmony_ci * Choose dmic clock between 1MHz and 3MHz. 125562306a36Sopenharmony_ci * It is better for clock to approximate 3MHz. 125662306a36Sopenharmony_ci */ 125762306a36Sopenharmony_cistatic int set_dmic_clk(struct snd_soc_dapm_widget *w, 125862306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 125962306a36Sopenharmony_ci{ 126062306a36Sopenharmony_ci struct snd_soc_component *component = 126162306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 126262306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 126362306a36Sopenharmony_ci int idx, dmic_clk_rate = 3072000; 126462306a36Sopenharmony_ci static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128}; 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci if (rt5682->pdata.dmic_clk_rate) 126762306a36Sopenharmony_ci dmic_clk_rate = rt5682->pdata.dmic_clk_rate; 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_ci idx = rt5682_div_sel(rt5682, dmic_clk_rate, div, ARRAY_SIZE(div)); 127062306a36Sopenharmony_ci 127162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_DMIC_CTRL_1, 127262306a36Sopenharmony_ci RT5682_DMIC_CLK_MASK, idx << RT5682_DMIC_CLK_SFT); 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_ci return 0; 127562306a36Sopenharmony_ci} 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_cistatic int set_filter_clk(struct snd_soc_dapm_widget *w, 127862306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 127962306a36Sopenharmony_ci{ 128062306a36Sopenharmony_ci struct snd_soc_component *component = 128162306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 128262306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 128362306a36Sopenharmony_ci int ref, val, reg, idx; 128462306a36Sopenharmony_ci static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48}; 128562306a36Sopenharmony_ci static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48}; 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_ci if (rt5682->is_sdw) 128862306a36Sopenharmony_ci return 0; 128962306a36Sopenharmony_ci 129062306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GPIO_CTRL_1) & 129162306a36Sopenharmony_ci RT5682_GP4_PIN_MASK; 129262306a36Sopenharmony_ci if (w->shift == RT5682_PWR_ADC_S1F_BIT && 129362306a36Sopenharmony_ci val == RT5682_GP4_PIN_ADCDAT2) 129462306a36Sopenharmony_ci ref = 256 * rt5682->lrck[RT5682_AIF2]; 129562306a36Sopenharmony_ci else 129662306a36Sopenharmony_ci ref = 256 * rt5682->lrck[RT5682_AIF1]; 129762306a36Sopenharmony_ci 129862306a36Sopenharmony_ci idx = rt5682_div_sel(rt5682, ref, div_f, ARRAY_SIZE(div_f)); 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci if (w->shift == RT5682_PWR_ADC_S1F_BIT) 130162306a36Sopenharmony_ci reg = RT5682_PLL_TRACK_3; 130262306a36Sopenharmony_ci else 130362306a36Sopenharmony_ci reg = RT5682_PLL_TRACK_2; 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 130662306a36Sopenharmony_ci RT5682_FILTER_CLK_DIV_MASK, idx << RT5682_FILTER_CLK_DIV_SFT); 130762306a36Sopenharmony_ci 130862306a36Sopenharmony_ci /* select over sample rate */ 130962306a36Sopenharmony_ci for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) { 131062306a36Sopenharmony_ci if (rt5682->sysclk <= 12288000 * div_o[idx]) 131162306a36Sopenharmony_ci break; 131262306a36Sopenharmony_ci } 131362306a36Sopenharmony_ci 131462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1, 131562306a36Sopenharmony_ci RT5682_ADC_OSR_MASK | RT5682_DAC_OSR_MASK, 131662306a36Sopenharmony_ci (idx << RT5682_ADC_OSR_SFT) | (idx << RT5682_DAC_OSR_SFT)); 131762306a36Sopenharmony_ci 131862306a36Sopenharmony_ci return 0; 131962306a36Sopenharmony_ci} 132062306a36Sopenharmony_ci 132162306a36Sopenharmony_cistatic int is_sys_clk_from_pll1(struct snd_soc_dapm_widget *w, 132262306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 132362306a36Sopenharmony_ci{ 132462306a36Sopenharmony_ci unsigned int val; 132562306a36Sopenharmony_ci struct snd_soc_component *component = 132662306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 132762306a36Sopenharmony_ci 132862306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GLB_CLK); 132962306a36Sopenharmony_ci val &= RT5682_SCLK_SRC_MASK; 133062306a36Sopenharmony_ci if (val == RT5682_SCLK_SRC_PLL1) 133162306a36Sopenharmony_ci return 1; 133262306a36Sopenharmony_ci else 133362306a36Sopenharmony_ci return 0; 133462306a36Sopenharmony_ci} 133562306a36Sopenharmony_ci 133662306a36Sopenharmony_cistatic int is_sys_clk_from_pll2(struct snd_soc_dapm_widget *w, 133762306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 133862306a36Sopenharmony_ci{ 133962306a36Sopenharmony_ci unsigned int val; 134062306a36Sopenharmony_ci struct snd_soc_component *component = 134162306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 134262306a36Sopenharmony_ci 134362306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GLB_CLK); 134462306a36Sopenharmony_ci val &= RT5682_SCLK_SRC_MASK; 134562306a36Sopenharmony_ci if (val == RT5682_SCLK_SRC_PLL2) 134662306a36Sopenharmony_ci return 1; 134762306a36Sopenharmony_ci else 134862306a36Sopenharmony_ci return 0; 134962306a36Sopenharmony_ci} 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_cistatic int is_using_asrc(struct snd_soc_dapm_widget *w, 135262306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 135362306a36Sopenharmony_ci{ 135462306a36Sopenharmony_ci unsigned int reg, shift, val; 135562306a36Sopenharmony_ci struct snd_soc_component *component = 135662306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 135762306a36Sopenharmony_ci 135862306a36Sopenharmony_ci switch (w->shift) { 135962306a36Sopenharmony_ci case RT5682_ADC_STO1_ASRC_SFT: 136062306a36Sopenharmony_ci reg = RT5682_PLL_TRACK_3; 136162306a36Sopenharmony_ci shift = RT5682_FILTER_CLK_SEL_SFT; 136262306a36Sopenharmony_ci break; 136362306a36Sopenharmony_ci case RT5682_DAC_STO1_ASRC_SFT: 136462306a36Sopenharmony_ci reg = RT5682_PLL_TRACK_2; 136562306a36Sopenharmony_ci shift = RT5682_FILTER_CLK_SEL_SFT; 136662306a36Sopenharmony_ci break; 136762306a36Sopenharmony_ci default: 136862306a36Sopenharmony_ci return 0; 136962306a36Sopenharmony_ci } 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_ci val = (snd_soc_component_read(component, reg) >> shift) & 0xf; 137262306a36Sopenharmony_ci switch (val) { 137362306a36Sopenharmony_ci case RT5682_CLK_SEL_I2S1_ASRC: 137462306a36Sopenharmony_ci case RT5682_CLK_SEL_I2S2_ASRC: 137562306a36Sopenharmony_ci return 1; 137662306a36Sopenharmony_ci default: 137762306a36Sopenharmony_ci return 0; 137862306a36Sopenharmony_ci } 137962306a36Sopenharmony_ci} 138062306a36Sopenharmony_ci 138162306a36Sopenharmony_ci/* Digital Mixer */ 138262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc_l_mix[] = { 138362306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER, 138462306a36Sopenharmony_ci RT5682_M_STO1_ADC_L1_SFT, 1, 1), 138562306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER, 138662306a36Sopenharmony_ci RT5682_M_STO1_ADC_L2_SFT, 1, 1), 138762306a36Sopenharmony_ci}; 138862306a36Sopenharmony_ci 138962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc_r_mix[] = { 139062306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER, 139162306a36Sopenharmony_ci RT5682_M_STO1_ADC_R1_SFT, 1, 1), 139262306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER, 139362306a36Sopenharmony_ci RT5682_M_STO1_ADC_R2_SFT, 1, 1), 139462306a36Sopenharmony_ci}; 139562306a36Sopenharmony_ci 139662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_l_mix[] = { 139762306a36Sopenharmony_ci SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER, 139862306a36Sopenharmony_ci RT5682_M_ADCMIX_L_SFT, 1, 1), 139962306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER, 140062306a36Sopenharmony_ci RT5682_M_DAC1_L_SFT, 1, 1), 140162306a36Sopenharmony_ci}; 140262306a36Sopenharmony_ci 140362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_r_mix[] = { 140462306a36Sopenharmony_ci SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER, 140562306a36Sopenharmony_ci RT5682_M_ADCMIX_R_SFT, 1, 1), 140662306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER, 140762306a36Sopenharmony_ci RT5682_M_DAC1_R_SFT, 1, 1), 140862306a36Sopenharmony_ci}; 140962306a36Sopenharmony_ci 141062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_dac_l_mix[] = { 141162306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER, 141262306a36Sopenharmony_ci RT5682_M_DAC_L1_STO_L_SFT, 1, 1), 141362306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER, 141462306a36Sopenharmony_ci RT5682_M_DAC_R1_STO_L_SFT, 1, 1), 141562306a36Sopenharmony_ci}; 141662306a36Sopenharmony_ci 141762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_dac_r_mix[] = { 141862306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER, 141962306a36Sopenharmony_ci RT5682_M_DAC_L1_STO_R_SFT, 1, 1), 142062306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER, 142162306a36Sopenharmony_ci RT5682_M_DAC_R1_STO_R_SFT, 1, 1), 142262306a36Sopenharmony_ci}; 142362306a36Sopenharmony_ci 142462306a36Sopenharmony_ci/* Analog Input Mixer */ 142562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_rec1_l_mix[] = { 142662306a36Sopenharmony_ci SOC_DAPM_SINGLE("CBJ Switch", RT5682_REC_MIXER, 142762306a36Sopenharmony_ci RT5682_M_CBJ_RM1_L_SFT, 1, 1), 142862306a36Sopenharmony_ci}; 142962306a36Sopenharmony_ci 143062306a36Sopenharmony_ci/* STO1 ADC1 Source */ 143162306a36Sopenharmony_ci/* MX-26 [13] [5] */ 143262306a36Sopenharmony_cistatic const char * const rt5682_sto1_adc1_src[] = { 143362306a36Sopenharmony_ci "DAC MIX", "ADC" 143462306a36Sopenharmony_ci}; 143562306a36Sopenharmony_ci 143662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 143762306a36Sopenharmony_ci rt5682_sto1_adc1l_enum, RT5682_STO1_ADC_MIXER, 143862306a36Sopenharmony_ci RT5682_STO1_ADC1L_SRC_SFT, rt5682_sto1_adc1_src); 143962306a36Sopenharmony_ci 144062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc1l_mux = 144162306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1l_enum); 144262306a36Sopenharmony_ci 144362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 144462306a36Sopenharmony_ci rt5682_sto1_adc1r_enum, RT5682_STO1_ADC_MIXER, 144562306a36Sopenharmony_ci RT5682_STO1_ADC1R_SRC_SFT, rt5682_sto1_adc1_src); 144662306a36Sopenharmony_ci 144762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc1r_mux = 144862306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1r_enum); 144962306a36Sopenharmony_ci 145062306a36Sopenharmony_ci/* STO1 ADC Source */ 145162306a36Sopenharmony_ci/* MX-26 [11:10] [3:2] */ 145262306a36Sopenharmony_cistatic const char * const rt5682_sto1_adc_src[] = { 145362306a36Sopenharmony_ci "ADC1 L", "ADC1 R" 145462306a36Sopenharmony_ci}; 145562306a36Sopenharmony_ci 145662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 145762306a36Sopenharmony_ci rt5682_sto1_adcl_enum, RT5682_STO1_ADC_MIXER, 145862306a36Sopenharmony_ci RT5682_STO1_ADCL_SRC_SFT, rt5682_sto1_adc_src); 145962306a36Sopenharmony_ci 146062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adcl_mux = 146162306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682_sto1_adcl_enum); 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 146462306a36Sopenharmony_ci rt5682_sto1_adcr_enum, RT5682_STO1_ADC_MIXER, 146562306a36Sopenharmony_ci RT5682_STO1_ADCR_SRC_SFT, rt5682_sto1_adc_src); 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adcr_mux = 146862306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682_sto1_adcr_enum); 146962306a36Sopenharmony_ci 147062306a36Sopenharmony_ci/* STO1 ADC2 Source */ 147162306a36Sopenharmony_ci/* MX-26 [12] [4] */ 147262306a36Sopenharmony_cistatic const char * const rt5682_sto1_adc2_src[] = { 147362306a36Sopenharmony_ci "DAC MIX", "DMIC" 147462306a36Sopenharmony_ci}; 147562306a36Sopenharmony_ci 147662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 147762306a36Sopenharmony_ci rt5682_sto1_adc2l_enum, RT5682_STO1_ADC_MIXER, 147862306a36Sopenharmony_ci RT5682_STO1_ADC2L_SRC_SFT, rt5682_sto1_adc2_src); 147962306a36Sopenharmony_ci 148062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc2l_mux = 148162306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5682_sto1_adc2l_enum); 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 148462306a36Sopenharmony_ci rt5682_sto1_adc2r_enum, RT5682_STO1_ADC_MIXER, 148562306a36Sopenharmony_ci RT5682_STO1_ADC2R_SRC_SFT, rt5682_sto1_adc2_src); 148662306a36Sopenharmony_ci 148762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc2r_mux = 148862306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5682_sto1_adc2r_enum); 148962306a36Sopenharmony_ci 149062306a36Sopenharmony_ci/* MX-79 [6:4] I2S1 ADC data location */ 149162306a36Sopenharmony_cistatic const unsigned int rt5682_if1_adc_slot_values[] = { 149262306a36Sopenharmony_ci 0, 149362306a36Sopenharmony_ci 2, 149462306a36Sopenharmony_ci 4, 149562306a36Sopenharmony_ci 6, 149662306a36Sopenharmony_ci}; 149762306a36Sopenharmony_ci 149862306a36Sopenharmony_cistatic const char * const rt5682_if1_adc_slot_src[] = { 149962306a36Sopenharmony_ci "Slot 0", "Slot 2", "Slot 4", "Slot 6" 150062306a36Sopenharmony_ci}; 150162306a36Sopenharmony_ci 150262306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_if1_adc_slot_enum, 150362306a36Sopenharmony_ci RT5682_TDM_CTRL, RT5682_TDM_ADC_LCA_SFT, RT5682_TDM_ADC_LCA_MASK, 150462306a36Sopenharmony_ci rt5682_if1_adc_slot_src, rt5682_if1_adc_slot_values); 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_adc_slot_mux = 150762306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 ADC Slot location", rt5682_if1_adc_slot_enum); 150862306a36Sopenharmony_ci 150962306a36Sopenharmony_ci/* Analog DAC L1 Source, Analog DAC R1 Source*/ 151062306a36Sopenharmony_ci/* MX-2B [4], MX-2B [0]*/ 151162306a36Sopenharmony_cistatic const char * const rt5682_alg_dac1_src[] = { 151262306a36Sopenharmony_ci "Stereo1 DAC Mixer", "DAC1" 151362306a36Sopenharmony_ci}; 151462306a36Sopenharmony_ci 151562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 151662306a36Sopenharmony_ci rt5682_alg_dac_l1_enum, RT5682_A_DAC1_MUX, 151762306a36Sopenharmony_ci RT5682_A_DACL1_SFT, rt5682_alg_dac1_src); 151862306a36Sopenharmony_ci 151962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_alg_dac_l1_mux = 152062306a36Sopenharmony_ci SOC_DAPM_ENUM("Analog DAC L1 Source", rt5682_alg_dac_l1_enum); 152162306a36Sopenharmony_ci 152262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 152362306a36Sopenharmony_ci rt5682_alg_dac_r1_enum, RT5682_A_DAC1_MUX, 152462306a36Sopenharmony_ci RT5682_A_DACR1_SFT, rt5682_alg_dac1_src); 152562306a36Sopenharmony_ci 152662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_alg_dac_r1_mux = 152762306a36Sopenharmony_ci SOC_DAPM_ENUM("Analog DAC R1 Source", rt5682_alg_dac_r1_enum); 152862306a36Sopenharmony_ci 152962306a36Sopenharmony_ci/* Out Switch */ 153062306a36Sopenharmony_cistatic const struct snd_kcontrol_new hpol_switch = 153162306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1, 153262306a36Sopenharmony_ci RT5682_L_MUTE_SFT, 1, 1); 153362306a36Sopenharmony_cistatic const struct snd_kcontrol_new hpor_switch = 153462306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1, 153562306a36Sopenharmony_ci RT5682_R_MUTE_SFT, 1, 1); 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_cistatic int rt5682_hp_event(struct snd_soc_dapm_widget *w, 153862306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 153962306a36Sopenharmony_ci{ 154062306a36Sopenharmony_ci struct snd_soc_component *component = 154162306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 154262306a36Sopenharmony_ci 154362306a36Sopenharmony_ci switch (event) { 154462306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 154562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_HP_CTRL_2, 154662306a36Sopenharmony_ci RT5682_HP_C2_DAC_AMP_MUTE, 0); 154762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_HP_LOGIC_CTRL_2, 154862306a36Sopenharmony_ci RT5682_HP_LC2_SIG_SOUR2_MASK, RT5682_HP_LC2_SIG_SOUR2_REG); 154962306a36Sopenharmony_ci snd_soc_component_update_bits(component, 155062306a36Sopenharmony_ci RT5682_DEPOP_1, 0x60, 0x60); 155162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 155262306a36Sopenharmony_ci RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080); 155362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_HP_CTRL_2, 155462306a36Sopenharmony_ci RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN, 155562306a36Sopenharmony_ci RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN); 155662306a36Sopenharmony_ci usleep_range(5000, 10000); 155762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1, 155862306a36Sopenharmony_ci RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_L); 155962306a36Sopenharmony_ci break; 156062306a36Sopenharmony_ci 156162306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 156262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_HP_CTRL_2, 156362306a36Sopenharmony_ci RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN, 0); 156462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1, 156562306a36Sopenharmony_ci RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_M); 156662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 156762306a36Sopenharmony_ci RT5682_DEPOP_1, 0x60, 0x0); 156862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 156962306a36Sopenharmony_ci RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0000); 157062306a36Sopenharmony_ci break; 157162306a36Sopenharmony_ci } 157262306a36Sopenharmony_ci 157362306a36Sopenharmony_ci return 0; 157462306a36Sopenharmony_ci} 157562306a36Sopenharmony_ci 157662306a36Sopenharmony_cistatic int set_dmic_power(struct snd_soc_dapm_widget *w, 157762306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 157862306a36Sopenharmony_ci{ 157962306a36Sopenharmony_ci struct snd_soc_component *component = 158062306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 158162306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 158262306a36Sopenharmony_ci unsigned int delay = 50, val; 158362306a36Sopenharmony_ci 158462306a36Sopenharmony_ci if (rt5682->pdata.dmic_delay) 158562306a36Sopenharmony_ci delay = rt5682->pdata.dmic_delay; 158662306a36Sopenharmony_ci 158762306a36Sopenharmony_ci switch (event) { 158862306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 158962306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GLB_CLK); 159062306a36Sopenharmony_ci val &= RT5682_SCLK_SRC_MASK; 159162306a36Sopenharmony_ci if (val == RT5682_SCLK_SRC_PLL1 || val == RT5682_SCLK_SRC_PLL2) 159262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 159362306a36Sopenharmony_ci RT5682_PWR_ANLG_1, 159462306a36Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB, 159562306a36Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB); 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_ci /*Add delay to avoid pop noise*/ 159862306a36Sopenharmony_ci msleep(delay); 159962306a36Sopenharmony_ci break; 160062306a36Sopenharmony_ci 160162306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 160262306a36Sopenharmony_ci if (!rt5682->jack_type) { 160362306a36Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(w->dapm, "MICBIAS")) 160462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 160562306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0); 160662306a36Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(w->dapm, "Vref2")) 160762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 160862306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0); 160962306a36Sopenharmony_ci } 161062306a36Sopenharmony_ci break; 161162306a36Sopenharmony_ci } 161262306a36Sopenharmony_ci 161362306a36Sopenharmony_ci return 0; 161462306a36Sopenharmony_ci} 161562306a36Sopenharmony_ci 161662306a36Sopenharmony_cistatic int rt5682_set_verf(struct snd_soc_dapm_widget *w, 161762306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 161862306a36Sopenharmony_ci{ 161962306a36Sopenharmony_ci struct snd_soc_component *component = 162062306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 162162306a36Sopenharmony_ci 162262306a36Sopenharmony_ci switch (event) { 162362306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 162462306a36Sopenharmony_ci switch (w->shift) { 162562306a36Sopenharmony_ci case RT5682_PWR_VREF1_BIT: 162662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 162762306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV1, 0); 162862306a36Sopenharmony_ci break; 162962306a36Sopenharmony_ci 163062306a36Sopenharmony_ci case RT5682_PWR_VREF2_BIT: 163162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 163262306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0); 163362306a36Sopenharmony_ci break; 163462306a36Sopenharmony_ci } 163562306a36Sopenharmony_ci break; 163662306a36Sopenharmony_ci 163762306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 163862306a36Sopenharmony_ci usleep_range(15000, 20000); 163962306a36Sopenharmony_ci switch (w->shift) { 164062306a36Sopenharmony_ci case RT5682_PWR_VREF1_BIT: 164162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 164262306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV1, 164362306a36Sopenharmony_ci RT5682_PWR_FV1); 164462306a36Sopenharmony_ci break; 164562306a36Sopenharmony_ci 164662306a36Sopenharmony_ci case RT5682_PWR_VREF2_BIT: 164762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 164862306a36Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 164962306a36Sopenharmony_ci RT5682_PWR_FV2); 165062306a36Sopenharmony_ci break; 165162306a36Sopenharmony_ci } 165262306a36Sopenharmony_ci break; 165362306a36Sopenharmony_ci } 165462306a36Sopenharmony_ci 165562306a36Sopenharmony_ci return 0; 165662306a36Sopenharmony_ci} 165762306a36Sopenharmony_ci 165862306a36Sopenharmony_cistatic const unsigned int rt5682_adcdat_pin_values[] = { 165962306a36Sopenharmony_ci 1, 166062306a36Sopenharmony_ci 3, 166162306a36Sopenharmony_ci}; 166262306a36Sopenharmony_ci 166362306a36Sopenharmony_cistatic const char * const rt5682_adcdat_pin_select[] = { 166462306a36Sopenharmony_ci "ADCDAT1", 166562306a36Sopenharmony_ci "ADCDAT2", 166662306a36Sopenharmony_ci}; 166762306a36Sopenharmony_ci 166862306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_adcdat_pin_enum, 166962306a36Sopenharmony_ci RT5682_GPIO_CTRL_1, RT5682_GP4_PIN_SFT, RT5682_GP4_PIN_MASK, 167062306a36Sopenharmony_ci rt5682_adcdat_pin_select, rt5682_adcdat_pin_values); 167162306a36Sopenharmony_ci 167262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_adcdat_pin_ctrl = 167362306a36Sopenharmony_ci SOC_DAPM_ENUM("ADCDAT", rt5682_adcdat_pin_enum); 167462306a36Sopenharmony_ci 167562306a36Sopenharmony_cistatic const unsigned int rt5682_hpo_sig_out_values[] = { 167662306a36Sopenharmony_ci 2, 167762306a36Sopenharmony_ci 7, 167862306a36Sopenharmony_ci}; 167962306a36Sopenharmony_ci 168062306a36Sopenharmony_cistatic const char * const rt5682_hpo_sig_out_mode[] = { 168162306a36Sopenharmony_ci "Legacy", 168262306a36Sopenharmony_ci "OneBit", 168362306a36Sopenharmony_ci}; 168462306a36Sopenharmony_ci 168562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_hpo_sig_out_enum, 168662306a36Sopenharmony_ci RT5682_HP_LOGIC_CTRL_2, 0, RT5682_HP_LC2_SIG_SOUR1_MASK, 168762306a36Sopenharmony_ci rt5682_hpo_sig_out_mode, rt5682_hpo_sig_out_values); 168862306a36Sopenharmony_ci 168962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_hpo_sig_demux = 169062306a36Sopenharmony_ci SOC_DAPM_ENUM("HPO Signal Demux", rt5682_hpo_sig_out_enum); 169162306a36Sopenharmony_ci 169262306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = { 169362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("LDO2", RT5682_PWR_ANLG_3, RT5682_PWR_LDO2_BIT, 169462306a36Sopenharmony_ci 0, NULL, 0), 169562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL1", RT5682_PWR_ANLG_3, RT5682_PWR_PLL_BIT, 169662306a36Sopenharmony_ci 0, NULL, 0), 169762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL2B", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2B_BIT, 169862306a36Sopenharmony_ci 0, NULL, 0), 169962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL2F", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2F_BIT, 170062306a36Sopenharmony_ci 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU), 170162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("Vref1", RT5682_PWR_ANLG_1, RT5682_PWR_VREF1_BIT, 0, 170262306a36Sopenharmony_ci rt5682_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), 170362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("Vref2", SND_SOC_NOPM, 0, 0, NULL, 0), 170462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, NULL, 0), 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_ci /* ASRC */ 170762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682_PLL_TRACK_1, 170862306a36Sopenharmony_ci RT5682_DAC_STO1_ASRC_SFT, 0, NULL, 0), 170962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5682_PLL_TRACK_1, 171062306a36Sopenharmony_ci RT5682_ADC_STO1_ASRC_SFT, 0, NULL, 0), 171162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682_PLL_TRACK_1, 171262306a36Sopenharmony_ci RT5682_AD_ASRC_SFT, 0, NULL, 0), 171362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682_PLL_TRACK_1, 171462306a36Sopenharmony_ci RT5682_DA_ASRC_SFT, 0, NULL, 0), 171562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682_PLL_TRACK_1, 171662306a36Sopenharmony_ci RT5682_DMIC_ASRC_SFT, 0, NULL, 0), 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_ci /* Input Side */ 171962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682_PWR_ANLG_2, RT5682_PWR_MB1_BIT, 172062306a36Sopenharmony_ci 0, NULL, 0), 172162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682_PWR_ANLG_2, RT5682_PWR_MB2_BIT, 172262306a36Sopenharmony_ci 0, NULL, 0), 172362306a36Sopenharmony_ci 172462306a36Sopenharmony_ci /* Input Lines */ 172562306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC L1"), 172662306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC R1"), 172762306a36Sopenharmony_ci 172862306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN1P"), 172962306a36Sopenharmony_ci 173062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0, 173162306a36Sopenharmony_ci set_dmic_clk, SND_SOC_DAPM_PRE_PMU), 173262306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682_DMIC_CTRL_1, 173362306a36Sopenharmony_ci RT5682_DMIC_1_EN_SFT, 0, set_dmic_power, 173462306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 173562306a36Sopenharmony_ci 173662306a36Sopenharmony_ci /* Boost */ 173762306a36Sopenharmony_ci SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 173862306a36Sopenharmony_ci 0, 0, NULL, 0), 173962306a36Sopenharmony_ci 174062306a36Sopenharmony_ci /* REC Mixer */ 174162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682_rec1_l_mix, 174262306a36Sopenharmony_ci ARRAY_SIZE(rt5682_rec1_l_mix)), 174362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682_PWR_ANLG_2, 174462306a36Sopenharmony_ci RT5682_PWR_RM1_L_BIT, 0, NULL, 0), 174562306a36Sopenharmony_ci 174662306a36Sopenharmony_ci /* ADCs */ 174762306a36Sopenharmony_ci SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0), 174862306a36Sopenharmony_ci SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0), 174962306a36Sopenharmony_ci 175062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682_PWR_DIG_1, 175162306a36Sopenharmony_ci RT5682_PWR_ADC_L1_BIT, 0, NULL, 0), 175262306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682_PWR_DIG_1, 175362306a36Sopenharmony_ci RT5682_PWR_ADC_R1_BIT, 0, NULL, 0), 175462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682_CHOP_ADC, 175562306a36Sopenharmony_ci RT5682_CKGEN_ADC1_SFT, 0, NULL, 0), 175662306a36Sopenharmony_ci 175762306a36Sopenharmony_ci /* ADC Mux */ 175862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0, 175962306a36Sopenharmony_ci &rt5682_sto1_adc1l_mux), 176062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0, 176162306a36Sopenharmony_ci &rt5682_sto1_adc1r_mux), 176262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0, 176362306a36Sopenharmony_ci &rt5682_sto1_adc2l_mux), 176462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0, 176562306a36Sopenharmony_ci &rt5682_sto1_adc2r_mux), 176662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0, 176762306a36Sopenharmony_ci &rt5682_sto1_adcl_mux), 176862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0, 176962306a36Sopenharmony_ci &rt5682_sto1_adcr_mux), 177062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0, 177162306a36Sopenharmony_ci &rt5682_if1_adc_slot_mux), 177262306a36Sopenharmony_ci 177362306a36Sopenharmony_ci /* ADC Mixer */ 177462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682_PWR_DIG_2, 177562306a36Sopenharmony_ci RT5682_PWR_ADC_S1F_BIT, 0, set_filter_clk, 177662306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU), 177762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5682_STO1_ADC_DIG_VOL, 177862306a36Sopenharmony_ci RT5682_L_MUTE_SFT, 1, rt5682_sto1_adc_l_mix, 177962306a36Sopenharmony_ci ARRAY_SIZE(rt5682_sto1_adc_l_mix)), 178062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682_STO1_ADC_DIG_VOL, 178162306a36Sopenharmony_ci RT5682_R_MUTE_SFT, 1, rt5682_sto1_adc_r_mix, 178262306a36Sopenharmony_ci ARRAY_SIZE(rt5682_sto1_adc_r_mix)), 178362306a36Sopenharmony_ci 178462306a36Sopenharmony_ci /* ADC PGA */ 178562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 178662306a36Sopenharmony_ci 178762306a36Sopenharmony_ci /* Digital Interface */ 178862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S1", RT5682_PWR_DIG_1, RT5682_PWR_I2S1_BIT, 178962306a36Sopenharmony_ci 0, NULL, 0), 179062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S2", RT5682_PWR_DIG_1, RT5682_PWR_I2S2_BIT, 179162306a36Sopenharmony_ci 0, NULL, 0), 179262306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0), 179362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0), 179462306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0), 179562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("SOUND DAC L", SND_SOC_NOPM, 0, 0, NULL, 0), 179662306a36Sopenharmony_ci SND_SOC_DAPM_PGA("SOUND DAC R", SND_SOC_NOPM, 0, 0, NULL, 0), 179762306a36Sopenharmony_ci 179862306a36Sopenharmony_ci /* Digital Interface Select */ 179962306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 180062306a36Sopenharmony_ci &rt5682_if1_01_adc_swap_mux), 180162306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 180262306a36Sopenharmony_ci &rt5682_if1_23_adc_swap_mux), 180362306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 180462306a36Sopenharmony_ci &rt5682_if1_45_adc_swap_mux), 180562306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 180662306a36Sopenharmony_ci &rt5682_if1_67_adc_swap_mux), 180762306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 180862306a36Sopenharmony_ci &rt5682_if2_adc_swap_mux), 180962306a36Sopenharmony_ci 181062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0, 181162306a36Sopenharmony_ci &rt5682_adcdat_pin_ctrl), 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC L Mux", SND_SOC_NOPM, 0, 0, 181462306a36Sopenharmony_ci &rt5682_dac_l_mux), 181562306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC R Mux", SND_SOC_NOPM, 0, 0, 181662306a36Sopenharmony_ci &rt5682_dac_r_mux), 181762306a36Sopenharmony_ci 181862306a36Sopenharmony_ci /* Audio Interface */ 181962306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, 182062306a36Sopenharmony_ci RT5682_I2S1_SDP, RT5682_SEL_ADCDAT_SFT, 1), 182162306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, 182262306a36Sopenharmony_ci RT5682_I2S2_SDP, RT5682_I2S2_PIN_CFG_SFT, 1), 182362306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), 182462306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("SDWRX", "SDW Playback", 0, SND_SOC_NOPM, 0, 0), 182562306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("SDWTX", "SDW Capture", 0, SND_SOC_NOPM, 0, 0), 182662306a36Sopenharmony_ci 182762306a36Sopenharmony_ci /* Output Side */ 182862306a36Sopenharmony_ci /* DAC mixer before sound effect */ 182962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0, 183062306a36Sopenharmony_ci rt5682_dac_l_mix, ARRAY_SIZE(rt5682_dac_l_mix)), 183162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0, 183262306a36Sopenharmony_ci rt5682_dac_r_mix, ARRAY_SIZE(rt5682_dac_r_mix)), 183362306a36Sopenharmony_ci 183462306a36Sopenharmony_ci /* DAC channel Mux */ 183562306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0, 183662306a36Sopenharmony_ci &rt5682_alg_dac_l1_mux), 183762306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0, 183862306a36Sopenharmony_ci &rt5682_alg_dac_r1_mux), 183962306a36Sopenharmony_ci 184062306a36Sopenharmony_ci /* DAC Mixer */ 184162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682_PWR_DIG_2, 184262306a36Sopenharmony_ci RT5682_PWR_DAC_S1F_BIT, 0, set_filter_clk, 184362306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMU), 184462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0, 184562306a36Sopenharmony_ci rt5682_sto1_dac_l_mix, ARRAY_SIZE(rt5682_sto1_dac_l_mix)), 184662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0, 184762306a36Sopenharmony_ci rt5682_sto1_dac_r_mix, ARRAY_SIZE(rt5682_sto1_dac_r_mix)), 184862306a36Sopenharmony_ci 184962306a36Sopenharmony_ci /* DACs */ 185062306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682_PWR_DIG_1, 185162306a36Sopenharmony_ci RT5682_PWR_DAC_L1_BIT, 0), 185262306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682_PWR_DIG_1, 185362306a36Sopenharmony_ci RT5682_PWR_DAC_R1_BIT, 0), 185462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DAC 1 Clock", 3, RT5682_CHOP_DAC, 185562306a36Sopenharmony_ci RT5682_CKGEN_DAC1_SFT, 0, NULL, 0), 185662306a36Sopenharmony_ci 185762306a36Sopenharmony_ci /* HPO */ 185862306a36Sopenharmony_ci SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5682_hp_event, 185962306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU), 186062306a36Sopenharmony_ci 186162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("HP Amp L", RT5682_PWR_ANLG_1, 186262306a36Sopenharmony_ci RT5682_PWR_HA_L_BIT, 0, NULL, 0), 186362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("HP Amp R", RT5682_PWR_ANLG_1, 186462306a36Sopenharmony_ci RT5682_PWR_HA_R_BIT, 0, NULL, 0), 186562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, RT5682_DEPOP_1, 186662306a36Sopenharmony_ci RT5682_PUMP_EN_SFT, 0, NULL, 0), 186762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("Capless", 2, RT5682_DEPOP_1, 186862306a36Sopenharmony_ci RT5682_CAPLESS_EN_SFT, 0, NULL, 0), 186962306a36Sopenharmony_ci 187062306a36Sopenharmony_ci SND_SOC_DAPM_SWITCH("HPOL Playback", SND_SOC_NOPM, 0, 0, 187162306a36Sopenharmony_ci &hpol_switch), 187262306a36Sopenharmony_ci SND_SOC_DAPM_SWITCH("HPOR Playback", SND_SOC_NOPM, 0, 0, 187362306a36Sopenharmony_ci &hpor_switch), 187462306a36Sopenharmony_ci 187562306a36Sopenharmony_ci SND_SOC_DAPM_OUT_DRV("HPO Legacy", SND_SOC_NOPM, 0, 0, NULL, 0), 187662306a36Sopenharmony_ci SND_SOC_DAPM_OUT_DRV("HPO OneBit", SND_SOC_NOPM, 0, 0, NULL, 0), 187762306a36Sopenharmony_ci SND_SOC_DAPM_DEMUX("HPO Signal Demux", SND_SOC_NOPM, 0, 0, &rt5682_hpo_sig_demux), 187862306a36Sopenharmony_ci 187962306a36Sopenharmony_ci /* CLK DET */ 188062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682_CLK_DET, 188162306a36Sopenharmony_ci RT5682_SYS_CLK_DET_SFT, 0, NULL, 0), 188262306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682_CLK_DET, 188362306a36Sopenharmony_ci RT5682_PLL1_CLK_DET_SFT, 0, NULL, 0), 188462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET PLL2", RT5682_CLK_DET, 188562306a36Sopenharmony_ci RT5682_PLL2_CLK_DET_SFT, 0, NULL, 0), 188662306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET", RT5682_CLK_DET, 188762306a36Sopenharmony_ci RT5682_POW_CLK_DET_SFT, 0, NULL, 0), 188862306a36Sopenharmony_ci 188962306a36Sopenharmony_ci /* Output Lines */ 189062306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOL"), 189162306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOR"), 189262306a36Sopenharmony_ci}; 189362306a36Sopenharmony_ci 189462306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5682_dapm_routes[] = { 189562306a36Sopenharmony_ci /*PLL*/ 189662306a36Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1}, 189762306a36Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2}, 189862306a36Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2}, 189962306a36Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1}, 190062306a36Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2}, 190162306a36Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2}, 190262306a36Sopenharmony_ci 190362306a36Sopenharmony_ci /*ASRC*/ 190462306a36Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc}, 190562306a36Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc}, 190662306a36Sopenharmony_ci {"ADC STO1 ASRC", NULL, "AD ASRC"}, 190762306a36Sopenharmony_ci {"ADC STO1 ASRC", NULL, "DA ASRC"}, 190862306a36Sopenharmony_ci {"ADC STO1 ASRC", NULL, "CLKDET"}, 190962306a36Sopenharmony_ci {"DAC STO1 ASRC", NULL, "AD ASRC"}, 191062306a36Sopenharmony_ci {"DAC STO1 ASRC", NULL, "DA ASRC"}, 191162306a36Sopenharmony_ci {"DAC STO1 ASRC", NULL, "CLKDET"}, 191262306a36Sopenharmony_ci 191362306a36Sopenharmony_ci /*Vref*/ 191462306a36Sopenharmony_ci {"MICBIAS1", NULL, "Vref1"}, 191562306a36Sopenharmony_ci {"MICBIAS2", NULL, "Vref1"}, 191662306a36Sopenharmony_ci 191762306a36Sopenharmony_ci {"CLKDET SYS", NULL, "CLKDET"}, 191862306a36Sopenharmony_ci 191962306a36Sopenharmony_ci {"BST1 CBJ", NULL, "IN1P"}, 192062306a36Sopenharmony_ci 192162306a36Sopenharmony_ci {"RECMIX1L", "CBJ Switch", "BST1 CBJ"}, 192262306a36Sopenharmony_ci {"RECMIX1L", NULL, "RECMIX1L Power"}, 192362306a36Sopenharmony_ci 192462306a36Sopenharmony_ci {"ADC1 L", NULL, "RECMIX1L"}, 192562306a36Sopenharmony_ci {"ADC1 L", NULL, "ADC1 L Power"}, 192662306a36Sopenharmony_ci {"ADC1 L", NULL, "ADC1 clock"}, 192762306a36Sopenharmony_ci 192862306a36Sopenharmony_ci {"DMIC L1", NULL, "DMIC CLK"}, 192962306a36Sopenharmony_ci {"DMIC L1", NULL, "DMIC1 Power"}, 193062306a36Sopenharmony_ci {"DMIC R1", NULL, "DMIC CLK"}, 193162306a36Sopenharmony_ci {"DMIC R1", NULL, "DMIC1 Power"}, 193262306a36Sopenharmony_ci {"DMIC CLK", NULL, "DMIC ASRC"}, 193362306a36Sopenharmony_ci 193462306a36Sopenharmony_ci {"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"}, 193562306a36Sopenharmony_ci {"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"}, 193662306a36Sopenharmony_ci {"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"}, 193762306a36Sopenharmony_ci {"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"}, 193862306a36Sopenharmony_ci 193962306a36Sopenharmony_ci {"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"}, 194062306a36Sopenharmony_ci {"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"}, 194162306a36Sopenharmony_ci {"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"}, 194262306a36Sopenharmony_ci {"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"}, 194362306a36Sopenharmony_ci 194462306a36Sopenharmony_ci {"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"}, 194562306a36Sopenharmony_ci {"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"}, 194662306a36Sopenharmony_ci {"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"}, 194762306a36Sopenharmony_ci {"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"}, 194862306a36Sopenharmony_ci 194962306a36Sopenharmony_ci {"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"}, 195062306a36Sopenharmony_ci {"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"}, 195162306a36Sopenharmony_ci {"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"}, 195262306a36Sopenharmony_ci 195362306a36Sopenharmony_ci {"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"}, 195462306a36Sopenharmony_ci {"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"}, 195562306a36Sopenharmony_ci {"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"}, 195662306a36Sopenharmony_ci 195762306a36Sopenharmony_ci {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"}, 195862306a36Sopenharmony_ci {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"}, 195962306a36Sopenharmony_ci 196062306a36Sopenharmony_ci {"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 196162306a36Sopenharmony_ci {"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 196262306a36Sopenharmony_ci {"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 196362306a36Sopenharmony_ci {"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 196462306a36Sopenharmony_ci {"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 196562306a36Sopenharmony_ci {"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 196662306a36Sopenharmony_ci {"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 196762306a36Sopenharmony_ci {"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 196862306a36Sopenharmony_ci {"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 196962306a36Sopenharmony_ci {"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 197062306a36Sopenharmony_ci {"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 197162306a36Sopenharmony_ci {"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 197262306a36Sopenharmony_ci {"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 197362306a36Sopenharmony_ci {"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 197462306a36Sopenharmony_ci {"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 197562306a36Sopenharmony_ci {"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 197662306a36Sopenharmony_ci 197762306a36Sopenharmony_ci {"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"}, 197862306a36Sopenharmony_ci {"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"}, 197962306a36Sopenharmony_ci {"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"}, 198062306a36Sopenharmony_ci {"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"}, 198162306a36Sopenharmony_ci {"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"}, 198262306a36Sopenharmony_ci {"AIF1TX", NULL, "I2S1"}, 198362306a36Sopenharmony_ci {"AIF1TX", NULL, "ADCDAT Mux"}, 198462306a36Sopenharmony_ci {"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 198562306a36Sopenharmony_ci {"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 198662306a36Sopenharmony_ci {"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 198762306a36Sopenharmony_ci {"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 198862306a36Sopenharmony_ci {"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"}, 198962306a36Sopenharmony_ci {"AIF2TX", NULL, "ADCDAT Mux"}, 199062306a36Sopenharmony_ci 199162306a36Sopenharmony_ci {"SDWTX", NULL, "PLL2B"}, 199262306a36Sopenharmony_ci {"SDWTX", NULL, "PLL2F"}, 199362306a36Sopenharmony_ci {"SDWTX", NULL, "ADCDAT Mux"}, 199462306a36Sopenharmony_ci 199562306a36Sopenharmony_ci {"IF1 DAC1 L", NULL, "AIF1RX"}, 199662306a36Sopenharmony_ci {"IF1 DAC1 L", NULL, "I2S1"}, 199762306a36Sopenharmony_ci {"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"}, 199862306a36Sopenharmony_ci {"IF1 DAC1 R", NULL, "AIF1RX"}, 199962306a36Sopenharmony_ci {"IF1 DAC1 R", NULL, "I2S1"}, 200062306a36Sopenharmony_ci {"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"}, 200162306a36Sopenharmony_ci 200262306a36Sopenharmony_ci {"SOUND DAC L", NULL, "SDWRX"}, 200362306a36Sopenharmony_ci {"SOUND DAC L", NULL, "DAC Stereo1 Filter"}, 200462306a36Sopenharmony_ci {"SOUND DAC L", NULL, "PLL2B"}, 200562306a36Sopenharmony_ci {"SOUND DAC L", NULL, "PLL2F"}, 200662306a36Sopenharmony_ci {"SOUND DAC R", NULL, "SDWRX"}, 200762306a36Sopenharmony_ci {"SOUND DAC R", NULL, "DAC Stereo1 Filter"}, 200862306a36Sopenharmony_ci {"SOUND DAC R", NULL, "PLL2B"}, 200962306a36Sopenharmony_ci {"SOUND DAC R", NULL, "PLL2F"}, 201062306a36Sopenharmony_ci 201162306a36Sopenharmony_ci {"DAC L Mux", "IF1", "IF1 DAC1 L"}, 201262306a36Sopenharmony_ci {"DAC L Mux", "SOUND", "SOUND DAC L"}, 201362306a36Sopenharmony_ci {"DAC R Mux", "IF1", "IF1 DAC1 R"}, 201462306a36Sopenharmony_ci {"DAC R Mux", "SOUND", "SOUND DAC R"}, 201562306a36Sopenharmony_ci 201662306a36Sopenharmony_ci {"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"}, 201762306a36Sopenharmony_ci {"DAC1 MIXL", "DAC1 Switch", "DAC L Mux"}, 201862306a36Sopenharmony_ci {"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"}, 201962306a36Sopenharmony_ci {"DAC1 MIXR", "DAC1 Switch", "DAC R Mux"}, 202062306a36Sopenharmony_ci 202162306a36Sopenharmony_ci {"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"}, 202262306a36Sopenharmony_ci {"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"}, 202362306a36Sopenharmony_ci 202462306a36Sopenharmony_ci {"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"}, 202562306a36Sopenharmony_ci {"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"}, 202662306a36Sopenharmony_ci 202762306a36Sopenharmony_ci {"DAC L1 Source", "DAC1", "DAC1 MIXL"}, 202862306a36Sopenharmony_ci {"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"}, 202962306a36Sopenharmony_ci {"DAC R1 Source", "DAC1", "DAC1 MIXR"}, 203062306a36Sopenharmony_ci {"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"}, 203162306a36Sopenharmony_ci 203262306a36Sopenharmony_ci {"DAC L1", NULL, "DAC L1 Source"}, 203362306a36Sopenharmony_ci {"DAC R1", NULL, "DAC R1 Source"}, 203462306a36Sopenharmony_ci 203562306a36Sopenharmony_ci {"DAC L1", NULL, "DAC 1 Clock"}, 203662306a36Sopenharmony_ci {"DAC R1", NULL, "DAC 1 Clock"}, 203762306a36Sopenharmony_ci 203862306a36Sopenharmony_ci {"HP Amp", NULL, "DAC L1"}, 203962306a36Sopenharmony_ci {"HP Amp", NULL, "DAC R1"}, 204062306a36Sopenharmony_ci {"HP Amp", NULL, "HP Amp L"}, 204162306a36Sopenharmony_ci {"HP Amp", NULL, "HP Amp R"}, 204262306a36Sopenharmony_ci {"HP Amp", NULL, "Capless"}, 204362306a36Sopenharmony_ci {"HP Amp", NULL, "Charge Pump"}, 204462306a36Sopenharmony_ci {"HP Amp", NULL, "CLKDET SYS"}, 204562306a36Sopenharmony_ci {"HP Amp", NULL, "Vref1"}, 204662306a36Sopenharmony_ci 204762306a36Sopenharmony_ci {"HPO Signal Demux", NULL, "HP Amp"}, 204862306a36Sopenharmony_ci 204962306a36Sopenharmony_ci {"HPO Legacy", "Legacy", "HPO Signal Demux"}, 205062306a36Sopenharmony_ci {"HPO OneBit", "OneBit", "HPO Signal Demux"}, 205162306a36Sopenharmony_ci 205262306a36Sopenharmony_ci {"HPOL Playback", "Switch", "HPO Legacy"}, 205362306a36Sopenharmony_ci {"HPOR Playback", "Switch", "HPO Legacy"}, 205462306a36Sopenharmony_ci 205562306a36Sopenharmony_ci {"HPOL", NULL, "HPOL Playback"}, 205662306a36Sopenharmony_ci {"HPOR", NULL, "HPOR Playback"}, 205762306a36Sopenharmony_ci {"HPOL", NULL, "HPO OneBit"}, 205862306a36Sopenharmony_ci {"HPOR", NULL, "HPO OneBit"}, 205962306a36Sopenharmony_ci}; 206062306a36Sopenharmony_ci 206162306a36Sopenharmony_cistatic int rt5682_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 206262306a36Sopenharmony_ci unsigned int rx_mask, int slots, int slot_width) 206362306a36Sopenharmony_ci{ 206462306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 206562306a36Sopenharmony_ci unsigned int cl, val = 0; 206662306a36Sopenharmony_ci 206762306a36Sopenharmony_ci if (tx_mask || rx_mask) 206862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2, 206962306a36Sopenharmony_ci RT5682_TDM_EN, RT5682_TDM_EN); 207062306a36Sopenharmony_ci else 207162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2, 207262306a36Sopenharmony_ci RT5682_TDM_EN, 0); 207362306a36Sopenharmony_ci 207462306a36Sopenharmony_ci switch (slots) { 207562306a36Sopenharmony_ci case 4: 207662306a36Sopenharmony_ci val |= RT5682_TDM_TX_CH_4; 207762306a36Sopenharmony_ci val |= RT5682_TDM_RX_CH_4; 207862306a36Sopenharmony_ci break; 207962306a36Sopenharmony_ci case 6: 208062306a36Sopenharmony_ci val |= RT5682_TDM_TX_CH_6; 208162306a36Sopenharmony_ci val |= RT5682_TDM_RX_CH_6; 208262306a36Sopenharmony_ci break; 208362306a36Sopenharmony_ci case 8: 208462306a36Sopenharmony_ci val |= RT5682_TDM_TX_CH_8; 208562306a36Sopenharmony_ci val |= RT5682_TDM_RX_CH_8; 208662306a36Sopenharmony_ci break; 208762306a36Sopenharmony_ci case 2: 208862306a36Sopenharmony_ci break; 208962306a36Sopenharmony_ci default: 209062306a36Sopenharmony_ci return -EINVAL; 209162306a36Sopenharmony_ci } 209262306a36Sopenharmony_ci 209362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_CTRL, 209462306a36Sopenharmony_ci RT5682_TDM_TX_CH_MASK | RT5682_TDM_RX_CH_MASK, val); 209562306a36Sopenharmony_ci 209662306a36Sopenharmony_ci switch (slot_width) { 209762306a36Sopenharmony_ci case 8: 209862306a36Sopenharmony_ci if (tx_mask || rx_mask) 209962306a36Sopenharmony_ci return -EINVAL; 210062306a36Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_8 | RT5682_I2S1_RX_CHL_8; 210162306a36Sopenharmony_ci break; 210262306a36Sopenharmony_ci case 16: 210362306a36Sopenharmony_ci val = RT5682_TDM_CL_16; 210462306a36Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_16 | RT5682_I2S1_RX_CHL_16; 210562306a36Sopenharmony_ci break; 210662306a36Sopenharmony_ci case 20: 210762306a36Sopenharmony_ci val = RT5682_TDM_CL_20; 210862306a36Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_20 | RT5682_I2S1_RX_CHL_20; 210962306a36Sopenharmony_ci break; 211062306a36Sopenharmony_ci case 24: 211162306a36Sopenharmony_ci val = RT5682_TDM_CL_24; 211262306a36Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_24 | RT5682_I2S1_RX_CHL_24; 211362306a36Sopenharmony_ci break; 211462306a36Sopenharmony_ci case 32: 211562306a36Sopenharmony_ci val = RT5682_TDM_CL_32; 211662306a36Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_32 | RT5682_I2S1_RX_CHL_32; 211762306a36Sopenharmony_ci break; 211862306a36Sopenharmony_ci default: 211962306a36Sopenharmony_ci return -EINVAL; 212062306a36Sopenharmony_ci } 212162306a36Sopenharmony_ci 212262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 212362306a36Sopenharmony_ci RT5682_TDM_CL_MASK, val); 212462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S1_SDP, 212562306a36Sopenharmony_ci RT5682_I2S1_TX_CHL_MASK | RT5682_I2S1_RX_CHL_MASK, cl); 212662306a36Sopenharmony_ci 212762306a36Sopenharmony_ci return 0; 212862306a36Sopenharmony_ci} 212962306a36Sopenharmony_ci 213062306a36Sopenharmony_cistatic int rt5682_hw_params(struct snd_pcm_substream *substream, 213162306a36Sopenharmony_ci struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 213262306a36Sopenharmony_ci{ 213362306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 213462306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 213562306a36Sopenharmony_ci unsigned int len_1 = 0, len_2 = 0; 213662306a36Sopenharmony_ci int pre_div, frame_size; 213762306a36Sopenharmony_ci 213862306a36Sopenharmony_ci rt5682->lrck[dai->id] = params_rate(params); 213962306a36Sopenharmony_ci pre_div = rl6231_get_clk_info(rt5682->sysclk, rt5682->lrck[dai->id]); 214062306a36Sopenharmony_ci 214162306a36Sopenharmony_ci frame_size = snd_soc_params_to_frame_size(params); 214262306a36Sopenharmony_ci if (frame_size < 0) { 214362306a36Sopenharmony_ci dev_err(component->dev, "Unsupported frame size: %d\n", 214462306a36Sopenharmony_ci frame_size); 214562306a36Sopenharmony_ci return -EINVAL; 214662306a36Sopenharmony_ci } 214762306a36Sopenharmony_ci 214862306a36Sopenharmony_ci dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n", 214962306a36Sopenharmony_ci rt5682->lrck[dai->id], pre_div, dai->id); 215062306a36Sopenharmony_ci 215162306a36Sopenharmony_ci switch (params_width(params)) { 215262306a36Sopenharmony_ci case 16: 215362306a36Sopenharmony_ci break; 215462306a36Sopenharmony_ci case 20: 215562306a36Sopenharmony_ci len_1 |= RT5682_I2S1_DL_20; 215662306a36Sopenharmony_ci len_2 |= RT5682_I2S2_DL_20; 215762306a36Sopenharmony_ci break; 215862306a36Sopenharmony_ci case 24: 215962306a36Sopenharmony_ci len_1 |= RT5682_I2S1_DL_24; 216062306a36Sopenharmony_ci len_2 |= RT5682_I2S2_DL_24; 216162306a36Sopenharmony_ci break; 216262306a36Sopenharmony_ci case 32: 216362306a36Sopenharmony_ci len_1 |= RT5682_I2S1_DL_32; 216462306a36Sopenharmony_ci len_2 |= RT5682_I2S2_DL_24; 216562306a36Sopenharmony_ci break; 216662306a36Sopenharmony_ci case 8: 216762306a36Sopenharmony_ci len_1 |= RT5682_I2S2_DL_8; 216862306a36Sopenharmony_ci len_2 |= RT5682_I2S2_DL_8; 216962306a36Sopenharmony_ci break; 217062306a36Sopenharmony_ci default: 217162306a36Sopenharmony_ci return -EINVAL; 217262306a36Sopenharmony_ci } 217362306a36Sopenharmony_ci 217462306a36Sopenharmony_ci switch (dai->id) { 217562306a36Sopenharmony_ci case RT5682_AIF1: 217662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S1_SDP, 217762306a36Sopenharmony_ci RT5682_I2S1_DL_MASK, len_1); 217862306a36Sopenharmony_ci if (rt5682->master[RT5682_AIF1]) { 217962306a36Sopenharmony_ci snd_soc_component_update_bits(component, 218062306a36Sopenharmony_ci RT5682_ADDA_CLK_1, RT5682_I2S_M_DIV_MASK | 218162306a36Sopenharmony_ci RT5682_I2S_CLK_SRC_MASK, 218262306a36Sopenharmony_ci pre_div << RT5682_I2S_M_DIV_SFT | 218362306a36Sopenharmony_ci (rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT); 218462306a36Sopenharmony_ci } 218562306a36Sopenharmony_ci if (params_channels(params) == 1) /* mono mode */ 218662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 218762306a36Sopenharmony_ci RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK, 218862306a36Sopenharmony_ci RT5682_I2S1_MONO_EN); 218962306a36Sopenharmony_ci else 219062306a36Sopenharmony_ci snd_soc_component_update_bits(component, 219162306a36Sopenharmony_ci RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK, 219262306a36Sopenharmony_ci RT5682_I2S1_MONO_DIS); 219362306a36Sopenharmony_ci break; 219462306a36Sopenharmony_ci case RT5682_AIF2: 219562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S2_SDP, 219662306a36Sopenharmony_ci RT5682_I2S2_DL_MASK, len_2); 219762306a36Sopenharmony_ci if (rt5682->master[RT5682_AIF2]) { 219862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 219962306a36Sopenharmony_ci RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_M_PD_MASK, 220062306a36Sopenharmony_ci pre_div << RT5682_I2S2_M_PD_SFT); 220162306a36Sopenharmony_ci } 220262306a36Sopenharmony_ci if (params_channels(params) == 1) /* mono mode */ 220362306a36Sopenharmony_ci snd_soc_component_update_bits(component, 220462306a36Sopenharmony_ci RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK, 220562306a36Sopenharmony_ci RT5682_I2S2_MONO_EN); 220662306a36Sopenharmony_ci else 220762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 220862306a36Sopenharmony_ci RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK, 220962306a36Sopenharmony_ci RT5682_I2S2_MONO_DIS); 221062306a36Sopenharmony_ci break; 221162306a36Sopenharmony_ci default: 221262306a36Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 221362306a36Sopenharmony_ci return -EINVAL; 221462306a36Sopenharmony_ci } 221562306a36Sopenharmony_ci 221662306a36Sopenharmony_ci return 0; 221762306a36Sopenharmony_ci} 221862306a36Sopenharmony_ci 221962306a36Sopenharmony_cistatic int rt5682_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) 222062306a36Sopenharmony_ci{ 222162306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 222262306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 222362306a36Sopenharmony_ci unsigned int reg_val = 0, tdm_ctrl = 0; 222462306a36Sopenharmony_ci 222562306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 222662306a36Sopenharmony_ci case SND_SOC_DAIFMT_CBM_CFM: 222762306a36Sopenharmony_ci rt5682->master[dai->id] = 1; 222862306a36Sopenharmony_ci break; 222962306a36Sopenharmony_ci case SND_SOC_DAIFMT_CBS_CFS: 223062306a36Sopenharmony_ci rt5682->master[dai->id] = 0; 223162306a36Sopenharmony_ci break; 223262306a36Sopenharmony_ci default: 223362306a36Sopenharmony_ci return -EINVAL; 223462306a36Sopenharmony_ci } 223562306a36Sopenharmony_ci 223662306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 223762306a36Sopenharmony_ci case SND_SOC_DAIFMT_NB_NF: 223862306a36Sopenharmony_ci break; 223962306a36Sopenharmony_ci case SND_SOC_DAIFMT_IB_NF: 224062306a36Sopenharmony_ci reg_val |= RT5682_I2S_BP_INV; 224162306a36Sopenharmony_ci tdm_ctrl |= RT5682_TDM_S_BP_INV; 224262306a36Sopenharmony_ci break; 224362306a36Sopenharmony_ci case SND_SOC_DAIFMT_NB_IF: 224462306a36Sopenharmony_ci if (dai->id == RT5682_AIF1) 224562306a36Sopenharmony_ci tdm_ctrl |= RT5682_TDM_S_LP_INV | RT5682_TDM_M_BP_INV; 224662306a36Sopenharmony_ci else 224762306a36Sopenharmony_ci return -EINVAL; 224862306a36Sopenharmony_ci break; 224962306a36Sopenharmony_ci case SND_SOC_DAIFMT_IB_IF: 225062306a36Sopenharmony_ci if (dai->id == RT5682_AIF1) 225162306a36Sopenharmony_ci tdm_ctrl |= RT5682_TDM_S_BP_INV | RT5682_TDM_S_LP_INV | 225262306a36Sopenharmony_ci RT5682_TDM_M_BP_INV | RT5682_TDM_M_LP_INV; 225362306a36Sopenharmony_ci else 225462306a36Sopenharmony_ci return -EINVAL; 225562306a36Sopenharmony_ci break; 225662306a36Sopenharmony_ci default: 225762306a36Sopenharmony_ci return -EINVAL; 225862306a36Sopenharmony_ci } 225962306a36Sopenharmony_ci 226062306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 226162306a36Sopenharmony_ci case SND_SOC_DAIFMT_I2S: 226262306a36Sopenharmony_ci break; 226362306a36Sopenharmony_ci case SND_SOC_DAIFMT_LEFT_J: 226462306a36Sopenharmony_ci reg_val |= RT5682_I2S_DF_LEFT; 226562306a36Sopenharmony_ci tdm_ctrl |= RT5682_TDM_DF_LEFT; 226662306a36Sopenharmony_ci break; 226762306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_A: 226862306a36Sopenharmony_ci reg_val |= RT5682_I2S_DF_PCM_A; 226962306a36Sopenharmony_ci tdm_ctrl |= RT5682_TDM_DF_PCM_A; 227062306a36Sopenharmony_ci break; 227162306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_B: 227262306a36Sopenharmony_ci reg_val |= RT5682_I2S_DF_PCM_B; 227362306a36Sopenharmony_ci tdm_ctrl |= RT5682_TDM_DF_PCM_B; 227462306a36Sopenharmony_ci break; 227562306a36Sopenharmony_ci default: 227662306a36Sopenharmony_ci return -EINVAL; 227762306a36Sopenharmony_ci } 227862306a36Sopenharmony_ci 227962306a36Sopenharmony_ci switch (dai->id) { 228062306a36Sopenharmony_ci case RT5682_AIF1: 228162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S1_SDP, 228262306a36Sopenharmony_ci RT5682_I2S_DF_MASK, reg_val); 228362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 228462306a36Sopenharmony_ci RT5682_TDM_MS_MASK | RT5682_TDM_S_BP_MASK | 228562306a36Sopenharmony_ci RT5682_TDM_DF_MASK | RT5682_TDM_M_BP_MASK | 228662306a36Sopenharmony_ci RT5682_TDM_M_LP_MASK | RT5682_TDM_S_LP_MASK, 228762306a36Sopenharmony_ci tdm_ctrl | rt5682->master[dai->id]); 228862306a36Sopenharmony_ci break; 228962306a36Sopenharmony_ci case RT5682_AIF2: 229062306a36Sopenharmony_ci if (rt5682->master[dai->id] == 0) 229162306a36Sopenharmony_ci reg_val |= RT5682_I2S2_MS_S; 229262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S2_SDP, 229362306a36Sopenharmony_ci RT5682_I2S2_MS_MASK | RT5682_I2S_BP_MASK | 229462306a36Sopenharmony_ci RT5682_I2S_DF_MASK, reg_val); 229562306a36Sopenharmony_ci break; 229662306a36Sopenharmony_ci default: 229762306a36Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 229862306a36Sopenharmony_ci return -EINVAL; 229962306a36Sopenharmony_ci } 230062306a36Sopenharmony_ci return 0; 230162306a36Sopenharmony_ci} 230262306a36Sopenharmony_ci 230362306a36Sopenharmony_cistatic int rt5682_set_component_sysclk(struct snd_soc_component *component, 230462306a36Sopenharmony_ci int clk_id, int source, unsigned int freq, int dir) 230562306a36Sopenharmony_ci{ 230662306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 230762306a36Sopenharmony_ci unsigned int reg_val = 0, src = 0; 230862306a36Sopenharmony_ci 230962306a36Sopenharmony_ci if (freq == rt5682->sysclk && clk_id == rt5682->sysclk_src) 231062306a36Sopenharmony_ci return 0; 231162306a36Sopenharmony_ci 231262306a36Sopenharmony_ci switch (clk_id) { 231362306a36Sopenharmony_ci case RT5682_SCLK_S_MCLK: 231462306a36Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_MCLK; 231562306a36Sopenharmony_ci src = RT5682_CLK_SRC_MCLK; 231662306a36Sopenharmony_ci break; 231762306a36Sopenharmony_ci case RT5682_SCLK_S_PLL1: 231862306a36Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_PLL1; 231962306a36Sopenharmony_ci src = RT5682_CLK_SRC_PLL1; 232062306a36Sopenharmony_ci break; 232162306a36Sopenharmony_ci case RT5682_SCLK_S_PLL2: 232262306a36Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_PLL2; 232362306a36Sopenharmony_ci src = RT5682_CLK_SRC_PLL2; 232462306a36Sopenharmony_ci break; 232562306a36Sopenharmony_ci case RT5682_SCLK_S_RCCLK: 232662306a36Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_RCCLK; 232762306a36Sopenharmony_ci src = RT5682_CLK_SRC_RCCLK; 232862306a36Sopenharmony_ci break; 232962306a36Sopenharmony_ci default: 233062306a36Sopenharmony_ci dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); 233162306a36Sopenharmony_ci return -EINVAL; 233262306a36Sopenharmony_ci } 233362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_GLB_CLK, 233462306a36Sopenharmony_ci RT5682_SCLK_SRC_MASK, reg_val); 233562306a36Sopenharmony_ci 233662306a36Sopenharmony_ci if (rt5682->master[RT5682_AIF2]) { 233762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 233862306a36Sopenharmony_ci RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_SRC_MASK, 233962306a36Sopenharmony_ci src << RT5682_I2S2_SRC_SFT); 234062306a36Sopenharmony_ci } 234162306a36Sopenharmony_ci 234262306a36Sopenharmony_ci rt5682->sysclk = freq; 234362306a36Sopenharmony_ci rt5682->sysclk_src = clk_id; 234462306a36Sopenharmony_ci 234562306a36Sopenharmony_ci dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", 234662306a36Sopenharmony_ci freq, clk_id); 234762306a36Sopenharmony_ci 234862306a36Sopenharmony_ci return 0; 234962306a36Sopenharmony_ci} 235062306a36Sopenharmony_ci 235162306a36Sopenharmony_cistatic int rt5682_set_component_pll(struct snd_soc_component *component, 235262306a36Sopenharmony_ci int pll_id, int source, unsigned int freq_in, 235362306a36Sopenharmony_ci unsigned int freq_out) 235462306a36Sopenharmony_ci{ 235562306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 235662306a36Sopenharmony_ci struct rl6231_pll_code pll_code, pll2f_code, pll2b_code; 235762306a36Sopenharmony_ci unsigned int pll2_fout1, pll2_ps_val; 235862306a36Sopenharmony_ci int ret; 235962306a36Sopenharmony_ci 236062306a36Sopenharmony_ci if (source == rt5682->pll_src[pll_id] && 236162306a36Sopenharmony_ci freq_in == rt5682->pll_in[pll_id] && 236262306a36Sopenharmony_ci freq_out == rt5682->pll_out[pll_id]) 236362306a36Sopenharmony_ci return 0; 236462306a36Sopenharmony_ci 236562306a36Sopenharmony_ci if (!freq_in || !freq_out) { 236662306a36Sopenharmony_ci dev_dbg(component->dev, "PLL disabled\n"); 236762306a36Sopenharmony_ci 236862306a36Sopenharmony_ci rt5682->pll_in[pll_id] = 0; 236962306a36Sopenharmony_ci rt5682->pll_out[pll_id] = 0; 237062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_GLB_CLK, 237162306a36Sopenharmony_ci RT5682_SCLK_SRC_MASK, RT5682_SCLK_SRC_MCLK); 237262306a36Sopenharmony_ci return 0; 237362306a36Sopenharmony_ci } 237462306a36Sopenharmony_ci 237562306a36Sopenharmony_ci if (pll_id == RT5682_PLL2) { 237662306a36Sopenharmony_ci switch (source) { 237762306a36Sopenharmony_ci case RT5682_PLL2_S_MCLK: 237862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 237962306a36Sopenharmony_ci RT5682_GLB_CLK, RT5682_PLL2_SRC_MASK, 238062306a36Sopenharmony_ci RT5682_PLL2_SRC_MCLK); 238162306a36Sopenharmony_ci break; 238262306a36Sopenharmony_ci default: 238362306a36Sopenharmony_ci dev_err(component->dev, "Unknown PLL2 Source %d\n", 238462306a36Sopenharmony_ci source); 238562306a36Sopenharmony_ci return -EINVAL; 238662306a36Sopenharmony_ci } 238762306a36Sopenharmony_ci 238862306a36Sopenharmony_ci /** 238962306a36Sopenharmony_ci * PLL2 concatenates 2 PLL units. 239062306a36Sopenharmony_ci * We suggest the Fout of the front PLL is 3.84MHz. 239162306a36Sopenharmony_ci */ 239262306a36Sopenharmony_ci pll2_fout1 = 3840000; 239362306a36Sopenharmony_ci ret = rl6231_pll_calc(freq_in, pll2_fout1, &pll2f_code); 239462306a36Sopenharmony_ci if (ret < 0) { 239562306a36Sopenharmony_ci dev_err(component->dev, "Unsupported input clock %d\n", 239662306a36Sopenharmony_ci freq_in); 239762306a36Sopenharmony_ci return ret; 239862306a36Sopenharmony_ci } 239962306a36Sopenharmony_ci dev_dbg(component->dev, "PLL2F: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n", 240062306a36Sopenharmony_ci freq_in, pll2_fout1, 240162306a36Sopenharmony_ci pll2f_code.m_bp, 240262306a36Sopenharmony_ci (pll2f_code.m_bp ? 0 : pll2f_code.m_code), 240362306a36Sopenharmony_ci pll2f_code.n_code, pll2f_code.k_code); 240462306a36Sopenharmony_ci 240562306a36Sopenharmony_ci ret = rl6231_pll_calc(pll2_fout1, freq_out, &pll2b_code); 240662306a36Sopenharmony_ci if (ret < 0) { 240762306a36Sopenharmony_ci dev_err(component->dev, "Unsupported input clock %d\n", 240862306a36Sopenharmony_ci pll2_fout1); 240962306a36Sopenharmony_ci return ret; 241062306a36Sopenharmony_ci } 241162306a36Sopenharmony_ci dev_dbg(component->dev, "PLL2B: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n", 241262306a36Sopenharmony_ci pll2_fout1, freq_out, 241362306a36Sopenharmony_ci pll2b_code.m_bp, 241462306a36Sopenharmony_ci (pll2b_code.m_bp ? 0 : pll2b_code.m_code), 241562306a36Sopenharmony_ci pll2b_code.n_code, pll2b_code.k_code); 241662306a36Sopenharmony_ci 241762306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL2_CTRL_1, 241862306a36Sopenharmony_ci pll2f_code.k_code << RT5682_PLL2F_K_SFT | 241962306a36Sopenharmony_ci pll2b_code.k_code << RT5682_PLL2B_K_SFT | 242062306a36Sopenharmony_ci pll2b_code.m_code); 242162306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL2_CTRL_2, 242262306a36Sopenharmony_ci pll2f_code.m_code << RT5682_PLL2F_M_SFT | 242362306a36Sopenharmony_ci pll2b_code.n_code); 242462306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL2_CTRL_3, 242562306a36Sopenharmony_ci pll2f_code.n_code << RT5682_PLL2F_N_SFT); 242662306a36Sopenharmony_ci 242762306a36Sopenharmony_ci if (freq_out == 22579200) 242862306a36Sopenharmony_ci pll2_ps_val = 1 << RT5682_PLL2B_SEL_PS_SFT; 242962306a36Sopenharmony_ci else 243062306a36Sopenharmony_ci pll2_ps_val = 1 << RT5682_PLL2B_PS_BYP_SFT; 243162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PLL2_CTRL_4, 243262306a36Sopenharmony_ci RT5682_PLL2B_SEL_PS_MASK | RT5682_PLL2B_PS_BYP_MASK | 243362306a36Sopenharmony_ci RT5682_PLL2B_M_BP_MASK | RT5682_PLL2F_M_BP_MASK | 0xf, 243462306a36Sopenharmony_ci pll2_ps_val | 243562306a36Sopenharmony_ci (pll2b_code.m_bp ? 1 : 0) << RT5682_PLL2B_M_BP_SFT | 243662306a36Sopenharmony_ci (pll2f_code.m_bp ? 1 : 0) << RT5682_PLL2F_M_BP_SFT | 243762306a36Sopenharmony_ci 0xf); 243862306a36Sopenharmony_ci } else { 243962306a36Sopenharmony_ci switch (source) { 244062306a36Sopenharmony_ci case RT5682_PLL1_S_MCLK: 244162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 244262306a36Sopenharmony_ci RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK, 244362306a36Sopenharmony_ci RT5682_PLL1_SRC_MCLK); 244462306a36Sopenharmony_ci break; 244562306a36Sopenharmony_ci case RT5682_PLL1_S_BCLK1: 244662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 244762306a36Sopenharmony_ci RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK, 244862306a36Sopenharmony_ci RT5682_PLL1_SRC_BCLK1); 244962306a36Sopenharmony_ci break; 245062306a36Sopenharmony_ci default: 245162306a36Sopenharmony_ci dev_err(component->dev, "Unknown PLL1 Source %d\n", 245262306a36Sopenharmony_ci source); 245362306a36Sopenharmony_ci return -EINVAL; 245462306a36Sopenharmony_ci } 245562306a36Sopenharmony_ci 245662306a36Sopenharmony_ci ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); 245762306a36Sopenharmony_ci if (ret < 0) { 245862306a36Sopenharmony_ci dev_err(component->dev, "Unsupported input clock %d\n", 245962306a36Sopenharmony_ci freq_in); 246062306a36Sopenharmony_ci return ret; 246162306a36Sopenharmony_ci } 246262306a36Sopenharmony_ci 246362306a36Sopenharmony_ci dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", 246462306a36Sopenharmony_ci pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), 246562306a36Sopenharmony_ci pll_code.n_code, pll_code.k_code); 246662306a36Sopenharmony_ci 246762306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL_CTRL_1, 246862306a36Sopenharmony_ci (pll_code.n_code << RT5682_PLL_N_SFT) | pll_code.k_code); 246962306a36Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL_CTRL_2, 247062306a36Sopenharmony_ci ((pll_code.m_bp ? 0 : pll_code.m_code) << RT5682_PLL_M_SFT) | 247162306a36Sopenharmony_ci ((pll_code.m_bp << RT5682_PLL_M_BP_SFT) | RT5682_PLL_RST)); 247262306a36Sopenharmony_ci } 247362306a36Sopenharmony_ci 247462306a36Sopenharmony_ci rt5682->pll_in[pll_id] = freq_in; 247562306a36Sopenharmony_ci rt5682->pll_out[pll_id] = freq_out; 247662306a36Sopenharmony_ci rt5682->pll_src[pll_id] = source; 247762306a36Sopenharmony_ci 247862306a36Sopenharmony_ci return 0; 247962306a36Sopenharmony_ci} 248062306a36Sopenharmony_ci 248162306a36Sopenharmony_cistatic int rt5682_set_bclk1_ratio(struct snd_soc_dai *dai, unsigned int ratio) 248262306a36Sopenharmony_ci{ 248362306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 248462306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 248562306a36Sopenharmony_ci 248662306a36Sopenharmony_ci rt5682->bclk[dai->id] = ratio; 248762306a36Sopenharmony_ci 248862306a36Sopenharmony_ci switch (ratio) { 248962306a36Sopenharmony_ci case 256: 249062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 249162306a36Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_256); 249262306a36Sopenharmony_ci break; 249362306a36Sopenharmony_ci case 128: 249462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 249562306a36Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_128); 249662306a36Sopenharmony_ci break; 249762306a36Sopenharmony_ci case 64: 249862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 249962306a36Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_64); 250062306a36Sopenharmony_ci break; 250162306a36Sopenharmony_ci case 32: 250262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 250362306a36Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_32); 250462306a36Sopenharmony_ci break; 250562306a36Sopenharmony_ci default: 250662306a36Sopenharmony_ci dev_err(dai->dev, "Invalid bclk1 ratio %d\n", ratio); 250762306a36Sopenharmony_ci return -EINVAL; 250862306a36Sopenharmony_ci } 250962306a36Sopenharmony_ci 251062306a36Sopenharmony_ci return 0; 251162306a36Sopenharmony_ci} 251262306a36Sopenharmony_ci 251362306a36Sopenharmony_cistatic int rt5682_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int ratio) 251462306a36Sopenharmony_ci{ 251562306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 251662306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 251762306a36Sopenharmony_ci 251862306a36Sopenharmony_ci rt5682->bclk[dai->id] = ratio; 251962306a36Sopenharmony_ci 252062306a36Sopenharmony_ci switch (ratio) { 252162306a36Sopenharmony_ci case 64: 252262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2, 252362306a36Sopenharmony_ci RT5682_I2S2_BCLK_MS2_MASK, 252462306a36Sopenharmony_ci RT5682_I2S2_BCLK_MS2_64); 252562306a36Sopenharmony_ci break; 252662306a36Sopenharmony_ci case 32: 252762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2, 252862306a36Sopenharmony_ci RT5682_I2S2_BCLK_MS2_MASK, 252962306a36Sopenharmony_ci RT5682_I2S2_BCLK_MS2_32); 253062306a36Sopenharmony_ci break; 253162306a36Sopenharmony_ci default: 253262306a36Sopenharmony_ci dev_err(dai->dev, "Invalid bclk2 ratio %d\n", ratio); 253362306a36Sopenharmony_ci return -EINVAL; 253462306a36Sopenharmony_ci } 253562306a36Sopenharmony_ci 253662306a36Sopenharmony_ci return 0; 253762306a36Sopenharmony_ci} 253862306a36Sopenharmony_ci 253962306a36Sopenharmony_cistatic int rt5682_set_bias_level(struct snd_soc_component *component, 254062306a36Sopenharmony_ci enum snd_soc_bias_level level) 254162306a36Sopenharmony_ci{ 254262306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 254362306a36Sopenharmony_ci 254462306a36Sopenharmony_ci switch (level) { 254562306a36Sopenharmony_ci case SND_SOC_BIAS_PREPARE: 254662306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1, 254762306a36Sopenharmony_ci RT5682_PWR_BG, RT5682_PWR_BG); 254862306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1, 254962306a36Sopenharmony_ci RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 255062306a36Sopenharmony_ci RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO); 255162306a36Sopenharmony_ci break; 255262306a36Sopenharmony_ci 255362306a36Sopenharmony_ci case SND_SOC_BIAS_STANDBY: 255462306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1, 255562306a36Sopenharmony_ci RT5682_DIG_GATE_CTRL, RT5682_DIG_GATE_CTRL); 255662306a36Sopenharmony_ci break; 255762306a36Sopenharmony_ci case SND_SOC_BIAS_OFF: 255862306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1, 255962306a36Sopenharmony_ci RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 0); 256062306a36Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1, 256162306a36Sopenharmony_ci RT5682_PWR_BG, 0); 256262306a36Sopenharmony_ci break; 256362306a36Sopenharmony_ci case SND_SOC_BIAS_ON: 256462306a36Sopenharmony_ci break; 256562306a36Sopenharmony_ci } 256662306a36Sopenharmony_ci 256762306a36Sopenharmony_ci return 0; 256862306a36Sopenharmony_ci} 256962306a36Sopenharmony_ci 257062306a36Sopenharmony_ci#ifdef CONFIG_COMMON_CLK 257162306a36Sopenharmony_ci#define CLK_PLL2_FIN 48000000 257262306a36Sopenharmony_ci#define CLK_48 48000 257362306a36Sopenharmony_ci#define CLK_44 44100 257462306a36Sopenharmony_ci 257562306a36Sopenharmony_cistatic bool rt5682_clk_check(struct rt5682_priv *rt5682) 257662306a36Sopenharmony_ci{ 257762306a36Sopenharmony_ci if (!rt5682->master[RT5682_AIF1]) { 257862306a36Sopenharmony_ci dev_dbg(rt5682->i2c_dev, "sysclk/dai not set correctly\n"); 257962306a36Sopenharmony_ci return false; 258062306a36Sopenharmony_ci } 258162306a36Sopenharmony_ci return true; 258262306a36Sopenharmony_ci} 258362306a36Sopenharmony_ci 258462306a36Sopenharmony_cistatic int rt5682_wclk_prepare(struct clk_hw *hw) 258562306a36Sopenharmony_ci{ 258662306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 258762306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 258862306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 258962306a36Sopenharmony_ci struct snd_soc_component *component; 259062306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm; 259162306a36Sopenharmony_ci 259262306a36Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 259362306a36Sopenharmony_ci return -EINVAL; 259462306a36Sopenharmony_ci 259562306a36Sopenharmony_ci component = rt5682->component; 259662306a36Sopenharmony_ci dapm = snd_soc_component_get_dapm(component); 259762306a36Sopenharmony_ci 259862306a36Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 259962306a36Sopenharmony_ci 260062306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "MICBIAS"); 260162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 260262306a36Sopenharmony_ci RT5682_PWR_MB, RT5682_PWR_MB); 260362306a36Sopenharmony_ci 260462306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "Vref2"); 260562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 260662306a36Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_FV2, 260762306a36Sopenharmony_ci RT5682_PWR_VREF2); 260862306a36Sopenharmony_ci usleep_range(55000, 60000); 260962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 261062306a36Sopenharmony_ci RT5682_PWR_FV2, RT5682_PWR_FV2); 261162306a36Sopenharmony_ci 261262306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "I2S1"); 261362306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2F"); 261462306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2B"); 261562306a36Sopenharmony_ci snd_soc_dapm_sync_unlocked(dapm); 261662306a36Sopenharmony_ci 261762306a36Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 261862306a36Sopenharmony_ci 261962306a36Sopenharmony_ci return 0; 262062306a36Sopenharmony_ci} 262162306a36Sopenharmony_ci 262262306a36Sopenharmony_cistatic void rt5682_wclk_unprepare(struct clk_hw *hw) 262362306a36Sopenharmony_ci{ 262462306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 262562306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 262662306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 262762306a36Sopenharmony_ci struct snd_soc_component *component; 262862306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm; 262962306a36Sopenharmony_ci 263062306a36Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 263162306a36Sopenharmony_ci return; 263262306a36Sopenharmony_ci 263362306a36Sopenharmony_ci component = rt5682->component; 263462306a36Sopenharmony_ci dapm = snd_soc_component_get_dapm(component); 263562306a36Sopenharmony_ci 263662306a36Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 263762306a36Sopenharmony_ci 263862306a36Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "MICBIAS"); 263962306a36Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "Vref2"); 264062306a36Sopenharmony_ci if (!rt5682->jack_type) 264162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 264262306a36Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_FV2 | 264362306a36Sopenharmony_ci RT5682_PWR_MB, 0); 264462306a36Sopenharmony_ci 264562306a36Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "I2S1"); 264662306a36Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2F"); 264762306a36Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2B"); 264862306a36Sopenharmony_ci snd_soc_dapm_sync_unlocked(dapm); 264962306a36Sopenharmony_ci 265062306a36Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 265162306a36Sopenharmony_ci} 265262306a36Sopenharmony_ci 265362306a36Sopenharmony_cistatic unsigned long rt5682_wclk_recalc_rate(struct clk_hw *hw, 265462306a36Sopenharmony_ci unsigned long parent_rate) 265562306a36Sopenharmony_ci{ 265662306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 265762306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 265862306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 265962306a36Sopenharmony_ci const char * const clk_name = clk_hw_get_name(hw); 266062306a36Sopenharmony_ci 266162306a36Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 266262306a36Sopenharmony_ci return 0; 266362306a36Sopenharmony_ci /* 266462306a36Sopenharmony_ci * Only accept to set wclk rate to 44.1k or 48kHz. 266562306a36Sopenharmony_ci */ 266662306a36Sopenharmony_ci if (rt5682->lrck[RT5682_AIF1] != CLK_48 && 266762306a36Sopenharmony_ci rt5682->lrck[RT5682_AIF1] != CLK_44) { 266862306a36Sopenharmony_ci dev_warn(rt5682->i2c_dev, "%s: clk %s only support %d or %d Hz output\n", 266962306a36Sopenharmony_ci __func__, clk_name, CLK_44, CLK_48); 267062306a36Sopenharmony_ci return 0; 267162306a36Sopenharmony_ci } 267262306a36Sopenharmony_ci 267362306a36Sopenharmony_ci return rt5682->lrck[RT5682_AIF1]; 267462306a36Sopenharmony_ci} 267562306a36Sopenharmony_ci 267662306a36Sopenharmony_cistatic long rt5682_wclk_round_rate(struct clk_hw *hw, unsigned long rate, 267762306a36Sopenharmony_ci unsigned long *parent_rate) 267862306a36Sopenharmony_ci{ 267962306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 268062306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 268162306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 268262306a36Sopenharmony_ci const char * const clk_name = clk_hw_get_name(hw); 268362306a36Sopenharmony_ci 268462306a36Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 268562306a36Sopenharmony_ci return -EINVAL; 268662306a36Sopenharmony_ci /* 268762306a36Sopenharmony_ci * Only accept to set wclk rate to 44.1k or 48kHz. 268862306a36Sopenharmony_ci * It will force to 48kHz if not both. 268962306a36Sopenharmony_ci */ 269062306a36Sopenharmony_ci if (rate != CLK_48 && rate != CLK_44) { 269162306a36Sopenharmony_ci dev_warn(rt5682->i2c_dev, "%s: clk %s only support %d or %d Hz output\n", 269262306a36Sopenharmony_ci __func__, clk_name, CLK_44, CLK_48); 269362306a36Sopenharmony_ci rate = CLK_48; 269462306a36Sopenharmony_ci } 269562306a36Sopenharmony_ci 269662306a36Sopenharmony_ci return rate; 269762306a36Sopenharmony_ci} 269862306a36Sopenharmony_ci 269962306a36Sopenharmony_cistatic int rt5682_wclk_set_rate(struct clk_hw *hw, unsigned long rate, 270062306a36Sopenharmony_ci unsigned long parent_rate) 270162306a36Sopenharmony_ci{ 270262306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 270362306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 270462306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 270562306a36Sopenharmony_ci struct snd_soc_component *component; 270662306a36Sopenharmony_ci struct clk_hw *parent_hw; 270762306a36Sopenharmony_ci const char * const clk_name = clk_hw_get_name(hw); 270862306a36Sopenharmony_ci int pre_div; 270962306a36Sopenharmony_ci unsigned int clk_pll2_out; 271062306a36Sopenharmony_ci 271162306a36Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 271262306a36Sopenharmony_ci return -EINVAL; 271362306a36Sopenharmony_ci 271462306a36Sopenharmony_ci component = rt5682->component; 271562306a36Sopenharmony_ci 271662306a36Sopenharmony_ci /* 271762306a36Sopenharmony_ci * Whether the wclk's parent clk (mclk) exists or not, please ensure 271862306a36Sopenharmony_ci * it is fixed or set to 48MHz before setting wclk rate. It's a 271962306a36Sopenharmony_ci * temporary limitation. Only accept 48MHz clk as the clk provider. 272062306a36Sopenharmony_ci * 272162306a36Sopenharmony_ci * It will set the codec anyway by assuming mclk is 48MHz. 272262306a36Sopenharmony_ci */ 272362306a36Sopenharmony_ci parent_hw = clk_hw_get_parent(hw); 272462306a36Sopenharmony_ci if (!parent_hw) 272562306a36Sopenharmony_ci dev_warn(rt5682->i2c_dev, 272662306a36Sopenharmony_ci "Parent mclk of wclk not acquired in driver. Please ensure mclk was provided as %d Hz.\n", 272762306a36Sopenharmony_ci CLK_PLL2_FIN); 272862306a36Sopenharmony_ci 272962306a36Sopenharmony_ci if (parent_rate != CLK_PLL2_FIN) 273062306a36Sopenharmony_ci dev_warn(rt5682->i2c_dev, "clk %s only support %d Hz input\n", 273162306a36Sopenharmony_ci clk_name, CLK_PLL2_FIN); 273262306a36Sopenharmony_ci 273362306a36Sopenharmony_ci /* 273462306a36Sopenharmony_ci * To achieve the rate conversion from 48MHz to 44.1k or 48kHz, 273562306a36Sopenharmony_ci * PLL2 is needed. 273662306a36Sopenharmony_ci */ 273762306a36Sopenharmony_ci clk_pll2_out = rate * 512; 273862306a36Sopenharmony_ci rt5682_set_component_pll(component, RT5682_PLL2, RT5682_PLL2_S_MCLK, 273962306a36Sopenharmony_ci CLK_PLL2_FIN, clk_pll2_out); 274062306a36Sopenharmony_ci 274162306a36Sopenharmony_ci rt5682_set_component_sysclk(component, RT5682_SCLK_S_PLL2, 0, 274262306a36Sopenharmony_ci clk_pll2_out, SND_SOC_CLOCK_IN); 274362306a36Sopenharmony_ci 274462306a36Sopenharmony_ci rt5682->lrck[RT5682_AIF1] = rate; 274562306a36Sopenharmony_ci 274662306a36Sopenharmony_ci pre_div = rl6231_get_clk_info(rt5682->sysclk, rate); 274762306a36Sopenharmony_ci 274862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1, 274962306a36Sopenharmony_ci RT5682_I2S_M_DIV_MASK | RT5682_I2S_CLK_SRC_MASK, 275062306a36Sopenharmony_ci pre_div << RT5682_I2S_M_DIV_SFT | 275162306a36Sopenharmony_ci (rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT); 275262306a36Sopenharmony_ci 275362306a36Sopenharmony_ci return 0; 275462306a36Sopenharmony_ci} 275562306a36Sopenharmony_ci 275662306a36Sopenharmony_cistatic unsigned long rt5682_bclk_recalc_rate(struct clk_hw *hw, 275762306a36Sopenharmony_ci unsigned long parent_rate) 275862306a36Sopenharmony_ci{ 275962306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 276062306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 276162306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_BCLK_IDX]); 276262306a36Sopenharmony_ci unsigned int bclks_per_wclk; 276362306a36Sopenharmony_ci 276462306a36Sopenharmony_ci regmap_read(rt5682->regmap, RT5682_TDM_TCON_CTRL, &bclks_per_wclk); 276562306a36Sopenharmony_ci 276662306a36Sopenharmony_ci switch (bclks_per_wclk & RT5682_TDM_BCLK_MS1_MASK) { 276762306a36Sopenharmony_ci case RT5682_TDM_BCLK_MS1_256: 276862306a36Sopenharmony_ci return parent_rate * 256; 276962306a36Sopenharmony_ci case RT5682_TDM_BCLK_MS1_128: 277062306a36Sopenharmony_ci return parent_rate * 128; 277162306a36Sopenharmony_ci case RT5682_TDM_BCLK_MS1_64: 277262306a36Sopenharmony_ci return parent_rate * 64; 277362306a36Sopenharmony_ci case RT5682_TDM_BCLK_MS1_32: 277462306a36Sopenharmony_ci return parent_rate * 32; 277562306a36Sopenharmony_ci default: 277662306a36Sopenharmony_ci return 0; 277762306a36Sopenharmony_ci } 277862306a36Sopenharmony_ci} 277962306a36Sopenharmony_ci 278062306a36Sopenharmony_cistatic unsigned long rt5682_bclk_get_factor(unsigned long rate, 278162306a36Sopenharmony_ci unsigned long parent_rate) 278262306a36Sopenharmony_ci{ 278362306a36Sopenharmony_ci unsigned long factor; 278462306a36Sopenharmony_ci 278562306a36Sopenharmony_ci factor = rate / parent_rate; 278662306a36Sopenharmony_ci if (factor < 64) 278762306a36Sopenharmony_ci return 32; 278862306a36Sopenharmony_ci else if (factor < 128) 278962306a36Sopenharmony_ci return 64; 279062306a36Sopenharmony_ci else if (factor < 256) 279162306a36Sopenharmony_ci return 128; 279262306a36Sopenharmony_ci else 279362306a36Sopenharmony_ci return 256; 279462306a36Sopenharmony_ci} 279562306a36Sopenharmony_ci 279662306a36Sopenharmony_cistatic long rt5682_bclk_round_rate(struct clk_hw *hw, unsigned long rate, 279762306a36Sopenharmony_ci unsigned long *parent_rate) 279862306a36Sopenharmony_ci{ 279962306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 280062306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 280162306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_BCLK_IDX]); 280262306a36Sopenharmony_ci unsigned long factor; 280362306a36Sopenharmony_ci 280462306a36Sopenharmony_ci if (!*parent_rate || !rt5682_clk_check(rt5682)) 280562306a36Sopenharmony_ci return -EINVAL; 280662306a36Sopenharmony_ci 280762306a36Sopenharmony_ci /* 280862306a36Sopenharmony_ci * BCLK rates are set as a multiplier of WCLK in HW. 280962306a36Sopenharmony_ci * We don't allow changing the parent WCLK. We just do 281062306a36Sopenharmony_ci * some rounding down based on the parent WCLK rate 281162306a36Sopenharmony_ci * and find the appropriate multiplier of BCLK to 281262306a36Sopenharmony_ci * get the rounded down BCLK value. 281362306a36Sopenharmony_ci */ 281462306a36Sopenharmony_ci factor = rt5682_bclk_get_factor(rate, *parent_rate); 281562306a36Sopenharmony_ci 281662306a36Sopenharmony_ci return *parent_rate * factor; 281762306a36Sopenharmony_ci} 281862306a36Sopenharmony_ci 281962306a36Sopenharmony_cistatic int rt5682_bclk_set_rate(struct clk_hw *hw, unsigned long rate, 282062306a36Sopenharmony_ci unsigned long parent_rate) 282162306a36Sopenharmony_ci{ 282262306a36Sopenharmony_ci struct rt5682_priv *rt5682 = 282362306a36Sopenharmony_ci container_of(hw, struct rt5682_priv, 282462306a36Sopenharmony_ci dai_clks_hw[RT5682_DAI_BCLK_IDX]); 282562306a36Sopenharmony_ci struct snd_soc_component *component; 282662306a36Sopenharmony_ci struct snd_soc_dai *dai; 282762306a36Sopenharmony_ci unsigned long factor; 282862306a36Sopenharmony_ci 282962306a36Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 283062306a36Sopenharmony_ci return -EINVAL; 283162306a36Sopenharmony_ci 283262306a36Sopenharmony_ci component = rt5682->component; 283362306a36Sopenharmony_ci 283462306a36Sopenharmony_ci factor = rt5682_bclk_get_factor(rate, parent_rate); 283562306a36Sopenharmony_ci 283662306a36Sopenharmony_ci for_each_component_dais(component, dai) 283762306a36Sopenharmony_ci if (dai->id == RT5682_AIF1) 283862306a36Sopenharmony_ci return rt5682_set_bclk1_ratio(dai, factor); 283962306a36Sopenharmony_ci 284062306a36Sopenharmony_ci dev_err(rt5682->i2c_dev, "dai %d not found in component\n", 284162306a36Sopenharmony_ci RT5682_AIF1); 284262306a36Sopenharmony_ci return -ENODEV; 284362306a36Sopenharmony_ci} 284462306a36Sopenharmony_ci 284562306a36Sopenharmony_cistatic const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = { 284662306a36Sopenharmony_ci [RT5682_DAI_WCLK_IDX] = { 284762306a36Sopenharmony_ci .prepare = rt5682_wclk_prepare, 284862306a36Sopenharmony_ci .unprepare = rt5682_wclk_unprepare, 284962306a36Sopenharmony_ci .recalc_rate = rt5682_wclk_recalc_rate, 285062306a36Sopenharmony_ci .round_rate = rt5682_wclk_round_rate, 285162306a36Sopenharmony_ci .set_rate = rt5682_wclk_set_rate, 285262306a36Sopenharmony_ci }, 285362306a36Sopenharmony_ci [RT5682_DAI_BCLK_IDX] = { 285462306a36Sopenharmony_ci .recalc_rate = rt5682_bclk_recalc_rate, 285562306a36Sopenharmony_ci .round_rate = rt5682_bclk_round_rate, 285662306a36Sopenharmony_ci .set_rate = rt5682_bclk_set_rate, 285762306a36Sopenharmony_ci }, 285862306a36Sopenharmony_ci}; 285962306a36Sopenharmony_ci 286062306a36Sopenharmony_ciint rt5682_register_dai_clks(struct rt5682_priv *rt5682) 286162306a36Sopenharmony_ci{ 286262306a36Sopenharmony_ci struct device *dev = rt5682->i2c_dev; 286362306a36Sopenharmony_ci struct rt5682_platform_data *pdata = &rt5682->pdata; 286462306a36Sopenharmony_ci struct clk_hw *dai_clk_hw; 286562306a36Sopenharmony_ci int i, ret; 286662306a36Sopenharmony_ci 286762306a36Sopenharmony_ci for (i = 0; i < RT5682_DAI_NUM_CLKS; ++i) { 286862306a36Sopenharmony_ci struct clk_init_data init = { }; 286962306a36Sopenharmony_ci const struct clk_hw *parent; 287062306a36Sopenharmony_ci 287162306a36Sopenharmony_ci dai_clk_hw = &rt5682->dai_clks_hw[i]; 287262306a36Sopenharmony_ci 287362306a36Sopenharmony_ci switch (i) { 287462306a36Sopenharmony_ci case RT5682_DAI_WCLK_IDX: 287562306a36Sopenharmony_ci /* Make MCLK the parent of WCLK */ 287662306a36Sopenharmony_ci if (rt5682->mclk) { 287762306a36Sopenharmony_ci parent = __clk_get_hw(rt5682->mclk); 287862306a36Sopenharmony_ci init.parent_hws = &parent; 287962306a36Sopenharmony_ci init.num_parents = 1; 288062306a36Sopenharmony_ci } 288162306a36Sopenharmony_ci break; 288262306a36Sopenharmony_ci case RT5682_DAI_BCLK_IDX: 288362306a36Sopenharmony_ci /* Make WCLK the parent of BCLK */ 288462306a36Sopenharmony_ci parent = &rt5682->dai_clks_hw[RT5682_DAI_WCLK_IDX]; 288562306a36Sopenharmony_ci init.parent_hws = &parent; 288662306a36Sopenharmony_ci init.num_parents = 1; 288762306a36Sopenharmony_ci break; 288862306a36Sopenharmony_ci default: 288962306a36Sopenharmony_ci dev_err(dev, "Invalid clock index\n"); 289062306a36Sopenharmony_ci return -EINVAL; 289162306a36Sopenharmony_ci } 289262306a36Sopenharmony_ci 289362306a36Sopenharmony_ci init.name = pdata->dai_clk_names[i]; 289462306a36Sopenharmony_ci init.ops = &rt5682_dai_clk_ops[i]; 289562306a36Sopenharmony_ci init.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_GATE; 289662306a36Sopenharmony_ci dai_clk_hw->init = &init; 289762306a36Sopenharmony_ci 289862306a36Sopenharmony_ci ret = devm_clk_hw_register(dev, dai_clk_hw); 289962306a36Sopenharmony_ci if (ret) { 290062306a36Sopenharmony_ci dev_warn(dev, "Failed to register %s: %d\n", 290162306a36Sopenharmony_ci init.name, ret); 290262306a36Sopenharmony_ci return ret; 290362306a36Sopenharmony_ci } 290462306a36Sopenharmony_ci 290562306a36Sopenharmony_ci if (dev->of_node) { 290662306a36Sopenharmony_ci devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, 290762306a36Sopenharmony_ci dai_clk_hw); 290862306a36Sopenharmony_ci } else { 290962306a36Sopenharmony_ci ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw, 291062306a36Sopenharmony_ci init.name, 291162306a36Sopenharmony_ci dev_name(dev)); 291262306a36Sopenharmony_ci if (ret) 291362306a36Sopenharmony_ci return ret; 291462306a36Sopenharmony_ci } 291562306a36Sopenharmony_ci } 291662306a36Sopenharmony_ci 291762306a36Sopenharmony_ci return 0; 291862306a36Sopenharmony_ci} 291962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_register_dai_clks); 292062306a36Sopenharmony_ci#endif /* CONFIG_COMMON_CLK */ 292162306a36Sopenharmony_ci 292262306a36Sopenharmony_cistatic int rt5682_probe(struct snd_soc_component *component) 292362306a36Sopenharmony_ci{ 292462306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 292562306a36Sopenharmony_ci struct sdw_slave *slave; 292662306a36Sopenharmony_ci unsigned long time; 292762306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = &component->dapm; 292862306a36Sopenharmony_ci 292962306a36Sopenharmony_ci rt5682->component = component; 293062306a36Sopenharmony_ci 293162306a36Sopenharmony_ci if (rt5682->is_sdw) { 293262306a36Sopenharmony_ci slave = rt5682->slave; 293362306a36Sopenharmony_ci time = wait_for_completion_timeout( 293462306a36Sopenharmony_ci &slave->initialization_complete, 293562306a36Sopenharmony_ci msecs_to_jiffies(RT5682_PROBE_TIMEOUT)); 293662306a36Sopenharmony_ci if (!time) { 293762306a36Sopenharmony_ci dev_err(&slave->dev, "Initialization not complete, timed out\n"); 293862306a36Sopenharmony_ci return -ETIMEDOUT; 293962306a36Sopenharmony_ci } 294062306a36Sopenharmony_ci } 294162306a36Sopenharmony_ci 294262306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "MICBIAS"); 294362306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "Vref2"); 294462306a36Sopenharmony_ci snd_soc_dapm_sync(dapm); 294562306a36Sopenharmony_ci return 0; 294662306a36Sopenharmony_ci} 294762306a36Sopenharmony_ci 294862306a36Sopenharmony_cistatic void rt5682_remove(struct snd_soc_component *component) 294962306a36Sopenharmony_ci{ 295062306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 295162306a36Sopenharmony_ci 295262306a36Sopenharmony_ci rt5682_reset(rt5682); 295362306a36Sopenharmony_ci} 295462306a36Sopenharmony_ci 295562306a36Sopenharmony_ci#ifdef CONFIG_PM 295662306a36Sopenharmony_cistatic int rt5682_suspend(struct snd_soc_component *component) 295762306a36Sopenharmony_ci{ 295862306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 295962306a36Sopenharmony_ci unsigned int val; 296062306a36Sopenharmony_ci 296162306a36Sopenharmony_ci if (rt5682->is_sdw) 296262306a36Sopenharmony_ci return 0; 296362306a36Sopenharmony_ci 296462306a36Sopenharmony_ci if (rt5682->irq) 296562306a36Sopenharmony_ci disable_irq(rt5682->irq); 296662306a36Sopenharmony_ci 296762306a36Sopenharmony_ci cancel_delayed_work_sync(&rt5682->jack_detect_work); 296862306a36Sopenharmony_ci cancel_delayed_work_sync(&rt5682->jd_check_work); 296962306a36Sopenharmony_ci if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) { 297062306a36Sopenharmony_ci val = snd_soc_component_read(component, 297162306a36Sopenharmony_ci RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK; 297262306a36Sopenharmony_ci 297362306a36Sopenharmony_ci switch (val) { 297462306a36Sopenharmony_ci case 0x1: 297562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 297662306a36Sopenharmony_ci RT5682_SAR_SEL_MB1_MASK | RT5682_SAR_SEL_MB2_MASK, 297762306a36Sopenharmony_ci RT5682_SAR_SEL_MB1_NOSEL | RT5682_SAR_SEL_MB2_SEL); 297862306a36Sopenharmony_ci break; 297962306a36Sopenharmony_ci case 0x2: 298062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 298162306a36Sopenharmony_ci RT5682_SAR_SEL_MB1_MASK | RT5682_SAR_SEL_MB2_MASK, 298262306a36Sopenharmony_ci RT5682_SAR_SEL_MB1_SEL | RT5682_SAR_SEL_MB2_NOSEL); 298362306a36Sopenharmony_ci break; 298462306a36Sopenharmony_ci default: 298562306a36Sopenharmony_ci break; 298662306a36Sopenharmony_ci } 298762306a36Sopenharmony_ci 298862306a36Sopenharmony_ci /* enter SAR ADC power saving mode */ 298962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 299062306a36Sopenharmony_ci RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK | 299162306a36Sopenharmony_ci RT5682_SAR_SEL_MB1_MB2_MASK, 0); 299262306a36Sopenharmony_ci usleep_range(5000, 6000); 299362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 299462306a36Sopenharmony_ci RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK, 299562306a36Sopenharmony_ci RT5682_CTRL_MB1_REG | RT5682_CTRL_MB2_REG); 299662306a36Sopenharmony_ci usleep_range(10000, 12000); 299762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 299862306a36Sopenharmony_ci RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK, 299962306a36Sopenharmony_ci RT5682_SAR_BUTT_DET_EN | RT5682_SAR_BUTDET_POW_SAV); 300062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_HP_CHARGE_PUMP_1, 300162306a36Sopenharmony_ci RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0); 300262306a36Sopenharmony_ci } 300362306a36Sopenharmony_ci 300462306a36Sopenharmony_ci regcache_cache_only(rt5682->regmap, true); 300562306a36Sopenharmony_ci regcache_mark_dirty(rt5682->regmap); 300662306a36Sopenharmony_ci return 0; 300762306a36Sopenharmony_ci} 300862306a36Sopenharmony_ci 300962306a36Sopenharmony_cistatic int rt5682_resume(struct snd_soc_component *component) 301062306a36Sopenharmony_ci{ 301162306a36Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 301262306a36Sopenharmony_ci 301362306a36Sopenharmony_ci if (rt5682->is_sdw) 301462306a36Sopenharmony_ci return 0; 301562306a36Sopenharmony_ci 301662306a36Sopenharmony_ci regcache_cache_only(rt5682->regmap, false); 301762306a36Sopenharmony_ci regcache_sync(rt5682->regmap); 301862306a36Sopenharmony_ci 301962306a36Sopenharmony_ci if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) { 302062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 302162306a36Sopenharmony_ci RT5682_SAR_BUTDET_MODE_MASK | RT5682_SAR_SEL_MB1_MB2_MASK, 302262306a36Sopenharmony_ci RT5682_SAR_BUTDET_POW_NORM | RT5682_SAR_SEL_MB1_MB2_AUTO); 302362306a36Sopenharmony_ci usleep_range(5000, 6000); 302462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 302562306a36Sopenharmony_ci RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK, 302662306a36Sopenharmony_ci RT5682_CTRL_MB1_FSM | RT5682_CTRL_MB2_FSM); 302762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3, 302862306a36Sopenharmony_ci RT5682_PWR_CBJ, RT5682_PWR_CBJ); 302962306a36Sopenharmony_ci } 303062306a36Sopenharmony_ci 303162306a36Sopenharmony_ci rt5682->jack_type = 0; 303262306a36Sopenharmony_ci mod_delayed_work(system_power_efficient_wq, 303362306a36Sopenharmony_ci &rt5682->jack_detect_work, msecs_to_jiffies(0)); 303462306a36Sopenharmony_ci 303562306a36Sopenharmony_ci if (rt5682->irq) 303662306a36Sopenharmony_ci enable_irq(rt5682->irq); 303762306a36Sopenharmony_ci 303862306a36Sopenharmony_ci return 0; 303962306a36Sopenharmony_ci} 304062306a36Sopenharmony_ci#else 304162306a36Sopenharmony_ci#define rt5682_suspend NULL 304262306a36Sopenharmony_ci#define rt5682_resume NULL 304362306a36Sopenharmony_ci#endif 304462306a36Sopenharmony_ci 304562306a36Sopenharmony_ciconst struct snd_soc_dai_ops rt5682_aif1_dai_ops = { 304662306a36Sopenharmony_ci .hw_params = rt5682_hw_params, 304762306a36Sopenharmony_ci .set_fmt = rt5682_set_dai_fmt, 304862306a36Sopenharmony_ci .set_tdm_slot = rt5682_set_tdm_slot, 304962306a36Sopenharmony_ci .set_bclk_ratio = rt5682_set_bclk1_ratio, 305062306a36Sopenharmony_ci}; 305162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_aif1_dai_ops); 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_ciconst struct snd_soc_dai_ops rt5682_aif2_dai_ops = { 305462306a36Sopenharmony_ci .hw_params = rt5682_hw_params, 305562306a36Sopenharmony_ci .set_fmt = rt5682_set_dai_fmt, 305662306a36Sopenharmony_ci .set_bclk_ratio = rt5682_set_bclk2_ratio, 305762306a36Sopenharmony_ci}; 305862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_aif2_dai_ops); 305962306a36Sopenharmony_ci 306062306a36Sopenharmony_ciconst struct snd_soc_component_driver rt5682_soc_component_dev = { 306162306a36Sopenharmony_ci .probe = rt5682_probe, 306262306a36Sopenharmony_ci .remove = rt5682_remove, 306362306a36Sopenharmony_ci .suspend = rt5682_suspend, 306462306a36Sopenharmony_ci .resume = rt5682_resume, 306562306a36Sopenharmony_ci .set_bias_level = rt5682_set_bias_level, 306662306a36Sopenharmony_ci .controls = rt5682_snd_controls, 306762306a36Sopenharmony_ci .num_controls = ARRAY_SIZE(rt5682_snd_controls), 306862306a36Sopenharmony_ci .dapm_widgets = rt5682_dapm_widgets, 306962306a36Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(rt5682_dapm_widgets), 307062306a36Sopenharmony_ci .dapm_routes = rt5682_dapm_routes, 307162306a36Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(rt5682_dapm_routes), 307262306a36Sopenharmony_ci .set_sysclk = rt5682_set_component_sysclk, 307362306a36Sopenharmony_ci .set_pll = rt5682_set_component_pll, 307462306a36Sopenharmony_ci .set_jack = rt5682_set_jack_detect, 307562306a36Sopenharmony_ci .use_pmdown_time = 1, 307662306a36Sopenharmony_ci .endianness = 1, 307762306a36Sopenharmony_ci}; 307862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_soc_component_dev); 307962306a36Sopenharmony_ci 308062306a36Sopenharmony_ciint rt5682_parse_dt(struct rt5682_priv *rt5682, struct device *dev) 308162306a36Sopenharmony_ci{ 308262306a36Sopenharmony_ci 308362306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic1-data-pin", 308462306a36Sopenharmony_ci &rt5682->pdata.dmic1_data_pin); 308562306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic1-clk-pin", 308662306a36Sopenharmony_ci &rt5682->pdata.dmic1_clk_pin); 308762306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,jd-src", 308862306a36Sopenharmony_ci &rt5682->pdata.jd_src); 308962306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,btndet-delay", 309062306a36Sopenharmony_ci &rt5682->pdata.btndet_delay); 309162306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic-clk-rate-hz", 309262306a36Sopenharmony_ci &rt5682->pdata.dmic_clk_rate); 309362306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic-delay-ms", 309462306a36Sopenharmony_ci &rt5682->pdata.dmic_delay); 309562306a36Sopenharmony_ci 309662306a36Sopenharmony_ci if (device_property_read_string_array(dev, "clock-output-names", 309762306a36Sopenharmony_ci rt5682->pdata.dai_clk_names, 309862306a36Sopenharmony_ci RT5682_DAI_NUM_CLKS) < 0) 309962306a36Sopenharmony_ci dev_warn(dev, "Using default DAI clk names: %s, %s\n", 310062306a36Sopenharmony_ci rt5682->pdata.dai_clk_names[RT5682_DAI_WCLK_IDX], 310162306a36Sopenharmony_ci rt5682->pdata.dai_clk_names[RT5682_DAI_BCLK_IDX]); 310262306a36Sopenharmony_ci 310362306a36Sopenharmony_ci rt5682->pdata.dmic_clk_driving_high = device_property_read_bool(dev, 310462306a36Sopenharmony_ci "realtek,dmic-clk-driving-high"); 310562306a36Sopenharmony_ci 310662306a36Sopenharmony_ci return 0; 310762306a36Sopenharmony_ci} 310862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_parse_dt); 310962306a36Sopenharmony_ci 311062306a36Sopenharmony_ciint rt5682_get_ldo1(struct rt5682_priv *rt5682, struct device *dev) 311162306a36Sopenharmony_ci{ 311262306a36Sopenharmony_ci rt5682->ldo1_en = devm_gpiod_get_optional(dev, 311362306a36Sopenharmony_ci "realtek,ldo1-en", 311462306a36Sopenharmony_ci GPIOD_OUT_HIGH); 311562306a36Sopenharmony_ci if (IS_ERR(rt5682->ldo1_en)) { 311662306a36Sopenharmony_ci dev_err(dev, "Fail gpio request ldo1_en\n"); 311762306a36Sopenharmony_ci return PTR_ERR(rt5682->ldo1_en); 311862306a36Sopenharmony_ci } 311962306a36Sopenharmony_ci 312062306a36Sopenharmony_ci return 0; 312162306a36Sopenharmony_ci} 312262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_get_ldo1); 312362306a36Sopenharmony_ci 312462306a36Sopenharmony_civoid rt5682_calibrate(struct rt5682_priv *rt5682) 312562306a36Sopenharmony_ci{ 312662306a36Sopenharmony_ci int value, count; 312762306a36Sopenharmony_ci 312862306a36Sopenharmony_ci mutex_lock(&rt5682->calibrate_mutex); 312962306a36Sopenharmony_ci 313062306a36Sopenharmony_ci rt5682_reset(rt5682); 313162306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_I2C_CTRL, 0x000f); 313262306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xa2af); 313362306a36Sopenharmony_ci usleep_range(15000, 20000); 313462306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xf2af); 313562306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0300); 313662306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x8000); 313762306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0100); 313862306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_IMP_SENS_CTRL_19, 0x3800); 313962306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x3000); 314062306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x7005); 314162306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0x686c); 314262306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0d0d); 314362306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_2, 0x0321); 314462306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_LOGIC_CTRL_2, 0x0004); 314562306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00); 314662306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_3, 0x06a1); 314762306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_A_DAC1_MUX, 0x0311); 314862306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00); 314962306a36Sopenharmony_ci 315062306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0xfc00); 315162306a36Sopenharmony_ci 315262306a36Sopenharmony_ci for (count = 0; count < 60; count++) { 315362306a36Sopenharmony_ci regmap_read(rt5682->regmap, RT5682_HP_CALIB_STA_1, &value); 315462306a36Sopenharmony_ci if (!(value & 0x8000)) 315562306a36Sopenharmony_ci break; 315662306a36Sopenharmony_ci 315762306a36Sopenharmony_ci usleep_range(10000, 10005); 315862306a36Sopenharmony_ci } 315962306a36Sopenharmony_ci 316062306a36Sopenharmony_ci if (count >= 60) 316162306a36Sopenharmony_ci dev_err(rt5682->component->dev, "HP Calibration Failure\n"); 316262306a36Sopenharmony_ci 316362306a36Sopenharmony_ci /* restore settings */ 316462306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0x002f); 316562306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0080); 316662306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x0000); 316762306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0000); 316862306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x2000); 316962306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x2005); 317062306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0xc0c4); 317162306a36Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0c0c); 317262306a36Sopenharmony_ci 317362306a36Sopenharmony_ci mutex_unlock(&rt5682->calibrate_mutex); 317462306a36Sopenharmony_ci} 317562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_calibrate); 317662306a36Sopenharmony_ci 317762306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT5682 driver"); 317862306a36Sopenharmony_ciMODULE_AUTHOR("Bard Liao <bardliao@realtek.com>"); 317962306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3180