18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci// 38c2ecf20Sopenharmony_ci// rt5682.c -- RT5682 ALSA SoC audio component driver 48c2ecf20Sopenharmony_ci// 58c2ecf20Sopenharmony_ci// Copyright 2018 Realtek Semiconductor Corp. 68c2ecf20Sopenharmony_ci// Author: Bard Liao <bardliao@realtek.com> 78c2ecf20Sopenharmony_ci// 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/module.h> 108c2ecf20Sopenharmony_ci#include <linux/moduleparam.h> 118c2ecf20Sopenharmony_ci#include <linux/init.h> 128c2ecf20Sopenharmony_ci#include <linux/delay.h> 138c2ecf20Sopenharmony_ci#include <linux/pm.h> 148c2ecf20Sopenharmony_ci#include <linux/pm_runtime.h> 158c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 168c2ecf20Sopenharmony_ci#include <linux/spi/spi.h> 178c2ecf20Sopenharmony_ci#include <linux/acpi.h> 188c2ecf20Sopenharmony_ci#include <linux/gpio.h> 198c2ecf20Sopenharmony_ci#include <linux/of_gpio.h> 208c2ecf20Sopenharmony_ci#include <linux/mutex.h> 218c2ecf20Sopenharmony_ci#include <sound/core.h> 228c2ecf20Sopenharmony_ci#include <sound/pcm.h> 238c2ecf20Sopenharmony_ci#include <sound/pcm_params.h> 248c2ecf20Sopenharmony_ci#include <sound/jack.h> 258c2ecf20Sopenharmony_ci#include <sound/soc.h> 268c2ecf20Sopenharmony_ci#include <sound/soc-dapm.h> 278c2ecf20Sopenharmony_ci#include <sound/initval.h> 288c2ecf20Sopenharmony_ci#include <sound/tlv.h> 298c2ecf20Sopenharmony_ci#include <sound/rt5682.h> 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci#include "rl6231.h" 328c2ecf20Sopenharmony_ci#include "rt5682.h" 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ciconst char *rt5682_supply_names[RT5682_NUM_SUPPLIES] = { 358c2ecf20Sopenharmony_ci "AVDD", 368c2ecf20Sopenharmony_ci "MICVDD", 378c2ecf20Sopenharmony_ci "VBAT", 388c2ecf20Sopenharmony_ci}; 398c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_supply_names); 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistatic const struct reg_sequence patch_list[] = { 428c2ecf20Sopenharmony_ci {RT5682_HP_IMP_SENS_CTRL_19, 0x1000}, 438c2ecf20Sopenharmony_ci {RT5682_DAC_ADC_DIG_VOL1, 0xa020}, 448c2ecf20Sopenharmony_ci {RT5682_I2C_CTRL, 0x000f}, 458c2ecf20Sopenharmony_ci {RT5682_PLL2_INTERNAL, 0x8266}, 468c2ecf20Sopenharmony_ci {RT5682_SAR_IL_CMD_3, 0x8365}, 478c2ecf20Sopenharmony_ci {RT5682_SAR_IL_CMD_6, 0x0180}, 488c2ecf20Sopenharmony_ci}; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_civoid rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci int ret; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci ret = regmap_multi_reg_write(rt5682->regmap, patch_list, 558c2ecf20Sopenharmony_ci ARRAY_SIZE(patch_list)); 568c2ecf20Sopenharmony_ci if (ret) 578c2ecf20Sopenharmony_ci dev_warn(dev, "Failed to apply regmap patch: %d\n", ret); 588c2ecf20Sopenharmony_ci} 598c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_apply_patch_list); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ciconst struct reg_default rt5682_reg[RT5682_REG_NUM] = { 628c2ecf20Sopenharmony_ci {0x0002, 0x8080}, 638c2ecf20Sopenharmony_ci {0x0003, 0x8000}, 648c2ecf20Sopenharmony_ci {0x0005, 0x0000}, 658c2ecf20Sopenharmony_ci {0x0006, 0x0000}, 668c2ecf20Sopenharmony_ci {0x0008, 0x800f}, 678c2ecf20Sopenharmony_ci {0x000b, 0x0000}, 688c2ecf20Sopenharmony_ci {0x0010, 0x4040}, 698c2ecf20Sopenharmony_ci {0x0011, 0x0000}, 708c2ecf20Sopenharmony_ci {0x0012, 0x1404}, 718c2ecf20Sopenharmony_ci {0x0013, 0x1000}, 728c2ecf20Sopenharmony_ci {0x0014, 0xa00a}, 738c2ecf20Sopenharmony_ci {0x0015, 0x0404}, 748c2ecf20Sopenharmony_ci {0x0016, 0x0404}, 758c2ecf20Sopenharmony_ci {0x0019, 0xafaf}, 768c2ecf20Sopenharmony_ci {0x001c, 0x2f2f}, 778c2ecf20Sopenharmony_ci {0x001f, 0x0000}, 788c2ecf20Sopenharmony_ci {0x0022, 0x5757}, 798c2ecf20Sopenharmony_ci {0x0023, 0x0039}, 808c2ecf20Sopenharmony_ci {0x0024, 0x000b}, 818c2ecf20Sopenharmony_ci {0x0026, 0xc0c4}, 828c2ecf20Sopenharmony_ci {0x0029, 0x8080}, 838c2ecf20Sopenharmony_ci {0x002a, 0xa0a0}, 848c2ecf20Sopenharmony_ci {0x002b, 0x0300}, 858c2ecf20Sopenharmony_ci {0x0030, 0x0000}, 868c2ecf20Sopenharmony_ci {0x003c, 0x0080}, 878c2ecf20Sopenharmony_ci {0x0044, 0x0c0c}, 888c2ecf20Sopenharmony_ci {0x0049, 0x0000}, 898c2ecf20Sopenharmony_ci {0x0061, 0x0000}, 908c2ecf20Sopenharmony_ci {0x0062, 0x0000}, 918c2ecf20Sopenharmony_ci {0x0063, 0x003f}, 928c2ecf20Sopenharmony_ci {0x0064, 0x0000}, 938c2ecf20Sopenharmony_ci {0x0065, 0x0000}, 948c2ecf20Sopenharmony_ci {0x0066, 0x0030}, 958c2ecf20Sopenharmony_ci {0x0067, 0x0000}, 968c2ecf20Sopenharmony_ci {0x006b, 0x0000}, 978c2ecf20Sopenharmony_ci {0x006c, 0x0000}, 988c2ecf20Sopenharmony_ci {0x006d, 0x2200}, 998c2ecf20Sopenharmony_ci {0x006e, 0x0a10}, 1008c2ecf20Sopenharmony_ci {0x0070, 0x8000}, 1018c2ecf20Sopenharmony_ci {0x0071, 0x8000}, 1028c2ecf20Sopenharmony_ci {0x0073, 0x0000}, 1038c2ecf20Sopenharmony_ci {0x0074, 0x0000}, 1048c2ecf20Sopenharmony_ci {0x0075, 0x0002}, 1058c2ecf20Sopenharmony_ci {0x0076, 0x0001}, 1068c2ecf20Sopenharmony_ci {0x0079, 0x0000}, 1078c2ecf20Sopenharmony_ci {0x007a, 0x0000}, 1088c2ecf20Sopenharmony_ci {0x007b, 0x0000}, 1098c2ecf20Sopenharmony_ci {0x007c, 0x0100}, 1108c2ecf20Sopenharmony_ci {0x007e, 0x0000}, 1118c2ecf20Sopenharmony_ci {0x0080, 0x0000}, 1128c2ecf20Sopenharmony_ci {0x0081, 0x0000}, 1138c2ecf20Sopenharmony_ci {0x0082, 0x0000}, 1148c2ecf20Sopenharmony_ci {0x0083, 0x0000}, 1158c2ecf20Sopenharmony_ci {0x0084, 0x0000}, 1168c2ecf20Sopenharmony_ci {0x0085, 0x0000}, 1178c2ecf20Sopenharmony_ci {0x0086, 0x0005}, 1188c2ecf20Sopenharmony_ci {0x0087, 0x0000}, 1198c2ecf20Sopenharmony_ci {0x0088, 0x0000}, 1208c2ecf20Sopenharmony_ci {0x008c, 0x0003}, 1218c2ecf20Sopenharmony_ci {0x008d, 0x0000}, 1228c2ecf20Sopenharmony_ci {0x008e, 0x0060}, 1238c2ecf20Sopenharmony_ci {0x008f, 0x1000}, 1248c2ecf20Sopenharmony_ci {0x0091, 0x0c26}, 1258c2ecf20Sopenharmony_ci {0x0092, 0x0073}, 1268c2ecf20Sopenharmony_ci {0x0093, 0x0000}, 1278c2ecf20Sopenharmony_ci {0x0094, 0x0080}, 1288c2ecf20Sopenharmony_ci {0x0098, 0x0000}, 1298c2ecf20Sopenharmony_ci {0x009a, 0x0000}, 1308c2ecf20Sopenharmony_ci {0x009b, 0x0000}, 1318c2ecf20Sopenharmony_ci {0x009c, 0x0000}, 1328c2ecf20Sopenharmony_ci {0x009d, 0x0000}, 1338c2ecf20Sopenharmony_ci {0x009e, 0x100c}, 1348c2ecf20Sopenharmony_ci {0x009f, 0x0000}, 1358c2ecf20Sopenharmony_ci {0x00a0, 0x0000}, 1368c2ecf20Sopenharmony_ci {0x00a3, 0x0002}, 1378c2ecf20Sopenharmony_ci {0x00a4, 0x0001}, 1388c2ecf20Sopenharmony_ci {0x00ae, 0x2040}, 1398c2ecf20Sopenharmony_ci {0x00af, 0x0000}, 1408c2ecf20Sopenharmony_ci {0x00b6, 0x0000}, 1418c2ecf20Sopenharmony_ci {0x00b7, 0x0000}, 1428c2ecf20Sopenharmony_ci {0x00b8, 0x0000}, 1438c2ecf20Sopenharmony_ci {0x00b9, 0x0002}, 1448c2ecf20Sopenharmony_ci {0x00be, 0x0000}, 1458c2ecf20Sopenharmony_ci {0x00c0, 0x0160}, 1468c2ecf20Sopenharmony_ci {0x00c1, 0x82a0}, 1478c2ecf20Sopenharmony_ci {0x00c2, 0x0000}, 1488c2ecf20Sopenharmony_ci {0x00d0, 0x0000}, 1498c2ecf20Sopenharmony_ci {0x00d1, 0x2244}, 1508c2ecf20Sopenharmony_ci {0x00d2, 0x3300}, 1518c2ecf20Sopenharmony_ci {0x00d3, 0x2200}, 1528c2ecf20Sopenharmony_ci {0x00d4, 0x0000}, 1538c2ecf20Sopenharmony_ci {0x00d9, 0x0009}, 1548c2ecf20Sopenharmony_ci {0x00da, 0x0000}, 1558c2ecf20Sopenharmony_ci {0x00db, 0x0000}, 1568c2ecf20Sopenharmony_ci {0x00dc, 0x00c0}, 1578c2ecf20Sopenharmony_ci {0x00dd, 0x2220}, 1588c2ecf20Sopenharmony_ci {0x00de, 0x3131}, 1598c2ecf20Sopenharmony_ci {0x00df, 0x3131}, 1608c2ecf20Sopenharmony_ci {0x00e0, 0x3131}, 1618c2ecf20Sopenharmony_ci {0x00e2, 0x0000}, 1628c2ecf20Sopenharmony_ci {0x00e3, 0x4000}, 1638c2ecf20Sopenharmony_ci {0x00e4, 0x0aa0}, 1648c2ecf20Sopenharmony_ci {0x00e5, 0x3131}, 1658c2ecf20Sopenharmony_ci {0x00e6, 0x3131}, 1668c2ecf20Sopenharmony_ci {0x00e7, 0x3131}, 1678c2ecf20Sopenharmony_ci {0x00e8, 0x3131}, 1688c2ecf20Sopenharmony_ci {0x00ea, 0xb320}, 1698c2ecf20Sopenharmony_ci {0x00eb, 0x0000}, 1708c2ecf20Sopenharmony_ci {0x00f0, 0x0000}, 1718c2ecf20Sopenharmony_ci {0x00f1, 0x00d0}, 1728c2ecf20Sopenharmony_ci {0x00f2, 0x00d0}, 1738c2ecf20Sopenharmony_ci {0x00f6, 0x0000}, 1748c2ecf20Sopenharmony_ci {0x00fa, 0x0000}, 1758c2ecf20Sopenharmony_ci {0x00fb, 0x0000}, 1768c2ecf20Sopenharmony_ci {0x00fc, 0x0000}, 1778c2ecf20Sopenharmony_ci {0x00fd, 0x0000}, 1788c2ecf20Sopenharmony_ci {0x00fe, 0x10ec}, 1798c2ecf20Sopenharmony_ci {0x00ff, 0x6530}, 1808c2ecf20Sopenharmony_ci {0x0100, 0xa0a0}, 1818c2ecf20Sopenharmony_ci {0x010b, 0x0000}, 1828c2ecf20Sopenharmony_ci {0x010c, 0xae00}, 1838c2ecf20Sopenharmony_ci {0x010d, 0xaaa0}, 1848c2ecf20Sopenharmony_ci {0x010e, 0x8aa2}, 1858c2ecf20Sopenharmony_ci {0x010f, 0x02a2}, 1868c2ecf20Sopenharmony_ci {0x0110, 0xc000}, 1878c2ecf20Sopenharmony_ci {0x0111, 0x04a2}, 1888c2ecf20Sopenharmony_ci {0x0112, 0x2800}, 1898c2ecf20Sopenharmony_ci {0x0113, 0x0000}, 1908c2ecf20Sopenharmony_ci {0x0117, 0x0100}, 1918c2ecf20Sopenharmony_ci {0x0125, 0x0410}, 1928c2ecf20Sopenharmony_ci {0x0132, 0x6026}, 1938c2ecf20Sopenharmony_ci {0x0136, 0x5555}, 1948c2ecf20Sopenharmony_ci {0x0138, 0x3700}, 1958c2ecf20Sopenharmony_ci {0x013a, 0x2000}, 1968c2ecf20Sopenharmony_ci {0x013b, 0x2000}, 1978c2ecf20Sopenharmony_ci {0x013c, 0x2005}, 1988c2ecf20Sopenharmony_ci {0x013f, 0x0000}, 1998c2ecf20Sopenharmony_ci {0x0142, 0x0000}, 2008c2ecf20Sopenharmony_ci {0x0145, 0x0002}, 2018c2ecf20Sopenharmony_ci {0x0146, 0x0000}, 2028c2ecf20Sopenharmony_ci {0x0147, 0x0000}, 2038c2ecf20Sopenharmony_ci {0x0148, 0x0000}, 2048c2ecf20Sopenharmony_ci {0x0149, 0x0000}, 2058c2ecf20Sopenharmony_ci {0x0150, 0x79a1}, 2068c2ecf20Sopenharmony_ci {0x0156, 0xaaaa}, 2078c2ecf20Sopenharmony_ci {0x0160, 0x4ec0}, 2088c2ecf20Sopenharmony_ci {0x0161, 0x0080}, 2098c2ecf20Sopenharmony_ci {0x0162, 0x0200}, 2108c2ecf20Sopenharmony_ci {0x0163, 0x0800}, 2118c2ecf20Sopenharmony_ci {0x0164, 0x0000}, 2128c2ecf20Sopenharmony_ci {0x0165, 0x0000}, 2138c2ecf20Sopenharmony_ci {0x0166, 0x0000}, 2148c2ecf20Sopenharmony_ci {0x0167, 0x000f}, 2158c2ecf20Sopenharmony_ci {0x0168, 0x000f}, 2168c2ecf20Sopenharmony_ci {0x0169, 0x0021}, 2178c2ecf20Sopenharmony_ci {0x0190, 0x413d}, 2188c2ecf20Sopenharmony_ci {0x0194, 0x0000}, 2198c2ecf20Sopenharmony_ci {0x0195, 0x0000}, 2208c2ecf20Sopenharmony_ci {0x0197, 0x0022}, 2218c2ecf20Sopenharmony_ci {0x0198, 0x0000}, 2228c2ecf20Sopenharmony_ci {0x0199, 0x0000}, 2238c2ecf20Sopenharmony_ci {0x01af, 0x0000}, 2248c2ecf20Sopenharmony_ci {0x01b0, 0x0400}, 2258c2ecf20Sopenharmony_ci {0x01b1, 0x0000}, 2268c2ecf20Sopenharmony_ci {0x01b2, 0x0000}, 2278c2ecf20Sopenharmony_ci {0x01b3, 0x0000}, 2288c2ecf20Sopenharmony_ci {0x01b4, 0x0000}, 2298c2ecf20Sopenharmony_ci {0x01b5, 0x0000}, 2308c2ecf20Sopenharmony_ci {0x01b6, 0x01c3}, 2318c2ecf20Sopenharmony_ci {0x01b7, 0x02a0}, 2328c2ecf20Sopenharmony_ci {0x01b8, 0x03e9}, 2338c2ecf20Sopenharmony_ci {0x01b9, 0x1389}, 2348c2ecf20Sopenharmony_ci {0x01ba, 0xc351}, 2358c2ecf20Sopenharmony_ci {0x01bb, 0x0009}, 2368c2ecf20Sopenharmony_ci {0x01bc, 0x0018}, 2378c2ecf20Sopenharmony_ci {0x01bd, 0x002a}, 2388c2ecf20Sopenharmony_ci {0x01be, 0x004c}, 2398c2ecf20Sopenharmony_ci {0x01bf, 0x0097}, 2408c2ecf20Sopenharmony_ci {0x01c0, 0x433d}, 2418c2ecf20Sopenharmony_ci {0x01c2, 0x0000}, 2428c2ecf20Sopenharmony_ci {0x01c3, 0x0000}, 2438c2ecf20Sopenharmony_ci {0x01c4, 0x0000}, 2448c2ecf20Sopenharmony_ci {0x01c5, 0x0000}, 2458c2ecf20Sopenharmony_ci {0x01c6, 0x0000}, 2468c2ecf20Sopenharmony_ci {0x01c7, 0x0000}, 2478c2ecf20Sopenharmony_ci {0x01c8, 0x40af}, 2488c2ecf20Sopenharmony_ci {0x01c9, 0x0702}, 2498c2ecf20Sopenharmony_ci {0x01ca, 0x0000}, 2508c2ecf20Sopenharmony_ci {0x01cb, 0x0000}, 2518c2ecf20Sopenharmony_ci {0x01cc, 0x5757}, 2528c2ecf20Sopenharmony_ci {0x01cd, 0x5757}, 2538c2ecf20Sopenharmony_ci {0x01ce, 0x5757}, 2548c2ecf20Sopenharmony_ci {0x01cf, 0x5757}, 2558c2ecf20Sopenharmony_ci {0x01d0, 0x5757}, 2568c2ecf20Sopenharmony_ci {0x01d1, 0x5757}, 2578c2ecf20Sopenharmony_ci {0x01d2, 0x5757}, 2588c2ecf20Sopenharmony_ci {0x01d3, 0x5757}, 2598c2ecf20Sopenharmony_ci {0x01d4, 0x5757}, 2608c2ecf20Sopenharmony_ci {0x01d5, 0x5757}, 2618c2ecf20Sopenharmony_ci {0x01d6, 0x0000}, 2628c2ecf20Sopenharmony_ci {0x01d7, 0x0008}, 2638c2ecf20Sopenharmony_ci {0x01d8, 0x0029}, 2648c2ecf20Sopenharmony_ci {0x01d9, 0x3333}, 2658c2ecf20Sopenharmony_ci {0x01da, 0x0000}, 2668c2ecf20Sopenharmony_ci {0x01db, 0x0004}, 2678c2ecf20Sopenharmony_ci {0x01dc, 0x0000}, 2688c2ecf20Sopenharmony_ci {0x01de, 0x7c00}, 2698c2ecf20Sopenharmony_ci {0x01df, 0x0320}, 2708c2ecf20Sopenharmony_ci {0x01e0, 0x06a1}, 2718c2ecf20Sopenharmony_ci {0x01e1, 0x0000}, 2728c2ecf20Sopenharmony_ci {0x01e2, 0x0000}, 2738c2ecf20Sopenharmony_ci {0x01e3, 0x0000}, 2748c2ecf20Sopenharmony_ci {0x01e4, 0x0000}, 2758c2ecf20Sopenharmony_ci {0x01e6, 0x0001}, 2768c2ecf20Sopenharmony_ci {0x01e7, 0x0000}, 2778c2ecf20Sopenharmony_ci {0x01e8, 0x0000}, 2788c2ecf20Sopenharmony_ci {0x01ea, 0x0000}, 2798c2ecf20Sopenharmony_ci {0x01eb, 0x0000}, 2808c2ecf20Sopenharmony_ci {0x01ec, 0x0000}, 2818c2ecf20Sopenharmony_ci {0x01ed, 0x0000}, 2828c2ecf20Sopenharmony_ci {0x01ee, 0x0000}, 2838c2ecf20Sopenharmony_ci {0x01ef, 0x0000}, 2848c2ecf20Sopenharmony_ci {0x01f0, 0x0000}, 2858c2ecf20Sopenharmony_ci {0x01f1, 0x0000}, 2868c2ecf20Sopenharmony_ci {0x01f2, 0x0000}, 2878c2ecf20Sopenharmony_ci {0x01f3, 0x0000}, 2888c2ecf20Sopenharmony_ci {0x01f4, 0x0000}, 2898c2ecf20Sopenharmony_ci {0x0210, 0x6297}, 2908c2ecf20Sopenharmony_ci {0x0211, 0xa005}, 2918c2ecf20Sopenharmony_ci {0x0212, 0x824c}, 2928c2ecf20Sopenharmony_ci {0x0213, 0xf7ff}, 2938c2ecf20Sopenharmony_ci {0x0214, 0xf24c}, 2948c2ecf20Sopenharmony_ci {0x0215, 0x0102}, 2958c2ecf20Sopenharmony_ci {0x0216, 0x00a3}, 2968c2ecf20Sopenharmony_ci {0x0217, 0x0048}, 2978c2ecf20Sopenharmony_ci {0x0218, 0xa2c0}, 2988c2ecf20Sopenharmony_ci {0x0219, 0x0400}, 2998c2ecf20Sopenharmony_ci {0x021a, 0x00c8}, 3008c2ecf20Sopenharmony_ci {0x021b, 0x00c0}, 3018c2ecf20Sopenharmony_ci {0x021c, 0x0000}, 3028c2ecf20Sopenharmony_ci {0x0250, 0x4500}, 3038c2ecf20Sopenharmony_ci {0x0251, 0x40b3}, 3048c2ecf20Sopenharmony_ci {0x0252, 0x0000}, 3058c2ecf20Sopenharmony_ci {0x0253, 0x0000}, 3068c2ecf20Sopenharmony_ci {0x0254, 0x0000}, 3078c2ecf20Sopenharmony_ci {0x0255, 0x0000}, 3088c2ecf20Sopenharmony_ci {0x0256, 0x0000}, 3098c2ecf20Sopenharmony_ci {0x0257, 0x0000}, 3108c2ecf20Sopenharmony_ci {0x0258, 0x0000}, 3118c2ecf20Sopenharmony_ci {0x0259, 0x0000}, 3128c2ecf20Sopenharmony_ci {0x025a, 0x0005}, 3138c2ecf20Sopenharmony_ci {0x0270, 0x0000}, 3148c2ecf20Sopenharmony_ci {0x02ff, 0x0110}, 3158c2ecf20Sopenharmony_ci {0x0300, 0x001f}, 3168c2ecf20Sopenharmony_ci {0x0301, 0x032c}, 3178c2ecf20Sopenharmony_ci {0x0302, 0x5f21}, 3188c2ecf20Sopenharmony_ci {0x0303, 0x4000}, 3198c2ecf20Sopenharmony_ci {0x0304, 0x4000}, 3208c2ecf20Sopenharmony_ci {0x0305, 0x06d5}, 3218c2ecf20Sopenharmony_ci {0x0306, 0x8000}, 3228c2ecf20Sopenharmony_ci {0x0307, 0x0700}, 3238c2ecf20Sopenharmony_ci {0x0310, 0x4560}, 3248c2ecf20Sopenharmony_ci {0x0311, 0xa4a8}, 3258c2ecf20Sopenharmony_ci {0x0312, 0x7418}, 3268c2ecf20Sopenharmony_ci {0x0313, 0x0000}, 3278c2ecf20Sopenharmony_ci {0x0314, 0x0006}, 3288c2ecf20Sopenharmony_ci {0x0315, 0xffff}, 3298c2ecf20Sopenharmony_ci {0x0316, 0xc400}, 3308c2ecf20Sopenharmony_ci {0x0317, 0x0000}, 3318c2ecf20Sopenharmony_ci {0x03c0, 0x7e00}, 3328c2ecf20Sopenharmony_ci {0x03c1, 0x8000}, 3338c2ecf20Sopenharmony_ci {0x03c2, 0x8000}, 3348c2ecf20Sopenharmony_ci {0x03c3, 0x8000}, 3358c2ecf20Sopenharmony_ci {0x03c4, 0x8000}, 3368c2ecf20Sopenharmony_ci {0x03c5, 0x8000}, 3378c2ecf20Sopenharmony_ci {0x03c6, 0x8000}, 3388c2ecf20Sopenharmony_ci {0x03c7, 0x8000}, 3398c2ecf20Sopenharmony_ci {0x03c8, 0x8000}, 3408c2ecf20Sopenharmony_ci {0x03c9, 0x8000}, 3418c2ecf20Sopenharmony_ci {0x03ca, 0x8000}, 3428c2ecf20Sopenharmony_ci {0x03cb, 0x8000}, 3438c2ecf20Sopenharmony_ci {0x03cc, 0x8000}, 3448c2ecf20Sopenharmony_ci {0x03d0, 0x0000}, 3458c2ecf20Sopenharmony_ci {0x03d1, 0x0000}, 3468c2ecf20Sopenharmony_ci {0x03d2, 0x0000}, 3478c2ecf20Sopenharmony_ci {0x03d3, 0x0000}, 3488c2ecf20Sopenharmony_ci {0x03d4, 0x2000}, 3498c2ecf20Sopenharmony_ci {0x03d5, 0x2000}, 3508c2ecf20Sopenharmony_ci {0x03d6, 0x0000}, 3518c2ecf20Sopenharmony_ci {0x03d7, 0x0000}, 3528c2ecf20Sopenharmony_ci {0x03d8, 0x2000}, 3538c2ecf20Sopenharmony_ci {0x03d9, 0x2000}, 3548c2ecf20Sopenharmony_ci {0x03da, 0x2000}, 3558c2ecf20Sopenharmony_ci {0x03db, 0x2000}, 3568c2ecf20Sopenharmony_ci {0x03dc, 0x0000}, 3578c2ecf20Sopenharmony_ci {0x03dd, 0x0000}, 3588c2ecf20Sopenharmony_ci {0x03de, 0x0000}, 3598c2ecf20Sopenharmony_ci {0x03df, 0x2000}, 3608c2ecf20Sopenharmony_ci {0x03e0, 0x0000}, 3618c2ecf20Sopenharmony_ci {0x03e1, 0x0000}, 3628c2ecf20Sopenharmony_ci {0x03e2, 0x0000}, 3638c2ecf20Sopenharmony_ci {0x03e3, 0x0000}, 3648c2ecf20Sopenharmony_ci {0x03e4, 0x0000}, 3658c2ecf20Sopenharmony_ci {0x03e5, 0x0000}, 3668c2ecf20Sopenharmony_ci {0x03e6, 0x0000}, 3678c2ecf20Sopenharmony_ci {0x03e7, 0x0000}, 3688c2ecf20Sopenharmony_ci {0x03e8, 0x0000}, 3698c2ecf20Sopenharmony_ci {0x03e9, 0x0000}, 3708c2ecf20Sopenharmony_ci {0x03ea, 0x0000}, 3718c2ecf20Sopenharmony_ci {0x03eb, 0x0000}, 3728c2ecf20Sopenharmony_ci {0x03ec, 0x0000}, 3738c2ecf20Sopenharmony_ci {0x03ed, 0x0000}, 3748c2ecf20Sopenharmony_ci {0x03ee, 0x0000}, 3758c2ecf20Sopenharmony_ci {0x03ef, 0x0000}, 3768c2ecf20Sopenharmony_ci {0x03f0, 0x0800}, 3778c2ecf20Sopenharmony_ci {0x03f1, 0x0800}, 3788c2ecf20Sopenharmony_ci {0x03f2, 0x0800}, 3798c2ecf20Sopenharmony_ci {0x03f3, 0x0800}, 3808c2ecf20Sopenharmony_ci}; 3818c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_reg); 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_cibool rt5682_volatile_register(struct device *dev, unsigned int reg) 3848c2ecf20Sopenharmony_ci{ 3858c2ecf20Sopenharmony_ci switch (reg) { 3868c2ecf20Sopenharmony_ci case RT5682_RESET: 3878c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_2: 3888c2ecf20Sopenharmony_ci case RT5682_INT_ST_1: 3898c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_1: 3908c2ecf20Sopenharmony_ci case RT5682_AJD1_CTRL: 3918c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_1: 3928c2ecf20Sopenharmony_ci case RT5682_DEVICE_ID: 3938c2ecf20Sopenharmony_ci case RT5682_I2C_MODE: 3948c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_10: 3958c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_2: 3968c2ecf20Sopenharmony_ci case RT5682_JD_TOP_VC_VTRL: 3978c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_19: 3988c2ecf20Sopenharmony_ci case RT5682_IL_CMD_1: 3998c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_2: 4008c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_4: 4018c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_10: 4028c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_11: 4038c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_6...RT5682_EFUSE_CTRL_11: 4048c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_1...RT5682_HP_CALIB_STA_11: 4058c2ecf20Sopenharmony_ci return true; 4068c2ecf20Sopenharmony_ci default: 4078c2ecf20Sopenharmony_ci return false; 4088c2ecf20Sopenharmony_ci } 4098c2ecf20Sopenharmony_ci} 4108c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_volatile_register); 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_cibool rt5682_readable_register(struct device *dev, unsigned int reg) 4138c2ecf20Sopenharmony_ci{ 4148c2ecf20Sopenharmony_ci switch (reg) { 4158c2ecf20Sopenharmony_ci case RT5682_RESET: 4168c2ecf20Sopenharmony_ci case RT5682_VERSION_ID: 4178c2ecf20Sopenharmony_ci case RT5682_VENDOR_ID: 4188c2ecf20Sopenharmony_ci case RT5682_DEVICE_ID: 4198c2ecf20Sopenharmony_ci case RT5682_HP_CTRL_1: 4208c2ecf20Sopenharmony_ci case RT5682_HP_CTRL_2: 4218c2ecf20Sopenharmony_ci case RT5682_HPL_GAIN: 4228c2ecf20Sopenharmony_ci case RT5682_HPR_GAIN: 4238c2ecf20Sopenharmony_ci case RT5682_I2C_CTRL: 4248c2ecf20Sopenharmony_ci case RT5682_CBJ_BST_CTRL: 4258c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_1: 4268c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_2: 4278c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_3: 4288c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_4: 4298c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_5: 4308c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_6: 4318c2ecf20Sopenharmony_ci case RT5682_CBJ_CTRL_7: 4328c2ecf20Sopenharmony_ci case RT5682_DAC1_DIG_VOL: 4338c2ecf20Sopenharmony_ci case RT5682_STO1_ADC_DIG_VOL: 4348c2ecf20Sopenharmony_ci case RT5682_STO1_ADC_BOOST: 4358c2ecf20Sopenharmony_ci case RT5682_HP_IMP_GAIN_1: 4368c2ecf20Sopenharmony_ci case RT5682_HP_IMP_GAIN_2: 4378c2ecf20Sopenharmony_ci case RT5682_SIDETONE_CTRL: 4388c2ecf20Sopenharmony_ci case RT5682_STO1_ADC_MIXER: 4398c2ecf20Sopenharmony_ci case RT5682_AD_DA_MIXER: 4408c2ecf20Sopenharmony_ci case RT5682_STO1_DAC_MIXER: 4418c2ecf20Sopenharmony_ci case RT5682_A_DAC1_MUX: 4428c2ecf20Sopenharmony_ci case RT5682_DIG_INF2_DATA: 4438c2ecf20Sopenharmony_ci case RT5682_REC_MIXER: 4448c2ecf20Sopenharmony_ci case RT5682_CAL_REC: 4458c2ecf20Sopenharmony_ci case RT5682_ALC_BACK_GAIN: 4468c2ecf20Sopenharmony_ci case RT5682_PWR_DIG_1: 4478c2ecf20Sopenharmony_ci case RT5682_PWR_DIG_2: 4488c2ecf20Sopenharmony_ci case RT5682_PWR_ANLG_1: 4498c2ecf20Sopenharmony_ci case RT5682_PWR_ANLG_2: 4508c2ecf20Sopenharmony_ci case RT5682_PWR_ANLG_3: 4518c2ecf20Sopenharmony_ci case RT5682_PWR_MIXER: 4528c2ecf20Sopenharmony_ci case RT5682_PWR_VOL: 4538c2ecf20Sopenharmony_ci case RT5682_CLK_DET: 4548c2ecf20Sopenharmony_ci case RT5682_RESET_LPF_CTRL: 4558c2ecf20Sopenharmony_ci case RT5682_RESET_HPF_CTRL: 4568c2ecf20Sopenharmony_ci case RT5682_DMIC_CTRL_1: 4578c2ecf20Sopenharmony_ci case RT5682_I2S1_SDP: 4588c2ecf20Sopenharmony_ci case RT5682_I2S2_SDP: 4598c2ecf20Sopenharmony_ci case RT5682_ADDA_CLK_1: 4608c2ecf20Sopenharmony_ci case RT5682_ADDA_CLK_2: 4618c2ecf20Sopenharmony_ci case RT5682_I2S1_F_DIV_CTRL_1: 4628c2ecf20Sopenharmony_ci case RT5682_I2S1_F_DIV_CTRL_2: 4638c2ecf20Sopenharmony_ci case RT5682_TDM_CTRL: 4648c2ecf20Sopenharmony_ci case RT5682_TDM_ADDA_CTRL_1: 4658c2ecf20Sopenharmony_ci case RT5682_TDM_ADDA_CTRL_2: 4668c2ecf20Sopenharmony_ci case RT5682_DATA_SEL_CTRL_1: 4678c2ecf20Sopenharmony_ci case RT5682_TDM_TCON_CTRL: 4688c2ecf20Sopenharmony_ci case RT5682_GLB_CLK: 4698c2ecf20Sopenharmony_ci case RT5682_PLL_CTRL_1: 4708c2ecf20Sopenharmony_ci case RT5682_PLL_CTRL_2: 4718c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_1: 4728c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_2: 4738c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_3: 4748c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_4: 4758c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_5: 4768c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_6: 4778c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_11: 4788c2ecf20Sopenharmony_ci case RT5682_SDW_REF_CLK: 4798c2ecf20Sopenharmony_ci case RT5682_DEPOP_1: 4808c2ecf20Sopenharmony_ci case RT5682_DEPOP_2: 4818c2ecf20Sopenharmony_ci case RT5682_HP_CHARGE_PUMP_1: 4828c2ecf20Sopenharmony_ci case RT5682_HP_CHARGE_PUMP_2: 4838c2ecf20Sopenharmony_ci case RT5682_MICBIAS_1: 4848c2ecf20Sopenharmony_ci case RT5682_MICBIAS_2: 4858c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_12: 4868c2ecf20Sopenharmony_ci case RT5682_PLL_TRACK_14: 4878c2ecf20Sopenharmony_ci case RT5682_PLL2_CTRL_1: 4888c2ecf20Sopenharmony_ci case RT5682_PLL2_CTRL_2: 4898c2ecf20Sopenharmony_ci case RT5682_PLL2_CTRL_3: 4908c2ecf20Sopenharmony_ci case RT5682_PLL2_CTRL_4: 4918c2ecf20Sopenharmony_ci case RT5682_RC_CLK_CTRL: 4928c2ecf20Sopenharmony_ci case RT5682_I2S_M_CLK_CTRL_1: 4938c2ecf20Sopenharmony_ci case RT5682_I2S2_F_DIV_CTRL_1: 4948c2ecf20Sopenharmony_ci case RT5682_I2S2_F_DIV_CTRL_2: 4958c2ecf20Sopenharmony_ci case RT5682_EQ_CTRL_1: 4968c2ecf20Sopenharmony_ci case RT5682_EQ_CTRL_2: 4978c2ecf20Sopenharmony_ci case RT5682_IRQ_CTRL_1: 4988c2ecf20Sopenharmony_ci case RT5682_IRQ_CTRL_2: 4998c2ecf20Sopenharmony_ci case RT5682_IRQ_CTRL_3: 5008c2ecf20Sopenharmony_ci case RT5682_IRQ_CTRL_4: 5018c2ecf20Sopenharmony_ci case RT5682_INT_ST_1: 5028c2ecf20Sopenharmony_ci case RT5682_GPIO_CTRL_1: 5038c2ecf20Sopenharmony_ci case RT5682_GPIO_CTRL_2: 5048c2ecf20Sopenharmony_ci case RT5682_GPIO_CTRL_3: 5058c2ecf20Sopenharmony_ci case RT5682_HP_AMP_DET_CTRL_1: 5068c2ecf20Sopenharmony_ci case RT5682_HP_AMP_DET_CTRL_2: 5078c2ecf20Sopenharmony_ci case RT5682_MID_HP_AMP_DET: 5088c2ecf20Sopenharmony_ci case RT5682_LOW_HP_AMP_DET: 5098c2ecf20Sopenharmony_ci case RT5682_DELAY_BUF_CTRL: 5108c2ecf20Sopenharmony_ci case RT5682_SV_ZCD_1: 5118c2ecf20Sopenharmony_ci case RT5682_SV_ZCD_2: 5128c2ecf20Sopenharmony_ci case RT5682_IL_CMD_1: 5138c2ecf20Sopenharmony_ci case RT5682_IL_CMD_2: 5148c2ecf20Sopenharmony_ci case RT5682_IL_CMD_3: 5158c2ecf20Sopenharmony_ci case RT5682_IL_CMD_4: 5168c2ecf20Sopenharmony_ci case RT5682_IL_CMD_5: 5178c2ecf20Sopenharmony_ci case RT5682_IL_CMD_6: 5188c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_1: 5198c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_2: 5208c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_3: 5218c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_4: 5228c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_5: 5238c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_6: 5248c2ecf20Sopenharmony_ci case RT5682_4BTN_IL_CMD_7: 5258c2ecf20Sopenharmony_ci case RT5682_ADC_STO1_HP_CTRL_1: 5268c2ecf20Sopenharmony_ci case RT5682_ADC_STO1_HP_CTRL_2: 5278c2ecf20Sopenharmony_ci case RT5682_AJD1_CTRL: 5288c2ecf20Sopenharmony_ci case RT5682_JD1_THD: 5298c2ecf20Sopenharmony_ci case RT5682_JD2_THD: 5308c2ecf20Sopenharmony_ci case RT5682_JD_CTRL_1: 5318c2ecf20Sopenharmony_ci case RT5682_DUMMY_1: 5328c2ecf20Sopenharmony_ci case RT5682_DUMMY_2: 5338c2ecf20Sopenharmony_ci case RT5682_DUMMY_3: 5348c2ecf20Sopenharmony_ci case RT5682_DAC_ADC_DIG_VOL1: 5358c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_2: 5368c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_3: 5378c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_4: 5388c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_5: 5398c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_6: 5408c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_7: 5418c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_8: 5428c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_9: 5438c2ecf20Sopenharmony_ci case RT5682_BIAS_CUR_CTRL_10: 5448c2ecf20Sopenharmony_ci case RT5682_VREF_REC_OP_FB_CAP_CTRL: 5458c2ecf20Sopenharmony_ci case RT5682_CHARGE_PUMP_1: 5468c2ecf20Sopenharmony_ci case RT5682_DIG_IN_CTRL_1: 5478c2ecf20Sopenharmony_ci case RT5682_PAD_DRIVING_CTRL: 5488c2ecf20Sopenharmony_ci case RT5682_SOFT_RAMP_DEPOP: 5498c2ecf20Sopenharmony_ci case RT5682_CHOP_DAC: 5508c2ecf20Sopenharmony_ci case RT5682_CHOP_ADC: 5518c2ecf20Sopenharmony_ci case RT5682_CALIB_ADC_CTRL: 5528c2ecf20Sopenharmony_ci case RT5682_VOL_TEST: 5538c2ecf20Sopenharmony_ci case RT5682_SPKVDD_DET_STA: 5548c2ecf20Sopenharmony_ci case RT5682_TEST_MODE_CTRL_1: 5558c2ecf20Sopenharmony_ci case RT5682_TEST_MODE_CTRL_2: 5568c2ecf20Sopenharmony_ci case RT5682_TEST_MODE_CTRL_3: 5578c2ecf20Sopenharmony_ci case RT5682_TEST_MODE_CTRL_4: 5588c2ecf20Sopenharmony_ci case RT5682_TEST_MODE_CTRL_5: 5598c2ecf20Sopenharmony_ci case RT5682_PLL1_INTERNAL: 5608c2ecf20Sopenharmony_ci case RT5682_PLL2_INTERNAL: 5618c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_1: 5628c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_2: 5638c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_3: 5648c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_4: 5658c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_5: 5668c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_6: 5678c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_7: 5688c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_8: 5698c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_9: 5708c2ecf20Sopenharmony_ci case RT5682_STO_NG2_CTRL_10: 5718c2ecf20Sopenharmony_ci case RT5682_STO1_DAC_SIL_DET: 5728c2ecf20Sopenharmony_ci case RT5682_SIL_PSV_CTRL1: 5738c2ecf20Sopenharmony_ci case RT5682_SIL_PSV_CTRL2: 5748c2ecf20Sopenharmony_ci case RT5682_SIL_PSV_CTRL3: 5758c2ecf20Sopenharmony_ci case RT5682_SIL_PSV_CTRL4: 5768c2ecf20Sopenharmony_ci case RT5682_SIL_PSV_CTRL5: 5778c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_01: 5788c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_02: 5798c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_03: 5808c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_04: 5818c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_05: 5828c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_06: 5838c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_07: 5848c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_08: 5858c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_09: 5868c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_10: 5878c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_11: 5888c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_12: 5898c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_13: 5908c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_14: 5918c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_15: 5928c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_16: 5938c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_17: 5948c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_18: 5958c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_19: 5968c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_20: 5978c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_21: 5988c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_22: 5998c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_23: 6008c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_24: 6018c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_25: 6028c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_26: 6038c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_27: 6048c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_28: 6058c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_29: 6068c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_30: 6078c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_31: 6088c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_32: 6098c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_33: 6108c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_34: 6118c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_35: 6128c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_36: 6138c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_37: 6148c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_38: 6158c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_39: 6168c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_40: 6178c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_41: 6188c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_42: 6198c2ecf20Sopenharmony_ci case RT5682_HP_IMP_SENS_CTRL_43: 6208c2ecf20Sopenharmony_ci case RT5682_HP_LOGIC_CTRL_1: 6218c2ecf20Sopenharmony_ci case RT5682_HP_LOGIC_CTRL_2: 6228c2ecf20Sopenharmony_ci case RT5682_HP_LOGIC_CTRL_3: 6238c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_1: 6248c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_2: 6258c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_3: 6268c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_4: 6278c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_5: 6288c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_6: 6298c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_7: 6308c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_9: 6318c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_10: 6328c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_CTRL_11: 6338c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_1: 6348c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_2: 6358c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_3: 6368c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_4: 6378c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_5: 6388c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_6: 6398c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_7: 6408c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_8: 6418c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_9: 6428c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_10: 6438c2ecf20Sopenharmony_ci case RT5682_HP_CALIB_STA_11: 6448c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_1: 6458c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_2: 6468c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_3: 6478c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_4: 6488c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_5: 6498c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_6: 6508c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_7: 6518c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_8: 6528c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_9: 6538c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_10: 6548c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_11: 6558c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_12: 6568c2ecf20Sopenharmony_ci case RT5682_SAR_IL_CMD_13: 6578c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_1: 6588c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_2: 6598c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_3: 6608c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_4: 6618c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_5: 6628c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_6: 6638c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_7: 6648c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_8: 6658c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_9: 6668c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_10: 6678c2ecf20Sopenharmony_ci case RT5682_EFUSE_CTRL_11: 6688c2ecf20Sopenharmony_ci case RT5682_JD_TOP_VC_VTRL: 6698c2ecf20Sopenharmony_ci case RT5682_DRC1_CTRL_0: 6708c2ecf20Sopenharmony_ci case RT5682_DRC1_CTRL_1: 6718c2ecf20Sopenharmony_ci case RT5682_DRC1_CTRL_2: 6728c2ecf20Sopenharmony_ci case RT5682_DRC1_CTRL_3: 6738c2ecf20Sopenharmony_ci case RT5682_DRC1_CTRL_4: 6748c2ecf20Sopenharmony_ci case RT5682_DRC1_CTRL_5: 6758c2ecf20Sopenharmony_ci case RT5682_DRC1_CTRL_6: 6768c2ecf20Sopenharmony_ci case RT5682_DRC1_HARD_LMT_CTRL_1: 6778c2ecf20Sopenharmony_ci case RT5682_DRC1_HARD_LMT_CTRL_2: 6788c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_1: 6798c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_2: 6808c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_3: 6818c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_4: 6828c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_5: 6838c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_6: 6848c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_7: 6858c2ecf20Sopenharmony_ci case RT5682_DRC1_PRIV_8: 6868c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL1: 6878c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL2: 6888c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL3: 6898c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL4: 6908c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL5: 6918c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL6: 6928c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL7: 6938c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL8: 6948c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL9: 6958c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL10: 6968c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL11: 6978c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL12: 6988c2ecf20Sopenharmony_ci case RT5682_EQ_AUTO_RCV_CTRL13: 6998c2ecf20Sopenharmony_ci case RT5682_ADC_L_EQ_LPF1_A1: 7008c2ecf20Sopenharmony_ci case RT5682_R_EQ_LPF1_A1: 7018c2ecf20Sopenharmony_ci case RT5682_L_EQ_LPF1_H0: 7028c2ecf20Sopenharmony_ci case RT5682_R_EQ_LPF1_H0: 7038c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF1_A1: 7048c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF1_A1: 7058c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF1_A2: 7068c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF1_A2: 7078c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF1_H0: 7088c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF1_H0: 7098c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF2_A1: 7108c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF2_A1: 7118c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF2_A2: 7128c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF2_A2: 7138c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF2_H0: 7148c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF2_H0: 7158c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF3_A1: 7168c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF3_A1: 7178c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF3_A2: 7188c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF3_A2: 7198c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF3_H0: 7208c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF3_H0: 7218c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF4_A1: 7228c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF4_A1: 7238c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF4_A2: 7248c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF4_A2: 7258c2ecf20Sopenharmony_ci case RT5682_L_EQ_BPF4_H0: 7268c2ecf20Sopenharmony_ci case RT5682_R_EQ_BPF4_H0: 7278c2ecf20Sopenharmony_ci case RT5682_L_EQ_HPF1_A1: 7288c2ecf20Sopenharmony_ci case RT5682_R_EQ_HPF1_A1: 7298c2ecf20Sopenharmony_ci case RT5682_L_EQ_HPF1_H0: 7308c2ecf20Sopenharmony_ci case RT5682_R_EQ_HPF1_H0: 7318c2ecf20Sopenharmony_ci case RT5682_L_EQ_PRE_VOL: 7328c2ecf20Sopenharmony_ci case RT5682_R_EQ_PRE_VOL: 7338c2ecf20Sopenharmony_ci case RT5682_L_EQ_POST_VOL: 7348c2ecf20Sopenharmony_ci case RT5682_R_EQ_POST_VOL: 7358c2ecf20Sopenharmony_ci case RT5682_I2C_MODE: 7368c2ecf20Sopenharmony_ci return true; 7378c2ecf20Sopenharmony_ci default: 7388c2ecf20Sopenharmony_ci return false; 7398c2ecf20Sopenharmony_ci } 7408c2ecf20Sopenharmony_ci} 7418c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_readable_register); 7428c2ecf20Sopenharmony_ci 7438c2ecf20Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0); 7448c2ecf20Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0); 7458c2ecf20Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); 7468c2ecf20Sopenharmony_ci 7478c2ecf20Sopenharmony_ci/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ 7488c2ecf20Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(bst_tlv, 7498c2ecf20Sopenharmony_ci 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0), 7508c2ecf20Sopenharmony_ci 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0), 7518c2ecf20Sopenharmony_ci 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0), 7528c2ecf20Sopenharmony_ci 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0), 7538c2ecf20Sopenharmony_ci 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0), 7548c2ecf20Sopenharmony_ci 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0), 7558c2ecf20Sopenharmony_ci 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0) 7568c2ecf20Sopenharmony_ci); 7578c2ecf20Sopenharmony_ci 7588c2ecf20Sopenharmony_ci/* Interface data select */ 7598c2ecf20Sopenharmony_cistatic const char * const rt5682_data_select[] = { 7608c2ecf20Sopenharmony_ci "L/R", "R/L", "L/L", "R/R" 7618c2ecf20Sopenharmony_ci}; 7628c2ecf20Sopenharmony_ci 7638c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if2_adc_enum, 7648c2ecf20Sopenharmony_ci RT5682_DIG_INF2_DATA, RT5682_IF2_ADC_SEL_SFT, rt5682_data_select); 7658c2ecf20Sopenharmony_ci 7668c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_01_adc_enum, 7678c2ecf20Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC1_SEL_SFT, rt5682_data_select); 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_23_adc_enum, 7708c2ecf20Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC2_SEL_SFT, rt5682_data_select); 7718c2ecf20Sopenharmony_ci 7728c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_45_adc_enum, 7738c2ecf20Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC3_SEL_SFT, rt5682_data_select); 7748c2ecf20Sopenharmony_ci 7758c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_if1_67_adc_enum, 7768c2ecf20Sopenharmony_ci RT5682_TDM_ADDA_CTRL_1, RT5682_IF1_ADC4_SEL_SFT, rt5682_data_select); 7778c2ecf20Sopenharmony_ci 7788c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if2_adc_swap_mux = 7798c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682_if2_adc_enum); 7808c2ecf20Sopenharmony_ci 7818c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_01_adc_swap_mux = 7828c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", rt5682_if1_01_adc_enum); 7838c2ecf20Sopenharmony_ci 7848c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_23_adc_swap_mux = 7858c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", rt5682_if1_23_adc_enum); 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_45_adc_swap_mux = 7888c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", rt5682_if1_45_adc_enum); 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_67_adc_swap_mux = 7918c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", rt5682_if1_67_adc_enum); 7928c2ecf20Sopenharmony_ci 7938c2ecf20Sopenharmony_cistatic const char * const rt5682_dac_select[] = { 7948c2ecf20Sopenharmony_ci "IF1", "SOUND" 7958c2ecf20Sopenharmony_ci}; 7968c2ecf20Sopenharmony_ci 7978c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_dacl_enum, 7988c2ecf20Sopenharmony_ci RT5682_AD_DA_MIXER, RT5682_DAC1_L_SEL_SFT, rt5682_dac_select); 7998c2ecf20Sopenharmony_ci 8008c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_l_mux = 8018c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("DAC L Mux", rt5682_dacl_enum); 8028c2ecf20Sopenharmony_ci 8038c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5682_dacr_enum, 8048c2ecf20Sopenharmony_ci RT5682_AD_DA_MIXER, RT5682_DAC1_R_SEL_SFT, rt5682_dac_select); 8058c2ecf20Sopenharmony_ci 8068c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_r_mux = 8078c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("DAC R Mux", rt5682_dacr_enum); 8088c2ecf20Sopenharmony_ci 8098c2ecf20Sopenharmony_civoid rt5682_reset(struct rt5682_priv *rt5682) 8108c2ecf20Sopenharmony_ci{ 8118c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_RESET, 0); 8128c2ecf20Sopenharmony_ci if (!rt5682->is_sdw) 8138c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_I2C_MODE, 1); 8148c2ecf20Sopenharmony_ci} 8158c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_reset); 8168c2ecf20Sopenharmony_ci 8178c2ecf20Sopenharmony_ci/** 8188c2ecf20Sopenharmony_ci * rt5682_sel_asrc_clk_src - select ASRC clock source for a set of filters 8198c2ecf20Sopenharmony_ci * @component: SoC audio component device. 8208c2ecf20Sopenharmony_ci * @filter_mask: mask of filters. 8218c2ecf20Sopenharmony_ci * @clk_src: clock source 8228c2ecf20Sopenharmony_ci * 8238c2ecf20Sopenharmony_ci * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5682 can 8248c2ecf20Sopenharmony_ci * only support standard 32fs or 64fs i2s format, ASRC should be enabled to 8258c2ecf20Sopenharmony_ci * support special i2s clock format such as Intel's 100fs(100 * sampling rate). 8268c2ecf20Sopenharmony_ci * ASRC function will track i2s clock and generate a corresponding system clock 8278c2ecf20Sopenharmony_ci * for codec. This function provides an API to select the clock source for a 8288c2ecf20Sopenharmony_ci * set of filters specified by the mask. And the component driver will turn on 8298c2ecf20Sopenharmony_ci * ASRC for these filters if ASRC is selected as their clock source. 8308c2ecf20Sopenharmony_ci */ 8318c2ecf20Sopenharmony_ciint rt5682_sel_asrc_clk_src(struct snd_soc_component *component, 8328c2ecf20Sopenharmony_ci unsigned int filter_mask, unsigned int clk_src) 8338c2ecf20Sopenharmony_ci{ 8348c2ecf20Sopenharmony_ci switch (clk_src) { 8358c2ecf20Sopenharmony_ci case RT5682_CLK_SEL_SYS: 8368c2ecf20Sopenharmony_ci case RT5682_CLK_SEL_I2S1_ASRC: 8378c2ecf20Sopenharmony_ci case RT5682_CLK_SEL_I2S2_ASRC: 8388c2ecf20Sopenharmony_ci break; 8398c2ecf20Sopenharmony_ci 8408c2ecf20Sopenharmony_ci default: 8418c2ecf20Sopenharmony_ci return -EINVAL; 8428c2ecf20Sopenharmony_ci } 8438c2ecf20Sopenharmony_ci 8448c2ecf20Sopenharmony_ci if (filter_mask & RT5682_DA_STEREO1_FILTER) { 8458c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PLL_TRACK_2, 8468c2ecf20Sopenharmony_ci RT5682_FILTER_CLK_SEL_MASK, 8478c2ecf20Sopenharmony_ci clk_src << RT5682_FILTER_CLK_SEL_SFT); 8488c2ecf20Sopenharmony_ci } 8498c2ecf20Sopenharmony_ci 8508c2ecf20Sopenharmony_ci if (filter_mask & RT5682_AD_STEREO1_FILTER) { 8518c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PLL_TRACK_3, 8528c2ecf20Sopenharmony_ci RT5682_FILTER_CLK_SEL_MASK, 8538c2ecf20Sopenharmony_ci clk_src << RT5682_FILTER_CLK_SEL_SFT); 8548c2ecf20Sopenharmony_ci } 8558c2ecf20Sopenharmony_ci 8568c2ecf20Sopenharmony_ci return 0; 8578c2ecf20Sopenharmony_ci} 8588c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_sel_asrc_clk_src); 8598c2ecf20Sopenharmony_ci 8608c2ecf20Sopenharmony_cistatic int rt5682_button_detect(struct snd_soc_component *component) 8618c2ecf20Sopenharmony_ci{ 8628c2ecf20Sopenharmony_ci int btn_type, val; 8638c2ecf20Sopenharmony_ci 8648c2ecf20Sopenharmony_ci val = snd_soc_component_read(component, RT5682_4BTN_IL_CMD_1); 8658c2ecf20Sopenharmony_ci btn_type = val & 0xfff0; 8668c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_4BTN_IL_CMD_1, val); 8678c2ecf20Sopenharmony_ci dev_dbg(component->dev, "%s btn_type=%x\n", __func__, btn_type); 8688c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 8698c2ecf20Sopenharmony_ci RT5682_SAR_IL_CMD_2, 0x10, 0x10); 8708c2ecf20Sopenharmony_ci 8718c2ecf20Sopenharmony_ci return btn_type; 8728c2ecf20Sopenharmony_ci} 8738c2ecf20Sopenharmony_ci 8748c2ecf20Sopenharmony_cistatic void rt5682_enable_push_button_irq(struct snd_soc_component *component, 8758c2ecf20Sopenharmony_ci bool enable) 8768c2ecf20Sopenharmony_ci{ 8778c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 8788c2ecf20Sopenharmony_ci 8798c2ecf20Sopenharmony_ci if (enable) { 8808c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 8818c2ecf20Sopenharmony_ci RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_EN); 8828c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13, 8838c2ecf20Sopenharmony_ci RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_BTN); 8848c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_IL_CMD_1, 0x0040); 8858c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2, 8868c2ecf20Sopenharmony_ci RT5682_4BTN_IL_MASK | RT5682_4BTN_IL_RST_MASK, 8878c2ecf20Sopenharmony_ci RT5682_4BTN_IL_EN | RT5682_4BTN_IL_NOR); 8888c2ecf20Sopenharmony_ci if (rt5682->is_sdw) 8898c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 8908c2ecf20Sopenharmony_ci RT5682_IRQ_CTRL_3, 8918c2ecf20Sopenharmony_ci RT5682_IL_IRQ_MASK | RT5682_IL_IRQ_TYPE_MASK, 8928c2ecf20Sopenharmony_ci RT5682_IL_IRQ_EN | RT5682_IL_IRQ_PUL); 8938c2ecf20Sopenharmony_ci else 8948c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 8958c2ecf20Sopenharmony_ci RT5682_IRQ_CTRL_3, RT5682_IL_IRQ_MASK, 8968c2ecf20Sopenharmony_ci RT5682_IL_IRQ_EN); 8978c2ecf20Sopenharmony_ci } else { 8988c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_IRQ_CTRL_3, 8998c2ecf20Sopenharmony_ci RT5682_IL_IRQ_MASK, RT5682_IL_IRQ_DIS); 9008c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, 9018c2ecf20Sopenharmony_ci RT5682_SAR_BUTT_DET_MASK, RT5682_SAR_BUTT_DET_DIS); 9028c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2, 9038c2ecf20Sopenharmony_ci RT5682_4BTN_IL_MASK, RT5682_4BTN_IL_DIS); 9048c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_4BTN_IL_CMD_2, 9058c2ecf20Sopenharmony_ci RT5682_4BTN_IL_RST_MASK, RT5682_4BTN_IL_RST); 9068c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_13, 9078c2ecf20Sopenharmony_ci RT5682_SAR_SOUR_MASK, RT5682_SAR_SOUR_TYPE); 9088c2ecf20Sopenharmony_ci } 9098c2ecf20Sopenharmony_ci} 9108c2ecf20Sopenharmony_ci 9118c2ecf20Sopenharmony_ci/** 9128c2ecf20Sopenharmony_ci * rt5682_headset_detect - Detect headset. 9138c2ecf20Sopenharmony_ci * @component: SoC audio component device. 9148c2ecf20Sopenharmony_ci * @jack_insert: Jack insert or not. 9158c2ecf20Sopenharmony_ci * 9168c2ecf20Sopenharmony_ci * Detect whether is headset or not when jack inserted. 9178c2ecf20Sopenharmony_ci * 9188c2ecf20Sopenharmony_ci * Returns detect status. 9198c2ecf20Sopenharmony_ci */ 9208c2ecf20Sopenharmony_ciint rt5682_headset_detect(struct snd_soc_component *component, int jack_insert) 9218c2ecf20Sopenharmony_ci{ 9228c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 9238c2ecf20Sopenharmony_ci struct snd_soc_dapm_context *dapm = &component->dapm; 9248c2ecf20Sopenharmony_ci unsigned int val, count; 9258c2ecf20Sopenharmony_ci 9268c2ecf20Sopenharmony_ci if (jack_insert) { 9278c2ecf20Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 9288c2ecf20Sopenharmony_ci 9298c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 9308c2ecf20Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB, 9318c2ecf20Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB); 9328c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 9338c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0); 9348c2ecf20Sopenharmony_ci usleep_range(15000, 20000); 9358c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 9368c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, RT5682_PWR_FV2); 9378c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3, 9388c2ecf20Sopenharmony_ci RT5682_PWR_CBJ, RT5682_PWR_CBJ); 9398c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 9408c2ecf20Sopenharmony_ci RT5682_HP_CHARGE_PUMP_1, 9418c2ecf20Sopenharmony_ci RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0); 9428c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 9438c2ecf20Sopenharmony_ci RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH); 9448c2ecf20Sopenharmony_ci 9458c2ecf20Sopenharmony_ci count = 0; 9468c2ecf20Sopenharmony_ci val = snd_soc_component_read(component, RT5682_CBJ_CTRL_2) 9478c2ecf20Sopenharmony_ci & RT5682_JACK_TYPE_MASK; 9488c2ecf20Sopenharmony_ci while (val == 0 && count < 50) { 9498c2ecf20Sopenharmony_ci usleep_range(10000, 15000); 9508c2ecf20Sopenharmony_ci val = snd_soc_component_read(component, 9518c2ecf20Sopenharmony_ci RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK; 9528c2ecf20Sopenharmony_ci count++; 9538c2ecf20Sopenharmony_ci } 9548c2ecf20Sopenharmony_ci 9558c2ecf20Sopenharmony_ci switch (val) { 9568c2ecf20Sopenharmony_ci case 0x1: 9578c2ecf20Sopenharmony_ci case 0x2: 9588c2ecf20Sopenharmony_ci rt5682->jack_type = SND_JACK_HEADSET; 9598c2ecf20Sopenharmony_ci rt5682_enable_push_button_irq(component, true); 9608c2ecf20Sopenharmony_ci break; 9618c2ecf20Sopenharmony_ci default: 9628c2ecf20Sopenharmony_ci rt5682->jack_type = SND_JACK_HEADPHONE; 9638c2ecf20Sopenharmony_ci break; 9648c2ecf20Sopenharmony_ci } 9658c2ecf20Sopenharmony_ci 9668c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 9678c2ecf20Sopenharmony_ci RT5682_HP_CHARGE_PUMP_1, 9688c2ecf20Sopenharmony_ci RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 9698c2ecf20Sopenharmony_ci RT5682_OSW_L_EN | RT5682_OSW_R_EN); 9708c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_MICBIAS_2, 9718c2ecf20Sopenharmony_ci RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK, 9728c2ecf20Sopenharmony_ci RT5682_PWR_CLK25M_PU | RT5682_PWR_CLK1M_PU); 9738c2ecf20Sopenharmony_ci 9748c2ecf20Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 9758c2ecf20Sopenharmony_ci } else { 9768c2ecf20Sopenharmony_ci rt5682_enable_push_button_irq(component, false); 9778c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, 9788c2ecf20Sopenharmony_ci RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW); 9798c2ecf20Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(dapm, "MICBIAS") && 9808c2ecf20Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL1") && 9818c2ecf20Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL2B")) 9828c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 9838c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0); 9848c2ecf20Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(dapm, "Vref2") && 9858c2ecf20Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL1") && 9868c2ecf20Sopenharmony_ci !snd_soc_dapm_get_pin_status(dapm, "PLL2B")) 9878c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 9888c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0); 9898c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_3, 9908c2ecf20Sopenharmony_ci RT5682_PWR_CBJ, 0); 9918c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_MICBIAS_2, 9928c2ecf20Sopenharmony_ci RT5682_PWR_CLK25M_MASK | RT5682_PWR_CLK1M_MASK, 9938c2ecf20Sopenharmony_ci RT5682_PWR_CLK25M_PD | RT5682_PWR_CLK1M_PD); 9948c2ecf20Sopenharmony_ci 9958c2ecf20Sopenharmony_ci rt5682->jack_type = 0; 9968c2ecf20Sopenharmony_ci } 9978c2ecf20Sopenharmony_ci 9988c2ecf20Sopenharmony_ci dev_dbg(component->dev, "jack_type = %d\n", rt5682->jack_type); 9998c2ecf20Sopenharmony_ci return rt5682->jack_type; 10008c2ecf20Sopenharmony_ci} 10018c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_headset_detect); 10028c2ecf20Sopenharmony_ci 10038c2ecf20Sopenharmony_cistatic int rt5682_set_jack_detect(struct snd_soc_component *component, 10048c2ecf20Sopenharmony_ci struct snd_soc_jack *hs_jack, void *data) 10058c2ecf20Sopenharmony_ci{ 10068c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 10078c2ecf20Sopenharmony_ci 10088c2ecf20Sopenharmony_ci rt5682->hs_jack = hs_jack; 10098c2ecf20Sopenharmony_ci 10108c2ecf20Sopenharmony_ci if (!hs_jack) { 10118c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2, 10128c2ecf20Sopenharmony_ci RT5682_JD1_EN_MASK, RT5682_JD1_DIS); 10138c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL, 10148c2ecf20Sopenharmony_ci RT5682_POW_JDH | RT5682_POW_JDL, 0); 10158c2ecf20Sopenharmony_ci cancel_delayed_work_sync(&rt5682->jack_detect_work); 10168c2ecf20Sopenharmony_ci 10178c2ecf20Sopenharmony_ci return 0; 10188c2ecf20Sopenharmony_ci } 10198c2ecf20Sopenharmony_ci 10208c2ecf20Sopenharmony_ci if (!rt5682->is_sdw) { 10218c2ecf20Sopenharmony_ci switch (rt5682->pdata.jd_src) { 10228c2ecf20Sopenharmony_ci case RT5682_JD1: 10238c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 10248c2ecf20Sopenharmony_ci RT5682_CBJ_CTRL_2, RT5682_EXT_JD_SRC, 10258c2ecf20Sopenharmony_ci RT5682_EXT_JD_SRC_MANUAL); 10268c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_CBJ_CTRL_1, 10278c2ecf20Sopenharmony_ci 0xd042); 10288c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 10298c2ecf20Sopenharmony_ci RT5682_CBJ_CTRL_3, RT5682_CBJ_IN_BUF_EN, 10308c2ecf20Sopenharmony_ci RT5682_CBJ_IN_BUF_EN); 10318c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 10328c2ecf20Sopenharmony_ci RT5682_SAR_IL_CMD_1, RT5682_SAR_POW_MASK, 10338c2ecf20Sopenharmony_ci RT5682_SAR_POW_EN); 10348c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_GPIO_CTRL_1, 10358c2ecf20Sopenharmony_ci RT5682_GP1_PIN_MASK, RT5682_GP1_PIN_IRQ); 10368c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL, 10378c2ecf20Sopenharmony_ci RT5682_POW_IRQ | RT5682_POW_JDH | 10388c2ecf20Sopenharmony_ci RT5682_POW_ANA, RT5682_POW_IRQ | 10398c2ecf20Sopenharmony_ci RT5682_POW_JDH | RT5682_POW_ANA); 10408c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_2, 10418c2ecf20Sopenharmony_ci RT5682_PWR_JDH, RT5682_PWR_JDH); 10428c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2, 10438c2ecf20Sopenharmony_ci RT5682_JD1_EN_MASK | RT5682_JD1_POL_MASK, 10448c2ecf20Sopenharmony_ci RT5682_JD1_EN | RT5682_JD1_POL_NOR); 10458c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_4, 10468c2ecf20Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 10478c2ecf20Sopenharmony_ci rt5682->pdata.btndet_delay)); 10488c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_5, 10498c2ecf20Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 10508c2ecf20Sopenharmony_ci rt5682->pdata.btndet_delay)); 10518c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_6, 10528c2ecf20Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 10538c2ecf20Sopenharmony_ci rt5682->pdata.btndet_delay)); 10548c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_4BTN_IL_CMD_7, 10558c2ecf20Sopenharmony_ci 0x7f7f, (rt5682->pdata.btndet_delay << 8 | 10568c2ecf20Sopenharmony_ci rt5682->pdata.btndet_delay)); 10578c2ecf20Sopenharmony_ci mod_delayed_work(system_power_efficient_wq, 10588c2ecf20Sopenharmony_ci &rt5682->jack_detect_work, 10598c2ecf20Sopenharmony_ci msecs_to_jiffies(250)); 10608c2ecf20Sopenharmony_ci break; 10618c2ecf20Sopenharmony_ci 10628c2ecf20Sopenharmony_ci case RT5682_JD_NULL: 10638c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_IRQ_CTRL_2, 10648c2ecf20Sopenharmony_ci RT5682_JD1_EN_MASK, RT5682_JD1_DIS); 10658c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_RC_CLK_CTRL, 10668c2ecf20Sopenharmony_ci RT5682_POW_JDH | RT5682_POW_JDL, 0); 10678c2ecf20Sopenharmony_ci break; 10688c2ecf20Sopenharmony_ci 10698c2ecf20Sopenharmony_ci default: 10708c2ecf20Sopenharmony_ci dev_warn(component->dev, "Wrong JD source\n"); 10718c2ecf20Sopenharmony_ci break; 10728c2ecf20Sopenharmony_ci } 10738c2ecf20Sopenharmony_ci } 10748c2ecf20Sopenharmony_ci 10758c2ecf20Sopenharmony_ci return 0; 10768c2ecf20Sopenharmony_ci} 10778c2ecf20Sopenharmony_ci 10788c2ecf20Sopenharmony_civoid rt5682_jack_detect_handler(struct work_struct *work) 10798c2ecf20Sopenharmony_ci{ 10808c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 10818c2ecf20Sopenharmony_ci container_of(work, struct rt5682_priv, jack_detect_work.work); 10828c2ecf20Sopenharmony_ci int val, btn_type; 10838c2ecf20Sopenharmony_ci 10848c2ecf20Sopenharmony_ci if (!rt5682->component || !rt5682->component->card || 10858c2ecf20Sopenharmony_ci !rt5682->component->card->instantiated) { 10868c2ecf20Sopenharmony_ci /* card not yet ready, try later */ 10878c2ecf20Sopenharmony_ci mod_delayed_work(system_power_efficient_wq, 10888c2ecf20Sopenharmony_ci &rt5682->jack_detect_work, msecs_to_jiffies(15)); 10898c2ecf20Sopenharmony_ci return; 10908c2ecf20Sopenharmony_ci } 10918c2ecf20Sopenharmony_ci 10928c2ecf20Sopenharmony_ci mutex_lock(&rt5682->calibrate_mutex); 10938c2ecf20Sopenharmony_ci 10948c2ecf20Sopenharmony_ci val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL) 10958c2ecf20Sopenharmony_ci & RT5682_JDH_RS_MASK; 10968c2ecf20Sopenharmony_ci if (!val) { 10978c2ecf20Sopenharmony_ci /* jack in */ 10988c2ecf20Sopenharmony_ci if (rt5682->jack_type == 0) { 10998c2ecf20Sopenharmony_ci /* jack was out, report jack type */ 11008c2ecf20Sopenharmony_ci rt5682->jack_type = 11018c2ecf20Sopenharmony_ci rt5682_headset_detect(rt5682->component, 1); 11028c2ecf20Sopenharmony_ci } else if ((rt5682->jack_type & SND_JACK_HEADSET) == 11038c2ecf20Sopenharmony_ci SND_JACK_HEADSET) { 11048c2ecf20Sopenharmony_ci /* jack is already in, report button event */ 11058c2ecf20Sopenharmony_ci rt5682->jack_type = SND_JACK_HEADSET; 11068c2ecf20Sopenharmony_ci btn_type = rt5682_button_detect(rt5682->component); 11078c2ecf20Sopenharmony_ci /** 11088c2ecf20Sopenharmony_ci * rt5682 can report three kinds of button behavior, 11098c2ecf20Sopenharmony_ci * one click, double click and hold. However, 11108c2ecf20Sopenharmony_ci * currently we will report button pressed/released 11118c2ecf20Sopenharmony_ci * event. So all the three button behaviors are 11128c2ecf20Sopenharmony_ci * treated as button pressed. 11138c2ecf20Sopenharmony_ci */ 11148c2ecf20Sopenharmony_ci switch (btn_type) { 11158c2ecf20Sopenharmony_ci case 0x8000: 11168c2ecf20Sopenharmony_ci case 0x4000: 11178c2ecf20Sopenharmony_ci case 0x2000: 11188c2ecf20Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_0; 11198c2ecf20Sopenharmony_ci break; 11208c2ecf20Sopenharmony_ci case 0x1000: 11218c2ecf20Sopenharmony_ci case 0x0800: 11228c2ecf20Sopenharmony_ci case 0x0400: 11238c2ecf20Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_1; 11248c2ecf20Sopenharmony_ci break; 11258c2ecf20Sopenharmony_ci case 0x0200: 11268c2ecf20Sopenharmony_ci case 0x0100: 11278c2ecf20Sopenharmony_ci case 0x0080: 11288c2ecf20Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_2; 11298c2ecf20Sopenharmony_ci break; 11308c2ecf20Sopenharmony_ci case 0x0040: 11318c2ecf20Sopenharmony_ci case 0x0020: 11328c2ecf20Sopenharmony_ci case 0x0010: 11338c2ecf20Sopenharmony_ci rt5682->jack_type |= SND_JACK_BTN_3; 11348c2ecf20Sopenharmony_ci break; 11358c2ecf20Sopenharmony_ci case 0x0000: /* unpressed */ 11368c2ecf20Sopenharmony_ci break; 11378c2ecf20Sopenharmony_ci default: 11388c2ecf20Sopenharmony_ci dev_err(rt5682->component->dev, 11398c2ecf20Sopenharmony_ci "Unexpected button code 0x%04x\n", 11408c2ecf20Sopenharmony_ci btn_type); 11418c2ecf20Sopenharmony_ci break; 11428c2ecf20Sopenharmony_ci } 11438c2ecf20Sopenharmony_ci } 11448c2ecf20Sopenharmony_ci } else { 11458c2ecf20Sopenharmony_ci /* jack out */ 11468c2ecf20Sopenharmony_ci rt5682->jack_type = rt5682_headset_detect(rt5682->component, 0); 11478c2ecf20Sopenharmony_ci } 11488c2ecf20Sopenharmony_ci 11498c2ecf20Sopenharmony_ci snd_soc_jack_report(rt5682->hs_jack, rt5682->jack_type, 11508c2ecf20Sopenharmony_ci SND_JACK_HEADSET | 11518c2ecf20Sopenharmony_ci SND_JACK_BTN_0 | SND_JACK_BTN_1 | 11528c2ecf20Sopenharmony_ci SND_JACK_BTN_2 | SND_JACK_BTN_3); 11538c2ecf20Sopenharmony_ci 11548c2ecf20Sopenharmony_ci if (!rt5682->is_sdw) { 11558c2ecf20Sopenharmony_ci if (rt5682->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 | 11568c2ecf20Sopenharmony_ci SND_JACK_BTN_2 | SND_JACK_BTN_3)) 11578c2ecf20Sopenharmony_ci schedule_delayed_work(&rt5682->jd_check_work, 0); 11588c2ecf20Sopenharmony_ci else 11598c2ecf20Sopenharmony_ci cancel_delayed_work_sync(&rt5682->jd_check_work); 11608c2ecf20Sopenharmony_ci } 11618c2ecf20Sopenharmony_ci 11628c2ecf20Sopenharmony_ci mutex_unlock(&rt5682->calibrate_mutex); 11638c2ecf20Sopenharmony_ci} 11648c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_jack_detect_handler); 11658c2ecf20Sopenharmony_ci 11668c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_snd_controls[] = { 11678c2ecf20Sopenharmony_ci /* DAC Digital Volume */ 11688c2ecf20Sopenharmony_ci SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682_DAC1_DIG_VOL, 11698c2ecf20Sopenharmony_ci RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 87, 0, dac_vol_tlv), 11708c2ecf20Sopenharmony_ci 11718c2ecf20Sopenharmony_ci /* IN Boost Volume */ 11728c2ecf20Sopenharmony_ci SOC_SINGLE_TLV("CBJ Boost Volume", RT5682_CBJ_BST_CTRL, 11738c2ecf20Sopenharmony_ci RT5682_BST_CBJ_SFT, 8, 0, bst_tlv), 11748c2ecf20Sopenharmony_ci 11758c2ecf20Sopenharmony_ci /* ADC Digital Volume Control */ 11768c2ecf20Sopenharmony_ci SOC_DOUBLE("STO1 ADC Capture Switch", RT5682_STO1_ADC_DIG_VOL, 11778c2ecf20Sopenharmony_ci RT5682_L_MUTE_SFT, RT5682_R_MUTE_SFT, 1, 1), 11788c2ecf20Sopenharmony_ci SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682_STO1_ADC_DIG_VOL, 11798c2ecf20Sopenharmony_ci RT5682_L_VOL_SFT + 1, RT5682_R_VOL_SFT + 1, 63, 0, adc_vol_tlv), 11808c2ecf20Sopenharmony_ci 11818c2ecf20Sopenharmony_ci /* ADC Boost Volume Control */ 11828c2ecf20Sopenharmony_ci SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682_STO1_ADC_BOOST, 11838c2ecf20Sopenharmony_ci RT5682_STO1_ADC_L_BST_SFT, RT5682_STO1_ADC_R_BST_SFT, 11848c2ecf20Sopenharmony_ci 3, 0, adc_bst_tlv), 11858c2ecf20Sopenharmony_ci}; 11868c2ecf20Sopenharmony_ci 11878c2ecf20Sopenharmony_cistatic int rt5682_div_sel(struct rt5682_priv *rt5682, 11888c2ecf20Sopenharmony_ci int target, const int div[], int size) 11898c2ecf20Sopenharmony_ci{ 11908c2ecf20Sopenharmony_ci int i; 11918c2ecf20Sopenharmony_ci 11928c2ecf20Sopenharmony_ci if (rt5682->sysclk < target) { 11938c2ecf20Sopenharmony_ci dev_err(rt5682->component->dev, 11948c2ecf20Sopenharmony_ci "sysclk rate %d is too low\n", rt5682->sysclk); 11958c2ecf20Sopenharmony_ci return 0; 11968c2ecf20Sopenharmony_ci } 11978c2ecf20Sopenharmony_ci 11988c2ecf20Sopenharmony_ci for (i = 0; i < size - 1; i++) { 11998c2ecf20Sopenharmony_ci dev_dbg(rt5682->component->dev, "div[%d]=%d\n", i, div[i]); 12008c2ecf20Sopenharmony_ci if (target * div[i] == rt5682->sysclk) 12018c2ecf20Sopenharmony_ci return i; 12028c2ecf20Sopenharmony_ci if (target * div[i + 1] > rt5682->sysclk) { 12038c2ecf20Sopenharmony_ci dev_dbg(rt5682->component->dev, 12048c2ecf20Sopenharmony_ci "can't find div for sysclk %d\n", 12058c2ecf20Sopenharmony_ci rt5682->sysclk); 12068c2ecf20Sopenharmony_ci return i; 12078c2ecf20Sopenharmony_ci } 12088c2ecf20Sopenharmony_ci } 12098c2ecf20Sopenharmony_ci 12108c2ecf20Sopenharmony_ci if (target * div[i] < rt5682->sysclk) 12118c2ecf20Sopenharmony_ci dev_err(rt5682->component->dev, 12128c2ecf20Sopenharmony_ci "sysclk rate %d is too high\n", rt5682->sysclk); 12138c2ecf20Sopenharmony_ci 12148c2ecf20Sopenharmony_ci return size - 1; 12158c2ecf20Sopenharmony_ci} 12168c2ecf20Sopenharmony_ci 12178c2ecf20Sopenharmony_ci/** 12188c2ecf20Sopenharmony_ci * set_dmic_clk - Set parameter of dmic. 12198c2ecf20Sopenharmony_ci * 12208c2ecf20Sopenharmony_ci * @w: DAPM widget. 12218c2ecf20Sopenharmony_ci * @kcontrol: The kcontrol of this widget. 12228c2ecf20Sopenharmony_ci * @event: Event id. 12238c2ecf20Sopenharmony_ci * 12248c2ecf20Sopenharmony_ci * Choose dmic clock between 1MHz and 3MHz. 12258c2ecf20Sopenharmony_ci * It is better for clock to approximate 3MHz. 12268c2ecf20Sopenharmony_ci */ 12278c2ecf20Sopenharmony_cistatic int set_dmic_clk(struct snd_soc_dapm_widget *w, 12288c2ecf20Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 12298c2ecf20Sopenharmony_ci{ 12308c2ecf20Sopenharmony_ci struct snd_soc_component *component = 12318c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 12328c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 12338c2ecf20Sopenharmony_ci int idx = -EINVAL, dmic_clk_rate = 3072000; 12348c2ecf20Sopenharmony_ci static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128}; 12358c2ecf20Sopenharmony_ci 12368c2ecf20Sopenharmony_ci if (rt5682->pdata.dmic_clk_rate) 12378c2ecf20Sopenharmony_ci dmic_clk_rate = rt5682->pdata.dmic_clk_rate; 12388c2ecf20Sopenharmony_ci 12398c2ecf20Sopenharmony_ci idx = rt5682_div_sel(rt5682, dmic_clk_rate, div, ARRAY_SIZE(div)); 12408c2ecf20Sopenharmony_ci 12418c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_DMIC_CTRL_1, 12428c2ecf20Sopenharmony_ci RT5682_DMIC_CLK_MASK, idx << RT5682_DMIC_CLK_SFT); 12438c2ecf20Sopenharmony_ci 12448c2ecf20Sopenharmony_ci return 0; 12458c2ecf20Sopenharmony_ci} 12468c2ecf20Sopenharmony_ci 12478c2ecf20Sopenharmony_cistatic int set_filter_clk(struct snd_soc_dapm_widget *w, 12488c2ecf20Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 12498c2ecf20Sopenharmony_ci{ 12508c2ecf20Sopenharmony_ci struct snd_soc_component *component = 12518c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 12528c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 12538c2ecf20Sopenharmony_ci int ref, val, reg, idx = -EINVAL; 12548c2ecf20Sopenharmony_ci static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48}; 12558c2ecf20Sopenharmony_ci static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48}; 12568c2ecf20Sopenharmony_ci 12578c2ecf20Sopenharmony_ci if (rt5682->is_sdw) 12588c2ecf20Sopenharmony_ci return 0; 12598c2ecf20Sopenharmony_ci 12608c2ecf20Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GPIO_CTRL_1) & 12618c2ecf20Sopenharmony_ci RT5682_GP4_PIN_MASK; 12628c2ecf20Sopenharmony_ci if (w->shift == RT5682_PWR_ADC_S1F_BIT && 12638c2ecf20Sopenharmony_ci val == RT5682_GP4_PIN_ADCDAT2) 12648c2ecf20Sopenharmony_ci ref = 256 * rt5682->lrck[RT5682_AIF2]; 12658c2ecf20Sopenharmony_ci else 12668c2ecf20Sopenharmony_ci ref = 256 * rt5682->lrck[RT5682_AIF1]; 12678c2ecf20Sopenharmony_ci 12688c2ecf20Sopenharmony_ci idx = rt5682_div_sel(rt5682, ref, div_f, ARRAY_SIZE(div_f)); 12698c2ecf20Sopenharmony_ci 12708c2ecf20Sopenharmony_ci if (w->shift == RT5682_PWR_ADC_S1F_BIT) 12718c2ecf20Sopenharmony_ci reg = RT5682_PLL_TRACK_3; 12728c2ecf20Sopenharmony_ci else 12738c2ecf20Sopenharmony_ci reg = RT5682_PLL_TRACK_2; 12748c2ecf20Sopenharmony_ci 12758c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, reg, 12768c2ecf20Sopenharmony_ci RT5682_FILTER_CLK_DIV_MASK, idx << RT5682_FILTER_CLK_DIV_SFT); 12778c2ecf20Sopenharmony_ci 12788c2ecf20Sopenharmony_ci /* select over sample rate */ 12798c2ecf20Sopenharmony_ci for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) { 12808c2ecf20Sopenharmony_ci if (rt5682->sysclk <= 12288000 * div_o[idx]) 12818c2ecf20Sopenharmony_ci break; 12828c2ecf20Sopenharmony_ci } 12838c2ecf20Sopenharmony_ci 12848c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1, 12858c2ecf20Sopenharmony_ci RT5682_ADC_OSR_MASK | RT5682_DAC_OSR_MASK, 12868c2ecf20Sopenharmony_ci (idx << RT5682_ADC_OSR_SFT) | (idx << RT5682_DAC_OSR_SFT)); 12878c2ecf20Sopenharmony_ci 12888c2ecf20Sopenharmony_ci return 0; 12898c2ecf20Sopenharmony_ci} 12908c2ecf20Sopenharmony_ci 12918c2ecf20Sopenharmony_cistatic int is_sys_clk_from_pll1(struct snd_soc_dapm_widget *w, 12928c2ecf20Sopenharmony_ci struct snd_soc_dapm_widget *sink) 12938c2ecf20Sopenharmony_ci{ 12948c2ecf20Sopenharmony_ci unsigned int val; 12958c2ecf20Sopenharmony_ci struct snd_soc_component *component = 12968c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 12978c2ecf20Sopenharmony_ci 12988c2ecf20Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GLB_CLK); 12998c2ecf20Sopenharmony_ci val &= RT5682_SCLK_SRC_MASK; 13008c2ecf20Sopenharmony_ci if (val == RT5682_SCLK_SRC_PLL1) 13018c2ecf20Sopenharmony_ci return 1; 13028c2ecf20Sopenharmony_ci else 13038c2ecf20Sopenharmony_ci return 0; 13048c2ecf20Sopenharmony_ci} 13058c2ecf20Sopenharmony_ci 13068c2ecf20Sopenharmony_cistatic int is_sys_clk_from_pll2(struct snd_soc_dapm_widget *w, 13078c2ecf20Sopenharmony_ci struct snd_soc_dapm_widget *sink) 13088c2ecf20Sopenharmony_ci{ 13098c2ecf20Sopenharmony_ci unsigned int val; 13108c2ecf20Sopenharmony_ci struct snd_soc_component *component = 13118c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 13128c2ecf20Sopenharmony_ci 13138c2ecf20Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GLB_CLK); 13148c2ecf20Sopenharmony_ci val &= RT5682_SCLK_SRC_MASK; 13158c2ecf20Sopenharmony_ci if (val == RT5682_SCLK_SRC_PLL2) 13168c2ecf20Sopenharmony_ci return 1; 13178c2ecf20Sopenharmony_ci else 13188c2ecf20Sopenharmony_ci return 0; 13198c2ecf20Sopenharmony_ci} 13208c2ecf20Sopenharmony_ci 13218c2ecf20Sopenharmony_cistatic int is_using_asrc(struct snd_soc_dapm_widget *w, 13228c2ecf20Sopenharmony_ci struct snd_soc_dapm_widget *sink) 13238c2ecf20Sopenharmony_ci{ 13248c2ecf20Sopenharmony_ci unsigned int reg, shift, val; 13258c2ecf20Sopenharmony_ci struct snd_soc_component *component = 13268c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 13278c2ecf20Sopenharmony_ci 13288c2ecf20Sopenharmony_ci switch (w->shift) { 13298c2ecf20Sopenharmony_ci case RT5682_ADC_STO1_ASRC_SFT: 13308c2ecf20Sopenharmony_ci reg = RT5682_PLL_TRACK_3; 13318c2ecf20Sopenharmony_ci shift = RT5682_FILTER_CLK_SEL_SFT; 13328c2ecf20Sopenharmony_ci break; 13338c2ecf20Sopenharmony_ci case RT5682_DAC_STO1_ASRC_SFT: 13348c2ecf20Sopenharmony_ci reg = RT5682_PLL_TRACK_2; 13358c2ecf20Sopenharmony_ci shift = RT5682_FILTER_CLK_SEL_SFT; 13368c2ecf20Sopenharmony_ci break; 13378c2ecf20Sopenharmony_ci default: 13388c2ecf20Sopenharmony_ci return 0; 13398c2ecf20Sopenharmony_ci } 13408c2ecf20Sopenharmony_ci 13418c2ecf20Sopenharmony_ci val = (snd_soc_component_read(component, reg) >> shift) & 0xf; 13428c2ecf20Sopenharmony_ci switch (val) { 13438c2ecf20Sopenharmony_ci case RT5682_CLK_SEL_I2S1_ASRC: 13448c2ecf20Sopenharmony_ci case RT5682_CLK_SEL_I2S2_ASRC: 13458c2ecf20Sopenharmony_ci return 1; 13468c2ecf20Sopenharmony_ci default: 13478c2ecf20Sopenharmony_ci return 0; 13488c2ecf20Sopenharmony_ci } 13498c2ecf20Sopenharmony_ci} 13508c2ecf20Sopenharmony_ci 13518c2ecf20Sopenharmony_ci/* Digital Mixer */ 13528c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc_l_mix[] = { 13538c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER, 13548c2ecf20Sopenharmony_ci RT5682_M_STO1_ADC_L1_SFT, 1, 1), 13558c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER, 13568c2ecf20Sopenharmony_ci RT5682_M_STO1_ADC_L2_SFT, 1, 1), 13578c2ecf20Sopenharmony_ci}; 13588c2ecf20Sopenharmony_ci 13598c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc_r_mix[] = { 13608c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5682_STO1_ADC_MIXER, 13618c2ecf20Sopenharmony_ci RT5682_M_STO1_ADC_R1_SFT, 1, 1), 13628c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5682_STO1_ADC_MIXER, 13638c2ecf20Sopenharmony_ci RT5682_M_STO1_ADC_R2_SFT, 1, 1), 13648c2ecf20Sopenharmony_ci}; 13658c2ecf20Sopenharmony_ci 13668c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_l_mix[] = { 13678c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER, 13688c2ecf20Sopenharmony_ci RT5682_M_ADCMIX_L_SFT, 1, 1), 13698c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER, 13708c2ecf20Sopenharmony_ci RT5682_M_DAC1_L_SFT, 1, 1), 13718c2ecf20Sopenharmony_ci}; 13728c2ecf20Sopenharmony_ci 13738c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_dac_r_mix[] = { 13748c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682_AD_DA_MIXER, 13758c2ecf20Sopenharmony_ci RT5682_M_ADCMIX_R_SFT, 1, 1), 13768c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("DAC1 Switch", RT5682_AD_DA_MIXER, 13778c2ecf20Sopenharmony_ci RT5682_M_DAC1_R_SFT, 1, 1), 13788c2ecf20Sopenharmony_ci}; 13798c2ecf20Sopenharmony_ci 13808c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_dac_l_mix[] = { 13818c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER, 13828c2ecf20Sopenharmony_ci RT5682_M_DAC_L1_STO_L_SFT, 1, 1), 13838c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER, 13848c2ecf20Sopenharmony_ci RT5682_M_DAC_R1_STO_L_SFT, 1, 1), 13858c2ecf20Sopenharmony_ci}; 13868c2ecf20Sopenharmony_ci 13878c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_dac_r_mix[] = { 13888c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5682_STO1_DAC_MIXER, 13898c2ecf20Sopenharmony_ci RT5682_M_DAC_L1_STO_R_SFT, 1, 1), 13908c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5682_STO1_DAC_MIXER, 13918c2ecf20Sopenharmony_ci RT5682_M_DAC_R1_STO_R_SFT, 1, 1), 13928c2ecf20Sopenharmony_ci}; 13938c2ecf20Sopenharmony_ci 13948c2ecf20Sopenharmony_ci/* Analog Input Mixer */ 13958c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_rec1_l_mix[] = { 13968c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE("CBJ Switch", RT5682_REC_MIXER, 13978c2ecf20Sopenharmony_ci RT5682_M_CBJ_RM1_L_SFT, 1, 1), 13988c2ecf20Sopenharmony_ci}; 13998c2ecf20Sopenharmony_ci 14008c2ecf20Sopenharmony_ci/* STO1 ADC1 Source */ 14018c2ecf20Sopenharmony_ci/* MX-26 [13] [5] */ 14028c2ecf20Sopenharmony_cistatic const char * const rt5682_sto1_adc1_src[] = { 14038c2ecf20Sopenharmony_ci "DAC MIX", "ADC" 14048c2ecf20Sopenharmony_ci}; 14058c2ecf20Sopenharmony_ci 14068c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14078c2ecf20Sopenharmony_ci rt5682_sto1_adc1l_enum, RT5682_STO1_ADC_MIXER, 14088c2ecf20Sopenharmony_ci RT5682_STO1_ADC1L_SRC_SFT, rt5682_sto1_adc1_src); 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc1l_mux = 14118c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1l_enum); 14128c2ecf20Sopenharmony_ci 14138c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14148c2ecf20Sopenharmony_ci rt5682_sto1_adc1r_enum, RT5682_STO1_ADC_MIXER, 14158c2ecf20Sopenharmony_ci RT5682_STO1_ADC1R_SRC_SFT, rt5682_sto1_adc1_src); 14168c2ecf20Sopenharmony_ci 14178c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc1r_mux = 14188c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682_sto1_adc1r_enum); 14198c2ecf20Sopenharmony_ci 14208c2ecf20Sopenharmony_ci/* STO1 ADC Source */ 14218c2ecf20Sopenharmony_ci/* MX-26 [11:10] [3:2] */ 14228c2ecf20Sopenharmony_cistatic const char * const rt5682_sto1_adc_src[] = { 14238c2ecf20Sopenharmony_ci "ADC1 L", "ADC1 R" 14248c2ecf20Sopenharmony_ci}; 14258c2ecf20Sopenharmony_ci 14268c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14278c2ecf20Sopenharmony_ci rt5682_sto1_adcl_enum, RT5682_STO1_ADC_MIXER, 14288c2ecf20Sopenharmony_ci RT5682_STO1_ADCL_SRC_SFT, rt5682_sto1_adc_src); 14298c2ecf20Sopenharmony_ci 14308c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adcl_mux = 14318c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682_sto1_adcl_enum); 14328c2ecf20Sopenharmony_ci 14338c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14348c2ecf20Sopenharmony_ci rt5682_sto1_adcr_enum, RT5682_STO1_ADC_MIXER, 14358c2ecf20Sopenharmony_ci RT5682_STO1_ADCR_SRC_SFT, rt5682_sto1_adc_src); 14368c2ecf20Sopenharmony_ci 14378c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adcr_mux = 14388c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682_sto1_adcr_enum); 14398c2ecf20Sopenharmony_ci 14408c2ecf20Sopenharmony_ci/* STO1 ADC2 Source */ 14418c2ecf20Sopenharmony_ci/* MX-26 [12] [4] */ 14428c2ecf20Sopenharmony_cistatic const char * const rt5682_sto1_adc2_src[] = { 14438c2ecf20Sopenharmony_ci "DAC MIX", "DMIC" 14448c2ecf20Sopenharmony_ci}; 14458c2ecf20Sopenharmony_ci 14468c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14478c2ecf20Sopenharmony_ci rt5682_sto1_adc2l_enum, RT5682_STO1_ADC_MIXER, 14488c2ecf20Sopenharmony_ci RT5682_STO1_ADC2L_SRC_SFT, rt5682_sto1_adc2_src); 14498c2ecf20Sopenharmony_ci 14508c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc2l_mux = 14518c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5682_sto1_adc2l_enum); 14528c2ecf20Sopenharmony_ci 14538c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14548c2ecf20Sopenharmony_ci rt5682_sto1_adc2r_enum, RT5682_STO1_ADC_MIXER, 14558c2ecf20Sopenharmony_ci RT5682_STO1_ADC2R_SRC_SFT, rt5682_sto1_adc2_src); 14568c2ecf20Sopenharmony_ci 14578c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_sto1_adc2r_mux = 14588c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5682_sto1_adc2r_enum); 14598c2ecf20Sopenharmony_ci 14608c2ecf20Sopenharmony_ci/* MX-79 [6:4] I2S1 ADC data location */ 14618c2ecf20Sopenharmony_cistatic const unsigned int rt5682_if1_adc_slot_values[] = { 14628c2ecf20Sopenharmony_ci 0, 14638c2ecf20Sopenharmony_ci 2, 14648c2ecf20Sopenharmony_ci 4, 14658c2ecf20Sopenharmony_ci 6, 14668c2ecf20Sopenharmony_ci}; 14678c2ecf20Sopenharmony_ci 14688c2ecf20Sopenharmony_cistatic const char * const rt5682_if1_adc_slot_src[] = { 14698c2ecf20Sopenharmony_ci "Slot 0", "Slot 2", "Slot 4", "Slot 6" 14708c2ecf20Sopenharmony_ci}; 14718c2ecf20Sopenharmony_ci 14728c2ecf20Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_if1_adc_slot_enum, 14738c2ecf20Sopenharmony_ci RT5682_TDM_CTRL, RT5682_TDM_ADC_LCA_SFT, RT5682_TDM_ADC_LCA_MASK, 14748c2ecf20Sopenharmony_ci rt5682_if1_adc_slot_src, rt5682_if1_adc_slot_values); 14758c2ecf20Sopenharmony_ci 14768c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_if1_adc_slot_mux = 14778c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("IF1 ADC Slot location", rt5682_if1_adc_slot_enum); 14788c2ecf20Sopenharmony_ci 14798c2ecf20Sopenharmony_ci/* Analog DAC L1 Source, Analog DAC R1 Source*/ 14808c2ecf20Sopenharmony_ci/* MX-2B [4], MX-2B [0]*/ 14818c2ecf20Sopenharmony_cistatic const char * const rt5682_alg_dac1_src[] = { 14828c2ecf20Sopenharmony_ci "Stereo1 DAC Mixer", "DAC1" 14838c2ecf20Sopenharmony_ci}; 14848c2ecf20Sopenharmony_ci 14858c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14868c2ecf20Sopenharmony_ci rt5682_alg_dac_l1_enum, RT5682_A_DAC1_MUX, 14878c2ecf20Sopenharmony_ci RT5682_A_DACL1_SFT, rt5682_alg_dac1_src); 14888c2ecf20Sopenharmony_ci 14898c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_alg_dac_l1_mux = 14908c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Analog DAC L1 Source", rt5682_alg_dac_l1_enum); 14918c2ecf20Sopenharmony_ci 14928c2ecf20Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL( 14938c2ecf20Sopenharmony_ci rt5682_alg_dac_r1_enum, RT5682_A_DAC1_MUX, 14948c2ecf20Sopenharmony_ci RT5682_A_DACR1_SFT, rt5682_alg_dac1_src); 14958c2ecf20Sopenharmony_ci 14968c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_alg_dac_r1_mux = 14978c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("Analog DAC R1 Source", rt5682_alg_dac_r1_enum); 14988c2ecf20Sopenharmony_ci 14998c2ecf20Sopenharmony_ci/* Out Switch */ 15008c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new hpol_switch = 15018c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1, 15028c2ecf20Sopenharmony_ci RT5682_L_MUTE_SFT, 1, 1); 15038c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new hpor_switch = 15048c2ecf20Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5682_HP_CTRL_1, 15058c2ecf20Sopenharmony_ci RT5682_R_MUTE_SFT, 1, 1); 15068c2ecf20Sopenharmony_ci 15078c2ecf20Sopenharmony_cistatic int rt5682_hp_event(struct snd_soc_dapm_widget *w, 15088c2ecf20Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 15098c2ecf20Sopenharmony_ci{ 15108c2ecf20Sopenharmony_ci struct snd_soc_component *component = 15118c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 15128c2ecf20Sopenharmony_ci 15138c2ecf20Sopenharmony_ci switch (event) { 15148c2ecf20Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 15158c2ecf20Sopenharmony_ci snd_soc_component_write(component, 15168c2ecf20Sopenharmony_ci RT5682_HP_LOGIC_CTRL_2, 0x0012); 15178c2ecf20Sopenharmony_ci snd_soc_component_write(component, 15188c2ecf20Sopenharmony_ci RT5682_HP_CTRL_2, 0x6000); 15198c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15208c2ecf20Sopenharmony_ci RT5682_DEPOP_1, 0x60, 0x60); 15218c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15228c2ecf20Sopenharmony_ci RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080); 15238c2ecf20Sopenharmony_ci break; 15248c2ecf20Sopenharmony_ci 15258c2ecf20Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 15268c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15278c2ecf20Sopenharmony_ci RT5682_DEPOP_1, 0x60, 0x0); 15288c2ecf20Sopenharmony_ci snd_soc_component_write(component, 15298c2ecf20Sopenharmony_ci RT5682_HP_CTRL_2, 0x0000); 15308c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15318c2ecf20Sopenharmony_ci RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0000); 15328c2ecf20Sopenharmony_ci break; 15338c2ecf20Sopenharmony_ci } 15348c2ecf20Sopenharmony_ci 15358c2ecf20Sopenharmony_ci return 0; 15368c2ecf20Sopenharmony_ci} 15378c2ecf20Sopenharmony_ci 15388c2ecf20Sopenharmony_cistatic int set_dmic_power(struct snd_soc_dapm_widget *w, 15398c2ecf20Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 15408c2ecf20Sopenharmony_ci{ 15418c2ecf20Sopenharmony_ci struct snd_soc_component *component = 15428c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 15438c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 15448c2ecf20Sopenharmony_ci unsigned int delay = 50, val; 15458c2ecf20Sopenharmony_ci 15468c2ecf20Sopenharmony_ci if (rt5682->pdata.dmic_delay) 15478c2ecf20Sopenharmony_ci delay = rt5682->pdata.dmic_delay; 15488c2ecf20Sopenharmony_ci 15498c2ecf20Sopenharmony_ci switch (event) { 15508c2ecf20Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 15518c2ecf20Sopenharmony_ci val = snd_soc_component_read(component, RT5682_GLB_CLK); 15528c2ecf20Sopenharmony_ci val &= RT5682_SCLK_SRC_MASK; 15538c2ecf20Sopenharmony_ci if (val == RT5682_SCLK_SRC_PLL1 || val == RT5682_SCLK_SRC_PLL2) 15548c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15558c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, 15568c2ecf20Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB, 15578c2ecf20Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_MB); 15588c2ecf20Sopenharmony_ci 15598c2ecf20Sopenharmony_ci /*Add delay to avoid pop noise*/ 15608c2ecf20Sopenharmony_ci msleep(delay); 15618c2ecf20Sopenharmony_ci break; 15628c2ecf20Sopenharmony_ci 15638c2ecf20Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 15648c2ecf20Sopenharmony_ci if (!rt5682->jack_type) { 15658c2ecf20Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(w->dapm, "MICBIAS")) 15668c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15678c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_MB, 0); 15688c2ecf20Sopenharmony_ci if (!snd_soc_dapm_get_pin_status(w->dapm, "Vref2")) 15698c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15708c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_VREF2, 0); 15718c2ecf20Sopenharmony_ci } 15728c2ecf20Sopenharmony_ci break; 15738c2ecf20Sopenharmony_ci } 15748c2ecf20Sopenharmony_ci 15758c2ecf20Sopenharmony_ci return 0; 15768c2ecf20Sopenharmony_ci} 15778c2ecf20Sopenharmony_ci 15788c2ecf20Sopenharmony_cistatic int rt5682_set_verf(struct snd_soc_dapm_widget *w, 15798c2ecf20Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 15808c2ecf20Sopenharmony_ci{ 15818c2ecf20Sopenharmony_ci struct snd_soc_component *component = 15828c2ecf20Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 15838c2ecf20Sopenharmony_ci 15848c2ecf20Sopenharmony_ci switch (event) { 15858c2ecf20Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 15868c2ecf20Sopenharmony_ci switch (w->shift) { 15878c2ecf20Sopenharmony_ci case RT5682_PWR_VREF1_BIT: 15888c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15898c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV1, 0); 15908c2ecf20Sopenharmony_ci break; 15918c2ecf20Sopenharmony_ci 15928c2ecf20Sopenharmony_ci case RT5682_PWR_VREF2_BIT: 15938c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 15948c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 0); 15958c2ecf20Sopenharmony_ci break; 15968c2ecf20Sopenharmony_ci } 15978c2ecf20Sopenharmony_ci break; 15988c2ecf20Sopenharmony_ci 15998c2ecf20Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 16008c2ecf20Sopenharmony_ci usleep_range(15000, 20000); 16018c2ecf20Sopenharmony_ci switch (w->shift) { 16028c2ecf20Sopenharmony_ci case RT5682_PWR_VREF1_BIT: 16038c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 16048c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV1, 16058c2ecf20Sopenharmony_ci RT5682_PWR_FV1); 16068c2ecf20Sopenharmony_ci break; 16078c2ecf20Sopenharmony_ci 16088c2ecf20Sopenharmony_ci case RT5682_PWR_VREF2_BIT: 16098c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 16108c2ecf20Sopenharmony_ci RT5682_PWR_ANLG_1, RT5682_PWR_FV2, 16118c2ecf20Sopenharmony_ci RT5682_PWR_FV2); 16128c2ecf20Sopenharmony_ci break; 16138c2ecf20Sopenharmony_ci } 16148c2ecf20Sopenharmony_ci break; 16158c2ecf20Sopenharmony_ci } 16168c2ecf20Sopenharmony_ci 16178c2ecf20Sopenharmony_ci return 0; 16188c2ecf20Sopenharmony_ci} 16198c2ecf20Sopenharmony_ci 16208c2ecf20Sopenharmony_cistatic const unsigned int rt5682_adcdat_pin_values[] = { 16218c2ecf20Sopenharmony_ci 1, 16228c2ecf20Sopenharmony_ci 3, 16238c2ecf20Sopenharmony_ci}; 16248c2ecf20Sopenharmony_ci 16258c2ecf20Sopenharmony_cistatic const char * const rt5682_adcdat_pin_select[] = { 16268c2ecf20Sopenharmony_ci "ADCDAT1", 16278c2ecf20Sopenharmony_ci "ADCDAT2", 16288c2ecf20Sopenharmony_ci}; 16298c2ecf20Sopenharmony_ci 16308c2ecf20Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(rt5682_adcdat_pin_enum, 16318c2ecf20Sopenharmony_ci RT5682_GPIO_CTRL_1, RT5682_GP4_PIN_SFT, RT5682_GP4_PIN_MASK, 16328c2ecf20Sopenharmony_ci rt5682_adcdat_pin_select, rt5682_adcdat_pin_values); 16338c2ecf20Sopenharmony_ci 16348c2ecf20Sopenharmony_cistatic const struct snd_kcontrol_new rt5682_adcdat_pin_ctrl = 16358c2ecf20Sopenharmony_ci SOC_DAPM_ENUM("ADCDAT", rt5682_adcdat_pin_enum); 16368c2ecf20Sopenharmony_ci 16378c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5682_dapm_widgets[] = { 16388c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("LDO2", RT5682_PWR_ANLG_3, RT5682_PWR_LDO2_BIT, 16398c2ecf20Sopenharmony_ci 0, NULL, 0), 16408c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL1", RT5682_PWR_ANLG_3, RT5682_PWR_PLL_BIT, 16418c2ecf20Sopenharmony_ci 0, NULL, 0), 16428c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL2B", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2B_BIT, 16438c2ecf20Sopenharmony_ci 0, NULL, 0), 16448c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL2F", RT5682_PWR_ANLG_3, RT5682_PWR_PLL2F_BIT, 16458c2ecf20Sopenharmony_ci 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU), 16468c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("Vref1", RT5682_PWR_ANLG_1, RT5682_PWR_VREF1_BIT, 0, 16478c2ecf20Sopenharmony_ci rt5682_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU), 16488c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("Vref2", SND_SOC_NOPM, 0, 0, NULL, 0), 16498c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MICBIAS", SND_SOC_NOPM, 0, 0, NULL, 0), 16508c2ecf20Sopenharmony_ci 16518c2ecf20Sopenharmony_ci /* ASRC */ 16528c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682_PLL_TRACK_1, 16538c2ecf20Sopenharmony_ci RT5682_DAC_STO1_ASRC_SFT, 0, NULL, 0), 16548c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5682_PLL_TRACK_1, 16558c2ecf20Sopenharmony_ci RT5682_ADC_STO1_ASRC_SFT, 0, NULL, 0), 16568c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682_PLL_TRACK_1, 16578c2ecf20Sopenharmony_ci RT5682_AD_ASRC_SFT, 0, NULL, 0), 16588c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682_PLL_TRACK_1, 16598c2ecf20Sopenharmony_ci RT5682_DA_ASRC_SFT, 0, NULL, 0), 16608c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682_PLL_TRACK_1, 16618c2ecf20Sopenharmony_ci RT5682_DMIC_ASRC_SFT, 0, NULL, 0), 16628c2ecf20Sopenharmony_ci 16638c2ecf20Sopenharmony_ci /* Input Side */ 16648c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682_PWR_ANLG_2, RT5682_PWR_MB1_BIT, 16658c2ecf20Sopenharmony_ci 0, NULL, 0), 16668c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682_PWR_ANLG_2, RT5682_PWR_MB2_BIT, 16678c2ecf20Sopenharmony_ci 0, NULL, 0), 16688c2ecf20Sopenharmony_ci 16698c2ecf20Sopenharmony_ci /* Input Lines */ 16708c2ecf20Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC L1"), 16718c2ecf20Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC R1"), 16728c2ecf20Sopenharmony_ci 16738c2ecf20Sopenharmony_ci SND_SOC_DAPM_INPUT("IN1P"), 16748c2ecf20Sopenharmony_ci 16758c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0, 16768c2ecf20Sopenharmony_ci set_dmic_clk, SND_SOC_DAPM_PRE_PMU), 16778c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682_DMIC_CTRL_1, 16788c2ecf20Sopenharmony_ci RT5682_DMIC_1_EN_SFT, 0, set_dmic_power, 16798c2ecf20Sopenharmony_ci SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), 16808c2ecf20Sopenharmony_ci 16818c2ecf20Sopenharmony_ci /* Boost */ 16828c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 16838c2ecf20Sopenharmony_ci 0, 0, NULL, 0), 16848c2ecf20Sopenharmony_ci 16858c2ecf20Sopenharmony_ci /* REC Mixer */ 16868c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682_rec1_l_mix, 16878c2ecf20Sopenharmony_ci ARRAY_SIZE(rt5682_rec1_l_mix)), 16888c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682_PWR_ANLG_2, 16898c2ecf20Sopenharmony_ci RT5682_PWR_RM1_L_BIT, 0, NULL, 0), 16908c2ecf20Sopenharmony_ci 16918c2ecf20Sopenharmony_ci /* ADCs */ 16928c2ecf20Sopenharmony_ci SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0), 16938c2ecf20Sopenharmony_ci SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0), 16948c2ecf20Sopenharmony_ci 16958c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682_PWR_DIG_1, 16968c2ecf20Sopenharmony_ci RT5682_PWR_ADC_L1_BIT, 0, NULL, 0), 16978c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682_PWR_DIG_1, 16988c2ecf20Sopenharmony_ci RT5682_PWR_ADC_R1_BIT, 0, NULL, 0), 16998c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682_CHOP_ADC, 17008c2ecf20Sopenharmony_ci RT5682_CKGEN_ADC1_SFT, 0, NULL, 0), 17018c2ecf20Sopenharmony_ci 17028c2ecf20Sopenharmony_ci /* ADC Mux */ 17038c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0, 17048c2ecf20Sopenharmony_ci &rt5682_sto1_adc1l_mux), 17058c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0, 17068c2ecf20Sopenharmony_ci &rt5682_sto1_adc1r_mux), 17078c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0, 17088c2ecf20Sopenharmony_ci &rt5682_sto1_adc2l_mux), 17098c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0, 17108c2ecf20Sopenharmony_ci &rt5682_sto1_adc2r_mux), 17118c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0, 17128c2ecf20Sopenharmony_ci &rt5682_sto1_adcl_mux), 17138c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0, 17148c2ecf20Sopenharmony_ci &rt5682_sto1_adcr_mux), 17158c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0, 17168c2ecf20Sopenharmony_ci &rt5682_if1_adc_slot_mux), 17178c2ecf20Sopenharmony_ci 17188c2ecf20Sopenharmony_ci /* ADC Mixer */ 17198c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682_PWR_DIG_2, 17208c2ecf20Sopenharmony_ci RT5682_PWR_ADC_S1F_BIT, 0, set_filter_clk, 17218c2ecf20Sopenharmony_ci SND_SOC_DAPM_PRE_PMU), 17228c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5682_STO1_ADC_DIG_VOL, 17238c2ecf20Sopenharmony_ci RT5682_L_MUTE_SFT, 1, rt5682_sto1_adc_l_mix, 17248c2ecf20Sopenharmony_ci ARRAY_SIZE(rt5682_sto1_adc_l_mix)), 17258c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682_STO1_ADC_DIG_VOL, 17268c2ecf20Sopenharmony_ci RT5682_R_MUTE_SFT, 1, rt5682_sto1_adc_r_mix, 17278c2ecf20Sopenharmony_ci ARRAY_SIZE(rt5682_sto1_adc_r_mix)), 17288c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("BTN Detection Mode", RT5682_SAR_IL_CMD_1, 17298c2ecf20Sopenharmony_ci 14, 1, NULL, 0), 17308c2ecf20Sopenharmony_ci 17318c2ecf20Sopenharmony_ci /* ADC PGA */ 17328c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 17338c2ecf20Sopenharmony_ci 17348c2ecf20Sopenharmony_ci /* Digital Interface */ 17358c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S1", RT5682_PWR_DIG_1, RT5682_PWR_I2S1_BIT, 17368c2ecf20Sopenharmony_ci 0, NULL, 0), 17378c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S2", RT5682_PWR_DIG_1, RT5682_PWR_I2S2_BIT, 17388c2ecf20Sopenharmony_ci 0, NULL, 0), 17398c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0), 17408c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0), 17418c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0), 17428c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA("SOUND DAC L", SND_SOC_NOPM, 0, 0, NULL, 0), 17438c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA("SOUND DAC R", SND_SOC_NOPM, 0, 0, NULL, 0), 17448c2ecf20Sopenharmony_ci 17458c2ecf20Sopenharmony_ci /* Digital Interface Select */ 17468c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 17478c2ecf20Sopenharmony_ci &rt5682_if1_01_adc_swap_mux), 17488c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 17498c2ecf20Sopenharmony_ci &rt5682_if1_23_adc_swap_mux), 17508c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 17518c2ecf20Sopenharmony_ci &rt5682_if1_45_adc_swap_mux), 17528c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 17538c2ecf20Sopenharmony_ci &rt5682_if1_67_adc_swap_mux), 17548c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0, 17558c2ecf20Sopenharmony_ci &rt5682_if2_adc_swap_mux), 17568c2ecf20Sopenharmony_ci 17578c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0, 17588c2ecf20Sopenharmony_ci &rt5682_adcdat_pin_ctrl), 17598c2ecf20Sopenharmony_ci 17608c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("DAC L Mux", SND_SOC_NOPM, 0, 0, 17618c2ecf20Sopenharmony_ci &rt5682_dac_l_mux), 17628c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("DAC R Mux", SND_SOC_NOPM, 0, 0, 17638c2ecf20Sopenharmony_ci &rt5682_dac_r_mux), 17648c2ecf20Sopenharmony_ci 17658c2ecf20Sopenharmony_ci /* Audio Interface */ 17668c2ecf20Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, 17678c2ecf20Sopenharmony_ci RT5682_I2S1_SDP, RT5682_SEL_ADCDAT_SFT, 1), 17688c2ecf20Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, 17698c2ecf20Sopenharmony_ci RT5682_I2S2_SDP, RT5682_I2S2_PIN_CFG_SFT, 1), 17708c2ecf20Sopenharmony_ci SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), 17718c2ecf20Sopenharmony_ci SND_SOC_DAPM_AIF_IN("SDWRX", "SDW Playback", 0, SND_SOC_NOPM, 0, 0), 17728c2ecf20Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("SDWTX", "SDW Capture", 0, SND_SOC_NOPM, 0, 0), 17738c2ecf20Sopenharmony_ci 17748c2ecf20Sopenharmony_ci /* Output Side */ 17758c2ecf20Sopenharmony_ci /* DAC mixer before sound effect */ 17768c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0, 17778c2ecf20Sopenharmony_ci rt5682_dac_l_mix, ARRAY_SIZE(rt5682_dac_l_mix)), 17788c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0, 17798c2ecf20Sopenharmony_ci rt5682_dac_r_mix, ARRAY_SIZE(rt5682_dac_r_mix)), 17808c2ecf20Sopenharmony_ci 17818c2ecf20Sopenharmony_ci /* DAC channel Mux */ 17828c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0, 17838c2ecf20Sopenharmony_ci &rt5682_alg_dac_l1_mux), 17848c2ecf20Sopenharmony_ci SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0, 17858c2ecf20Sopenharmony_ci &rt5682_alg_dac_r1_mux), 17868c2ecf20Sopenharmony_ci 17878c2ecf20Sopenharmony_ci /* DAC Mixer */ 17888c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682_PWR_DIG_2, 17898c2ecf20Sopenharmony_ci RT5682_PWR_DAC_S1F_BIT, 0, set_filter_clk, 17908c2ecf20Sopenharmony_ci SND_SOC_DAPM_PRE_PMU), 17918c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0, 17928c2ecf20Sopenharmony_ci rt5682_sto1_dac_l_mix, ARRAY_SIZE(rt5682_sto1_dac_l_mix)), 17938c2ecf20Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0, 17948c2ecf20Sopenharmony_ci rt5682_sto1_dac_r_mix, ARRAY_SIZE(rt5682_sto1_dac_r_mix)), 17958c2ecf20Sopenharmony_ci 17968c2ecf20Sopenharmony_ci /* DACs */ 17978c2ecf20Sopenharmony_ci SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682_PWR_DIG_1, 17988c2ecf20Sopenharmony_ci RT5682_PWR_DAC_L1_BIT, 0), 17998c2ecf20Sopenharmony_ci SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682_PWR_DIG_1, 18008c2ecf20Sopenharmony_ci RT5682_PWR_DAC_R1_BIT, 0), 18018c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DAC 1 Clock", 3, RT5682_CHOP_DAC, 18028c2ecf20Sopenharmony_ci RT5682_CKGEN_DAC1_SFT, 0, NULL, 0), 18038c2ecf20Sopenharmony_ci 18048c2ecf20Sopenharmony_ci /* HPO */ 18058c2ecf20Sopenharmony_ci SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5682_hp_event, 18068c2ecf20Sopenharmony_ci SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU), 18078c2ecf20Sopenharmony_ci 18088c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("HP Amp L", RT5682_PWR_ANLG_1, 18098c2ecf20Sopenharmony_ci RT5682_PWR_HA_L_BIT, 0, NULL, 0), 18108c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("HP Amp R", RT5682_PWR_ANLG_1, 18118c2ecf20Sopenharmony_ci RT5682_PWR_HA_R_BIT, 0, NULL, 0), 18128c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("Charge Pump", 1, RT5682_DEPOP_1, 18138c2ecf20Sopenharmony_ci RT5682_PUMP_EN_SFT, 0, NULL, 0), 18148c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("Capless", 2, RT5682_DEPOP_1, 18158c2ecf20Sopenharmony_ci RT5682_CAPLESS_EN_SFT, 0, NULL, 0), 18168c2ecf20Sopenharmony_ci 18178c2ecf20Sopenharmony_ci SND_SOC_DAPM_SWITCH("HPOL Playback", SND_SOC_NOPM, 0, 0, 18188c2ecf20Sopenharmony_ci &hpol_switch), 18198c2ecf20Sopenharmony_ci SND_SOC_DAPM_SWITCH("HPOR Playback", SND_SOC_NOPM, 0, 0, 18208c2ecf20Sopenharmony_ci &hpor_switch), 18218c2ecf20Sopenharmony_ci 18228c2ecf20Sopenharmony_ci /* CLK DET */ 18238c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682_CLK_DET, 18248c2ecf20Sopenharmony_ci RT5682_SYS_CLK_DET_SFT, 0, NULL, 0), 18258c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682_CLK_DET, 18268c2ecf20Sopenharmony_ci RT5682_PLL1_CLK_DET_SFT, 0, NULL, 0), 18278c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET PLL2", RT5682_CLK_DET, 18288c2ecf20Sopenharmony_ci RT5682_PLL2_CLK_DET_SFT, 0, NULL, 0), 18298c2ecf20Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLKDET", RT5682_CLK_DET, 18308c2ecf20Sopenharmony_ci RT5682_POW_CLK_DET_SFT, 0, NULL, 0), 18318c2ecf20Sopenharmony_ci 18328c2ecf20Sopenharmony_ci /* Output Lines */ 18338c2ecf20Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOL"), 18348c2ecf20Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOR"), 18358c2ecf20Sopenharmony_ci}; 18368c2ecf20Sopenharmony_ci 18378c2ecf20Sopenharmony_cistatic const struct snd_soc_dapm_route rt5682_dapm_routes[] = { 18388c2ecf20Sopenharmony_ci /*PLL*/ 18398c2ecf20Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1}, 18408c2ecf20Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2}, 18418c2ecf20Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2}, 18428c2ecf20Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll1}, 18438c2ecf20Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "PLL2B", is_sys_clk_from_pll2}, 18448c2ecf20Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "PLL2F", is_sys_clk_from_pll2}, 18458c2ecf20Sopenharmony_ci 18468c2ecf20Sopenharmony_ci /*ASRC*/ 18478c2ecf20Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc}, 18488c2ecf20Sopenharmony_ci {"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc}, 18498c2ecf20Sopenharmony_ci {"ADC STO1 ASRC", NULL, "AD ASRC"}, 18508c2ecf20Sopenharmony_ci {"ADC STO1 ASRC", NULL, "DA ASRC"}, 18518c2ecf20Sopenharmony_ci {"ADC STO1 ASRC", NULL, "CLKDET"}, 18528c2ecf20Sopenharmony_ci {"DAC STO1 ASRC", NULL, "AD ASRC"}, 18538c2ecf20Sopenharmony_ci {"DAC STO1 ASRC", NULL, "DA ASRC"}, 18548c2ecf20Sopenharmony_ci {"DAC STO1 ASRC", NULL, "CLKDET"}, 18558c2ecf20Sopenharmony_ci 18568c2ecf20Sopenharmony_ci /*Vref*/ 18578c2ecf20Sopenharmony_ci {"MICBIAS1", NULL, "Vref1"}, 18588c2ecf20Sopenharmony_ci {"MICBIAS2", NULL, "Vref1"}, 18598c2ecf20Sopenharmony_ci 18608c2ecf20Sopenharmony_ci {"CLKDET SYS", NULL, "CLKDET"}, 18618c2ecf20Sopenharmony_ci 18628c2ecf20Sopenharmony_ci {"IN1P", NULL, "LDO2"}, 18638c2ecf20Sopenharmony_ci 18648c2ecf20Sopenharmony_ci {"BST1 CBJ", NULL, "IN1P"}, 18658c2ecf20Sopenharmony_ci 18668c2ecf20Sopenharmony_ci {"RECMIX1L", "CBJ Switch", "BST1 CBJ"}, 18678c2ecf20Sopenharmony_ci {"RECMIX1L", NULL, "RECMIX1L Power"}, 18688c2ecf20Sopenharmony_ci 18698c2ecf20Sopenharmony_ci {"ADC1 L", NULL, "RECMIX1L"}, 18708c2ecf20Sopenharmony_ci {"ADC1 L", NULL, "ADC1 L Power"}, 18718c2ecf20Sopenharmony_ci {"ADC1 L", NULL, "ADC1 clock"}, 18728c2ecf20Sopenharmony_ci 18738c2ecf20Sopenharmony_ci {"DMIC L1", NULL, "DMIC CLK"}, 18748c2ecf20Sopenharmony_ci {"DMIC L1", NULL, "DMIC1 Power"}, 18758c2ecf20Sopenharmony_ci {"DMIC R1", NULL, "DMIC CLK"}, 18768c2ecf20Sopenharmony_ci {"DMIC R1", NULL, "DMIC1 Power"}, 18778c2ecf20Sopenharmony_ci {"DMIC CLK", NULL, "DMIC ASRC"}, 18788c2ecf20Sopenharmony_ci 18798c2ecf20Sopenharmony_ci {"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"}, 18808c2ecf20Sopenharmony_ci {"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"}, 18818c2ecf20Sopenharmony_ci {"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"}, 18828c2ecf20Sopenharmony_ci {"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"}, 18838c2ecf20Sopenharmony_ci 18848c2ecf20Sopenharmony_ci {"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"}, 18858c2ecf20Sopenharmony_ci {"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"}, 18868c2ecf20Sopenharmony_ci {"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"}, 18878c2ecf20Sopenharmony_ci {"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"}, 18888c2ecf20Sopenharmony_ci 18898c2ecf20Sopenharmony_ci {"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"}, 18908c2ecf20Sopenharmony_ci {"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"}, 18918c2ecf20Sopenharmony_ci {"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"}, 18928c2ecf20Sopenharmony_ci {"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"}, 18938c2ecf20Sopenharmony_ci 18948c2ecf20Sopenharmony_ci {"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"}, 18958c2ecf20Sopenharmony_ci {"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"}, 18968c2ecf20Sopenharmony_ci {"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"}, 18978c2ecf20Sopenharmony_ci 18988c2ecf20Sopenharmony_ci {"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"}, 18998c2ecf20Sopenharmony_ci {"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"}, 19008c2ecf20Sopenharmony_ci {"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"}, 19018c2ecf20Sopenharmony_ci 19028c2ecf20Sopenharmony_ci {"ADC Stereo1 Filter", NULL, "BTN Detection Mode"}, 19038c2ecf20Sopenharmony_ci 19048c2ecf20Sopenharmony_ci {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"}, 19058c2ecf20Sopenharmony_ci {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"}, 19068c2ecf20Sopenharmony_ci 19078c2ecf20Sopenharmony_ci {"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 19088c2ecf20Sopenharmony_ci {"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 19098c2ecf20Sopenharmony_ci {"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 19108c2ecf20Sopenharmony_ci {"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 19118c2ecf20Sopenharmony_ci {"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 19128c2ecf20Sopenharmony_ci {"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 19138c2ecf20Sopenharmony_ci {"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 19148c2ecf20Sopenharmony_ci {"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 19158c2ecf20Sopenharmony_ci {"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 19168c2ecf20Sopenharmony_ci {"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 19178c2ecf20Sopenharmony_ci {"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 19188c2ecf20Sopenharmony_ci {"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 19198c2ecf20Sopenharmony_ci {"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 19208c2ecf20Sopenharmony_ci {"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 19218c2ecf20Sopenharmony_ci {"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 19228c2ecf20Sopenharmony_ci {"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 19238c2ecf20Sopenharmony_ci 19248c2ecf20Sopenharmony_ci {"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"}, 19258c2ecf20Sopenharmony_ci {"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"}, 19268c2ecf20Sopenharmony_ci {"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"}, 19278c2ecf20Sopenharmony_ci {"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"}, 19288c2ecf20Sopenharmony_ci {"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"}, 19298c2ecf20Sopenharmony_ci {"AIF1TX", NULL, "I2S1"}, 19308c2ecf20Sopenharmony_ci {"AIF1TX", NULL, "ADCDAT Mux"}, 19318c2ecf20Sopenharmony_ci {"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"}, 19328c2ecf20Sopenharmony_ci {"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"}, 19338c2ecf20Sopenharmony_ci {"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"}, 19348c2ecf20Sopenharmony_ci {"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"}, 19358c2ecf20Sopenharmony_ci {"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"}, 19368c2ecf20Sopenharmony_ci {"AIF2TX", NULL, "ADCDAT Mux"}, 19378c2ecf20Sopenharmony_ci 19388c2ecf20Sopenharmony_ci {"SDWTX", NULL, "PLL2B"}, 19398c2ecf20Sopenharmony_ci {"SDWTX", NULL, "PLL2F"}, 19408c2ecf20Sopenharmony_ci {"SDWTX", NULL, "ADCDAT Mux"}, 19418c2ecf20Sopenharmony_ci 19428c2ecf20Sopenharmony_ci {"IF1 DAC1 L", NULL, "AIF1RX"}, 19438c2ecf20Sopenharmony_ci {"IF1 DAC1 L", NULL, "I2S1"}, 19448c2ecf20Sopenharmony_ci {"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"}, 19458c2ecf20Sopenharmony_ci {"IF1 DAC1 R", NULL, "AIF1RX"}, 19468c2ecf20Sopenharmony_ci {"IF1 DAC1 R", NULL, "I2S1"}, 19478c2ecf20Sopenharmony_ci {"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"}, 19488c2ecf20Sopenharmony_ci 19498c2ecf20Sopenharmony_ci {"SOUND DAC L", NULL, "SDWRX"}, 19508c2ecf20Sopenharmony_ci {"SOUND DAC L", NULL, "DAC Stereo1 Filter"}, 19518c2ecf20Sopenharmony_ci {"SOUND DAC L", NULL, "PLL2B"}, 19528c2ecf20Sopenharmony_ci {"SOUND DAC L", NULL, "PLL2F"}, 19538c2ecf20Sopenharmony_ci {"SOUND DAC R", NULL, "SDWRX"}, 19548c2ecf20Sopenharmony_ci {"SOUND DAC R", NULL, "DAC Stereo1 Filter"}, 19558c2ecf20Sopenharmony_ci {"SOUND DAC R", NULL, "PLL2B"}, 19568c2ecf20Sopenharmony_ci {"SOUND DAC R", NULL, "PLL2F"}, 19578c2ecf20Sopenharmony_ci 19588c2ecf20Sopenharmony_ci {"DAC L Mux", "IF1", "IF1 DAC1 L"}, 19598c2ecf20Sopenharmony_ci {"DAC L Mux", "SOUND", "SOUND DAC L"}, 19608c2ecf20Sopenharmony_ci {"DAC R Mux", "IF1", "IF1 DAC1 R"}, 19618c2ecf20Sopenharmony_ci {"DAC R Mux", "SOUND", "SOUND DAC R"}, 19628c2ecf20Sopenharmony_ci 19638c2ecf20Sopenharmony_ci {"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"}, 19648c2ecf20Sopenharmony_ci {"DAC1 MIXL", "DAC1 Switch", "DAC L Mux"}, 19658c2ecf20Sopenharmony_ci {"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"}, 19668c2ecf20Sopenharmony_ci {"DAC1 MIXR", "DAC1 Switch", "DAC R Mux"}, 19678c2ecf20Sopenharmony_ci 19688c2ecf20Sopenharmony_ci {"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"}, 19698c2ecf20Sopenharmony_ci {"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"}, 19708c2ecf20Sopenharmony_ci 19718c2ecf20Sopenharmony_ci {"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"}, 19728c2ecf20Sopenharmony_ci {"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"}, 19738c2ecf20Sopenharmony_ci 19748c2ecf20Sopenharmony_ci {"DAC L1 Source", "DAC1", "DAC1 MIXL"}, 19758c2ecf20Sopenharmony_ci {"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"}, 19768c2ecf20Sopenharmony_ci {"DAC R1 Source", "DAC1", "DAC1 MIXR"}, 19778c2ecf20Sopenharmony_ci {"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"}, 19788c2ecf20Sopenharmony_ci 19798c2ecf20Sopenharmony_ci {"DAC L1", NULL, "DAC L1 Source"}, 19808c2ecf20Sopenharmony_ci {"DAC R1", NULL, "DAC R1 Source"}, 19818c2ecf20Sopenharmony_ci 19828c2ecf20Sopenharmony_ci {"DAC L1", NULL, "DAC 1 Clock"}, 19838c2ecf20Sopenharmony_ci {"DAC R1", NULL, "DAC 1 Clock"}, 19848c2ecf20Sopenharmony_ci 19858c2ecf20Sopenharmony_ci {"HP Amp", NULL, "DAC L1"}, 19868c2ecf20Sopenharmony_ci {"HP Amp", NULL, "DAC R1"}, 19878c2ecf20Sopenharmony_ci {"HP Amp", NULL, "HP Amp L"}, 19888c2ecf20Sopenharmony_ci {"HP Amp", NULL, "HP Amp R"}, 19898c2ecf20Sopenharmony_ci {"HP Amp", NULL, "Capless"}, 19908c2ecf20Sopenharmony_ci {"HP Amp", NULL, "Charge Pump"}, 19918c2ecf20Sopenharmony_ci {"HP Amp", NULL, "CLKDET SYS"}, 19928c2ecf20Sopenharmony_ci {"HP Amp", NULL, "Vref1"}, 19938c2ecf20Sopenharmony_ci {"HPOL Playback", "Switch", "HP Amp"}, 19948c2ecf20Sopenharmony_ci {"HPOR Playback", "Switch", "HP Amp"}, 19958c2ecf20Sopenharmony_ci {"HPOL", NULL, "HPOL Playback"}, 19968c2ecf20Sopenharmony_ci {"HPOR", NULL, "HPOR Playback"}, 19978c2ecf20Sopenharmony_ci}; 19988c2ecf20Sopenharmony_ci 19998c2ecf20Sopenharmony_cistatic int rt5682_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 20008c2ecf20Sopenharmony_ci unsigned int rx_mask, int slots, int slot_width) 20018c2ecf20Sopenharmony_ci{ 20028c2ecf20Sopenharmony_ci struct snd_soc_component *component = dai->component; 20038c2ecf20Sopenharmony_ci unsigned int cl, val = 0; 20048c2ecf20Sopenharmony_ci 20058c2ecf20Sopenharmony_ci if (tx_mask || rx_mask) 20068c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2, 20078c2ecf20Sopenharmony_ci RT5682_TDM_EN, RT5682_TDM_EN); 20088c2ecf20Sopenharmony_ci else 20098c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_ADDA_CTRL_2, 20108c2ecf20Sopenharmony_ci RT5682_TDM_EN, 0); 20118c2ecf20Sopenharmony_ci 20128c2ecf20Sopenharmony_ci switch (slots) { 20138c2ecf20Sopenharmony_ci case 4: 20148c2ecf20Sopenharmony_ci val |= RT5682_TDM_TX_CH_4; 20158c2ecf20Sopenharmony_ci val |= RT5682_TDM_RX_CH_4; 20168c2ecf20Sopenharmony_ci break; 20178c2ecf20Sopenharmony_ci case 6: 20188c2ecf20Sopenharmony_ci val |= RT5682_TDM_TX_CH_6; 20198c2ecf20Sopenharmony_ci val |= RT5682_TDM_RX_CH_6; 20208c2ecf20Sopenharmony_ci break; 20218c2ecf20Sopenharmony_ci case 8: 20228c2ecf20Sopenharmony_ci val |= RT5682_TDM_TX_CH_8; 20238c2ecf20Sopenharmony_ci val |= RT5682_TDM_RX_CH_8; 20248c2ecf20Sopenharmony_ci break; 20258c2ecf20Sopenharmony_ci case 2: 20268c2ecf20Sopenharmony_ci break; 20278c2ecf20Sopenharmony_ci default: 20288c2ecf20Sopenharmony_ci return -EINVAL; 20298c2ecf20Sopenharmony_ci } 20308c2ecf20Sopenharmony_ci 20318c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_CTRL, 20328c2ecf20Sopenharmony_ci RT5682_TDM_TX_CH_MASK | RT5682_TDM_RX_CH_MASK, val); 20338c2ecf20Sopenharmony_ci 20348c2ecf20Sopenharmony_ci switch (slot_width) { 20358c2ecf20Sopenharmony_ci case 8: 20368c2ecf20Sopenharmony_ci if (tx_mask || rx_mask) 20378c2ecf20Sopenharmony_ci return -EINVAL; 20388c2ecf20Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_8 | RT5682_I2S1_RX_CHL_8; 20398c2ecf20Sopenharmony_ci break; 20408c2ecf20Sopenharmony_ci case 16: 20418c2ecf20Sopenharmony_ci val = RT5682_TDM_CL_16; 20428c2ecf20Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_16 | RT5682_I2S1_RX_CHL_16; 20438c2ecf20Sopenharmony_ci break; 20448c2ecf20Sopenharmony_ci case 20: 20458c2ecf20Sopenharmony_ci val = RT5682_TDM_CL_20; 20468c2ecf20Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_20 | RT5682_I2S1_RX_CHL_20; 20478c2ecf20Sopenharmony_ci break; 20488c2ecf20Sopenharmony_ci case 24: 20498c2ecf20Sopenharmony_ci val = RT5682_TDM_CL_24; 20508c2ecf20Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_24 | RT5682_I2S1_RX_CHL_24; 20518c2ecf20Sopenharmony_ci break; 20528c2ecf20Sopenharmony_ci case 32: 20538c2ecf20Sopenharmony_ci val = RT5682_TDM_CL_32; 20548c2ecf20Sopenharmony_ci cl = RT5682_I2S1_TX_CHL_32 | RT5682_I2S1_RX_CHL_32; 20558c2ecf20Sopenharmony_ci break; 20568c2ecf20Sopenharmony_ci default: 20578c2ecf20Sopenharmony_ci return -EINVAL; 20588c2ecf20Sopenharmony_ci } 20598c2ecf20Sopenharmony_ci 20608c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 20618c2ecf20Sopenharmony_ci RT5682_TDM_CL_MASK, val); 20628c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S1_SDP, 20638c2ecf20Sopenharmony_ci RT5682_I2S1_TX_CHL_MASK | RT5682_I2S1_RX_CHL_MASK, cl); 20648c2ecf20Sopenharmony_ci 20658c2ecf20Sopenharmony_ci return 0; 20668c2ecf20Sopenharmony_ci} 20678c2ecf20Sopenharmony_ci 20688c2ecf20Sopenharmony_cistatic int rt5682_hw_params(struct snd_pcm_substream *substream, 20698c2ecf20Sopenharmony_ci struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 20708c2ecf20Sopenharmony_ci{ 20718c2ecf20Sopenharmony_ci struct snd_soc_component *component = dai->component; 20728c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 20738c2ecf20Sopenharmony_ci unsigned int len_1 = 0, len_2 = 0; 20748c2ecf20Sopenharmony_ci int pre_div, frame_size; 20758c2ecf20Sopenharmony_ci 20768c2ecf20Sopenharmony_ci rt5682->lrck[dai->id] = params_rate(params); 20778c2ecf20Sopenharmony_ci pre_div = rl6231_get_clk_info(rt5682->sysclk, rt5682->lrck[dai->id]); 20788c2ecf20Sopenharmony_ci 20798c2ecf20Sopenharmony_ci frame_size = snd_soc_params_to_frame_size(params); 20808c2ecf20Sopenharmony_ci if (frame_size < 0) { 20818c2ecf20Sopenharmony_ci dev_err(component->dev, "Unsupported frame size: %d\n", 20828c2ecf20Sopenharmony_ci frame_size); 20838c2ecf20Sopenharmony_ci return -EINVAL; 20848c2ecf20Sopenharmony_ci } 20858c2ecf20Sopenharmony_ci 20868c2ecf20Sopenharmony_ci dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n", 20878c2ecf20Sopenharmony_ci rt5682->lrck[dai->id], pre_div, dai->id); 20888c2ecf20Sopenharmony_ci 20898c2ecf20Sopenharmony_ci switch (params_width(params)) { 20908c2ecf20Sopenharmony_ci case 16: 20918c2ecf20Sopenharmony_ci break; 20928c2ecf20Sopenharmony_ci case 20: 20938c2ecf20Sopenharmony_ci len_1 |= RT5682_I2S1_DL_20; 20948c2ecf20Sopenharmony_ci len_2 |= RT5682_I2S2_DL_20; 20958c2ecf20Sopenharmony_ci break; 20968c2ecf20Sopenharmony_ci case 24: 20978c2ecf20Sopenharmony_ci len_1 |= RT5682_I2S1_DL_24; 20988c2ecf20Sopenharmony_ci len_2 |= RT5682_I2S2_DL_24; 20998c2ecf20Sopenharmony_ci break; 21008c2ecf20Sopenharmony_ci case 32: 21018c2ecf20Sopenharmony_ci len_1 |= RT5682_I2S1_DL_32; 21028c2ecf20Sopenharmony_ci len_2 |= RT5682_I2S2_DL_24; 21038c2ecf20Sopenharmony_ci break; 21048c2ecf20Sopenharmony_ci case 8: 21058c2ecf20Sopenharmony_ci len_1 |= RT5682_I2S2_DL_8; 21068c2ecf20Sopenharmony_ci len_2 |= RT5682_I2S2_DL_8; 21078c2ecf20Sopenharmony_ci break; 21088c2ecf20Sopenharmony_ci default: 21098c2ecf20Sopenharmony_ci return -EINVAL; 21108c2ecf20Sopenharmony_ci } 21118c2ecf20Sopenharmony_ci 21128c2ecf20Sopenharmony_ci switch (dai->id) { 21138c2ecf20Sopenharmony_ci case RT5682_AIF1: 21148c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S1_SDP, 21158c2ecf20Sopenharmony_ci RT5682_I2S1_DL_MASK, len_1); 21168c2ecf20Sopenharmony_ci if (rt5682->master[RT5682_AIF1]) { 21178c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 21188c2ecf20Sopenharmony_ci RT5682_ADDA_CLK_1, RT5682_I2S_M_DIV_MASK | 21198c2ecf20Sopenharmony_ci RT5682_I2S_CLK_SRC_MASK, 21208c2ecf20Sopenharmony_ci pre_div << RT5682_I2S_M_DIV_SFT | 21218c2ecf20Sopenharmony_ci (rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT); 21228c2ecf20Sopenharmony_ci } 21238c2ecf20Sopenharmony_ci if (params_channels(params) == 1) /* mono mode */ 21248c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 21258c2ecf20Sopenharmony_ci RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK, 21268c2ecf20Sopenharmony_ci RT5682_I2S1_MONO_EN); 21278c2ecf20Sopenharmony_ci else 21288c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 21298c2ecf20Sopenharmony_ci RT5682_I2S1_SDP, RT5682_I2S1_MONO_MASK, 21308c2ecf20Sopenharmony_ci RT5682_I2S1_MONO_DIS); 21318c2ecf20Sopenharmony_ci break; 21328c2ecf20Sopenharmony_ci case RT5682_AIF2: 21338c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S2_SDP, 21348c2ecf20Sopenharmony_ci RT5682_I2S2_DL_MASK, len_2); 21358c2ecf20Sopenharmony_ci if (rt5682->master[RT5682_AIF2]) { 21368c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 21378c2ecf20Sopenharmony_ci RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_M_PD_MASK, 21388c2ecf20Sopenharmony_ci pre_div << RT5682_I2S2_M_PD_SFT); 21398c2ecf20Sopenharmony_ci } 21408c2ecf20Sopenharmony_ci if (params_channels(params) == 1) /* mono mode */ 21418c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 21428c2ecf20Sopenharmony_ci RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK, 21438c2ecf20Sopenharmony_ci RT5682_I2S2_MONO_EN); 21448c2ecf20Sopenharmony_ci else 21458c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 21468c2ecf20Sopenharmony_ci RT5682_I2S2_SDP, RT5682_I2S2_MONO_MASK, 21478c2ecf20Sopenharmony_ci RT5682_I2S2_MONO_DIS); 21488c2ecf20Sopenharmony_ci break; 21498c2ecf20Sopenharmony_ci default: 21508c2ecf20Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 21518c2ecf20Sopenharmony_ci return -EINVAL; 21528c2ecf20Sopenharmony_ci } 21538c2ecf20Sopenharmony_ci 21548c2ecf20Sopenharmony_ci return 0; 21558c2ecf20Sopenharmony_ci} 21568c2ecf20Sopenharmony_ci 21578c2ecf20Sopenharmony_cistatic int rt5682_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) 21588c2ecf20Sopenharmony_ci{ 21598c2ecf20Sopenharmony_ci struct snd_soc_component *component = dai->component; 21608c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 21618c2ecf20Sopenharmony_ci unsigned int reg_val = 0, tdm_ctrl = 0; 21628c2ecf20Sopenharmony_ci 21638c2ecf20Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 21648c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_CBM_CFM: 21658c2ecf20Sopenharmony_ci rt5682->master[dai->id] = 1; 21668c2ecf20Sopenharmony_ci break; 21678c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_CBS_CFS: 21688c2ecf20Sopenharmony_ci rt5682->master[dai->id] = 0; 21698c2ecf20Sopenharmony_ci break; 21708c2ecf20Sopenharmony_ci default: 21718c2ecf20Sopenharmony_ci return -EINVAL; 21728c2ecf20Sopenharmony_ci } 21738c2ecf20Sopenharmony_ci 21748c2ecf20Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 21758c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_NB_NF: 21768c2ecf20Sopenharmony_ci break; 21778c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_IB_NF: 21788c2ecf20Sopenharmony_ci reg_val |= RT5682_I2S_BP_INV; 21798c2ecf20Sopenharmony_ci tdm_ctrl |= RT5682_TDM_S_BP_INV; 21808c2ecf20Sopenharmony_ci break; 21818c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_NB_IF: 21828c2ecf20Sopenharmony_ci if (dai->id == RT5682_AIF1) 21838c2ecf20Sopenharmony_ci tdm_ctrl |= RT5682_TDM_S_LP_INV | RT5682_TDM_M_BP_INV; 21848c2ecf20Sopenharmony_ci else 21858c2ecf20Sopenharmony_ci return -EINVAL; 21868c2ecf20Sopenharmony_ci break; 21878c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_IB_IF: 21888c2ecf20Sopenharmony_ci if (dai->id == RT5682_AIF1) 21898c2ecf20Sopenharmony_ci tdm_ctrl |= RT5682_TDM_S_BP_INV | RT5682_TDM_S_LP_INV | 21908c2ecf20Sopenharmony_ci RT5682_TDM_M_BP_INV | RT5682_TDM_M_LP_INV; 21918c2ecf20Sopenharmony_ci else 21928c2ecf20Sopenharmony_ci return -EINVAL; 21938c2ecf20Sopenharmony_ci break; 21948c2ecf20Sopenharmony_ci default: 21958c2ecf20Sopenharmony_ci return -EINVAL; 21968c2ecf20Sopenharmony_ci } 21978c2ecf20Sopenharmony_ci 21988c2ecf20Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 21998c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_I2S: 22008c2ecf20Sopenharmony_ci break; 22018c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_LEFT_J: 22028c2ecf20Sopenharmony_ci reg_val |= RT5682_I2S_DF_LEFT; 22038c2ecf20Sopenharmony_ci tdm_ctrl |= RT5682_TDM_DF_LEFT; 22048c2ecf20Sopenharmony_ci break; 22058c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_DSP_A: 22068c2ecf20Sopenharmony_ci reg_val |= RT5682_I2S_DF_PCM_A; 22078c2ecf20Sopenharmony_ci tdm_ctrl |= RT5682_TDM_DF_PCM_A; 22088c2ecf20Sopenharmony_ci break; 22098c2ecf20Sopenharmony_ci case SND_SOC_DAIFMT_DSP_B: 22108c2ecf20Sopenharmony_ci reg_val |= RT5682_I2S_DF_PCM_B; 22118c2ecf20Sopenharmony_ci tdm_ctrl |= RT5682_TDM_DF_PCM_B; 22128c2ecf20Sopenharmony_ci break; 22138c2ecf20Sopenharmony_ci default: 22148c2ecf20Sopenharmony_ci return -EINVAL; 22158c2ecf20Sopenharmony_ci } 22168c2ecf20Sopenharmony_ci 22178c2ecf20Sopenharmony_ci switch (dai->id) { 22188c2ecf20Sopenharmony_ci case RT5682_AIF1: 22198c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S1_SDP, 22208c2ecf20Sopenharmony_ci RT5682_I2S_DF_MASK, reg_val); 22218c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 22228c2ecf20Sopenharmony_ci RT5682_TDM_MS_MASK | RT5682_TDM_S_BP_MASK | 22238c2ecf20Sopenharmony_ci RT5682_TDM_DF_MASK | RT5682_TDM_M_BP_MASK | 22248c2ecf20Sopenharmony_ci RT5682_TDM_M_LP_MASK | RT5682_TDM_S_LP_MASK, 22258c2ecf20Sopenharmony_ci tdm_ctrl | rt5682->master[dai->id]); 22268c2ecf20Sopenharmony_ci break; 22278c2ecf20Sopenharmony_ci case RT5682_AIF2: 22288c2ecf20Sopenharmony_ci if (rt5682->master[dai->id] == 0) 22298c2ecf20Sopenharmony_ci reg_val |= RT5682_I2S2_MS_S; 22308c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_I2S2_SDP, 22318c2ecf20Sopenharmony_ci RT5682_I2S2_MS_MASK | RT5682_I2S_BP_MASK | 22328c2ecf20Sopenharmony_ci RT5682_I2S_DF_MASK, reg_val); 22338c2ecf20Sopenharmony_ci break; 22348c2ecf20Sopenharmony_ci default: 22358c2ecf20Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 22368c2ecf20Sopenharmony_ci return -EINVAL; 22378c2ecf20Sopenharmony_ci } 22388c2ecf20Sopenharmony_ci return 0; 22398c2ecf20Sopenharmony_ci} 22408c2ecf20Sopenharmony_ci 22418c2ecf20Sopenharmony_cistatic int rt5682_set_component_sysclk(struct snd_soc_component *component, 22428c2ecf20Sopenharmony_ci int clk_id, int source, unsigned int freq, int dir) 22438c2ecf20Sopenharmony_ci{ 22448c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 22458c2ecf20Sopenharmony_ci unsigned int reg_val = 0, src = 0; 22468c2ecf20Sopenharmony_ci 22478c2ecf20Sopenharmony_ci if (freq == rt5682->sysclk && clk_id == rt5682->sysclk_src) 22488c2ecf20Sopenharmony_ci return 0; 22498c2ecf20Sopenharmony_ci 22508c2ecf20Sopenharmony_ci switch (clk_id) { 22518c2ecf20Sopenharmony_ci case RT5682_SCLK_S_MCLK: 22528c2ecf20Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_MCLK; 22538c2ecf20Sopenharmony_ci src = RT5682_CLK_SRC_MCLK; 22548c2ecf20Sopenharmony_ci break; 22558c2ecf20Sopenharmony_ci case RT5682_SCLK_S_PLL1: 22568c2ecf20Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_PLL1; 22578c2ecf20Sopenharmony_ci src = RT5682_CLK_SRC_PLL1; 22588c2ecf20Sopenharmony_ci break; 22598c2ecf20Sopenharmony_ci case RT5682_SCLK_S_PLL2: 22608c2ecf20Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_PLL2; 22618c2ecf20Sopenharmony_ci src = RT5682_CLK_SRC_PLL2; 22628c2ecf20Sopenharmony_ci break; 22638c2ecf20Sopenharmony_ci case RT5682_SCLK_S_RCCLK: 22648c2ecf20Sopenharmony_ci reg_val |= RT5682_SCLK_SRC_RCCLK; 22658c2ecf20Sopenharmony_ci src = RT5682_CLK_SRC_RCCLK; 22668c2ecf20Sopenharmony_ci break; 22678c2ecf20Sopenharmony_ci default: 22688c2ecf20Sopenharmony_ci dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); 22698c2ecf20Sopenharmony_ci return -EINVAL; 22708c2ecf20Sopenharmony_ci } 22718c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_GLB_CLK, 22728c2ecf20Sopenharmony_ci RT5682_SCLK_SRC_MASK, reg_val); 22738c2ecf20Sopenharmony_ci 22748c2ecf20Sopenharmony_ci if (rt5682->master[RT5682_AIF2]) { 22758c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 22768c2ecf20Sopenharmony_ci RT5682_I2S_M_CLK_CTRL_1, RT5682_I2S2_SRC_MASK, 22778c2ecf20Sopenharmony_ci src << RT5682_I2S2_SRC_SFT); 22788c2ecf20Sopenharmony_ci } 22798c2ecf20Sopenharmony_ci 22808c2ecf20Sopenharmony_ci rt5682->sysclk = freq; 22818c2ecf20Sopenharmony_ci rt5682->sysclk_src = clk_id; 22828c2ecf20Sopenharmony_ci 22838c2ecf20Sopenharmony_ci dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", 22848c2ecf20Sopenharmony_ci freq, clk_id); 22858c2ecf20Sopenharmony_ci 22868c2ecf20Sopenharmony_ci return 0; 22878c2ecf20Sopenharmony_ci} 22888c2ecf20Sopenharmony_ci 22898c2ecf20Sopenharmony_cistatic int rt5682_set_component_pll(struct snd_soc_component *component, 22908c2ecf20Sopenharmony_ci int pll_id, int source, unsigned int freq_in, 22918c2ecf20Sopenharmony_ci unsigned int freq_out) 22928c2ecf20Sopenharmony_ci{ 22938c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 22948c2ecf20Sopenharmony_ci struct rl6231_pll_code pll_code, pll2f_code, pll2b_code; 22958c2ecf20Sopenharmony_ci unsigned int pll2_fout1, pll2_ps_val; 22968c2ecf20Sopenharmony_ci int ret; 22978c2ecf20Sopenharmony_ci 22988c2ecf20Sopenharmony_ci if (source == rt5682->pll_src[pll_id] && 22998c2ecf20Sopenharmony_ci freq_in == rt5682->pll_in[pll_id] && 23008c2ecf20Sopenharmony_ci freq_out == rt5682->pll_out[pll_id]) 23018c2ecf20Sopenharmony_ci return 0; 23028c2ecf20Sopenharmony_ci 23038c2ecf20Sopenharmony_ci if (!freq_in || !freq_out) { 23048c2ecf20Sopenharmony_ci dev_dbg(component->dev, "PLL disabled\n"); 23058c2ecf20Sopenharmony_ci 23068c2ecf20Sopenharmony_ci rt5682->pll_in[pll_id] = 0; 23078c2ecf20Sopenharmony_ci rt5682->pll_out[pll_id] = 0; 23088c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_GLB_CLK, 23098c2ecf20Sopenharmony_ci RT5682_SCLK_SRC_MASK, RT5682_SCLK_SRC_MCLK); 23108c2ecf20Sopenharmony_ci return 0; 23118c2ecf20Sopenharmony_ci } 23128c2ecf20Sopenharmony_ci 23138c2ecf20Sopenharmony_ci if (pll_id == RT5682_PLL2) { 23148c2ecf20Sopenharmony_ci switch (source) { 23158c2ecf20Sopenharmony_ci case RT5682_PLL2_S_MCLK: 23168c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 23178c2ecf20Sopenharmony_ci RT5682_GLB_CLK, RT5682_PLL2_SRC_MASK, 23188c2ecf20Sopenharmony_ci RT5682_PLL2_SRC_MCLK); 23198c2ecf20Sopenharmony_ci break; 23208c2ecf20Sopenharmony_ci default: 23218c2ecf20Sopenharmony_ci dev_err(component->dev, "Unknown PLL2 Source %d\n", 23228c2ecf20Sopenharmony_ci source); 23238c2ecf20Sopenharmony_ci return -EINVAL; 23248c2ecf20Sopenharmony_ci } 23258c2ecf20Sopenharmony_ci 23268c2ecf20Sopenharmony_ci /** 23278c2ecf20Sopenharmony_ci * PLL2 concatenates 2 PLL units. 23288c2ecf20Sopenharmony_ci * We suggest the Fout of the front PLL is 3.84MHz. 23298c2ecf20Sopenharmony_ci */ 23308c2ecf20Sopenharmony_ci pll2_fout1 = 3840000; 23318c2ecf20Sopenharmony_ci ret = rl6231_pll_calc(freq_in, pll2_fout1, &pll2f_code); 23328c2ecf20Sopenharmony_ci if (ret < 0) { 23338c2ecf20Sopenharmony_ci dev_err(component->dev, "Unsupport input clock %d\n", 23348c2ecf20Sopenharmony_ci freq_in); 23358c2ecf20Sopenharmony_ci return ret; 23368c2ecf20Sopenharmony_ci } 23378c2ecf20Sopenharmony_ci dev_dbg(component->dev, "PLL2F: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n", 23388c2ecf20Sopenharmony_ci freq_in, pll2_fout1, 23398c2ecf20Sopenharmony_ci pll2f_code.m_bp, 23408c2ecf20Sopenharmony_ci (pll2f_code.m_bp ? 0 : pll2f_code.m_code), 23418c2ecf20Sopenharmony_ci pll2f_code.n_code, pll2f_code.k_code); 23428c2ecf20Sopenharmony_ci 23438c2ecf20Sopenharmony_ci ret = rl6231_pll_calc(pll2_fout1, freq_out, &pll2b_code); 23448c2ecf20Sopenharmony_ci if (ret < 0) { 23458c2ecf20Sopenharmony_ci dev_err(component->dev, "Unsupport input clock %d\n", 23468c2ecf20Sopenharmony_ci pll2_fout1); 23478c2ecf20Sopenharmony_ci return ret; 23488c2ecf20Sopenharmony_ci } 23498c2ecf20Sopenharmony_ci dev_dbg(component->dev, "PLL2B: fin=%d fout=%d bypass=%d m=%d n=%d k=%d\n", 23508c2ecf20Sopenharmony_ci pll2_fout1, freq_out, 23518c2ecf20Sopenharmony_ci pll2b_code.m_bp, 23528c2ecf20Sopenharmony_ci (pll2b_code.m_bp ? 0 : pll2b_code.m_code), 23538c2ecf20Sopenharmony_ci pll2b_code.n_code, pll2b_code.k_code); 23548c2ecf20Sopenharmony_ci 23558c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL2_CTRL_1, 23568c2ecf20Sopenharmony_ci pll2f_code.k_code << RT5682_PLL2F_K_SFT | 23578c2ecf20Sopenharmony_ci pll2b_code.k_code << RT5682_PLL2B_K_SFT | 23588c2ecf20Sopenharmony_ci pll2b_code.m_code); 23598c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL2_CTRL_2, 23608c2ecf20Sopenharmony_ci pll2f_code.m_code << RT5682_PLL2F_M_SFT | 23618c2ecf20Sopenharmony_ci pll2b_code.n_code); 23628c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL2_CTRL_3, 23638c2ecf20Sopenharmony_ci pll2f_code.n_code << RT5682_PLL2F_N_SFT); 23648c2ecf20Sopenharmony_ci 23658c2ecf20Sopenharmony_ci if (freq_out == 22579200) 23668c2ecf20Sopenharmony_ci pll2_ps_val = 1 << RT5682_PLL2B_SEL_PS_SFT; 23678c2ecf20Sopenharmony_ci else 23688c2ecf20Sopenharmony_ci pll2_ps_val = 1 << RT5682_PLL2B_PS_BYP_SFT; 23698c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PLL2_CTRL_4, 23708c2ecf20Sopenharmony_ci RT5682_PLL2B_SEL_PS_MASK | RT5682_PLL2B_PS_BYP_MASK | 23718c2ecf20Sopenharmony_ci RT5682_PLL2B_M_BP_MASK | RT5682_PLL2F_M_BP_MASK | 0xf, 23728c2ecf20Sopenharmony_ci pll2_ps_val | 23738c2ecf20Sopenharmony_ci (pll2b_code.m_bp ? 1 : 0) << RT5682_PLL2B_M_BP_SFT | 23748c2ecf20Sopenharmony_ci (pll2f_code.m_bp ? 1 : 0) << RT5682_PLL2F_M_BP_SFT | 23758c2ecf20Sopenharmony_ci 0xf); 23768c2ecf20Sopenharmony_ci } else { 23778c2ecf20Sopenharmony_ci switch (source) { 23788c2ecf20Sopenharmony_ci case RT5682_PLL1_S_MCLK: 23798c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 23808c2ecf20Sopenharmony_ci RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK, 23818c2ecf20Sopenharmony_ci RT5682_PLL1_SRC_MCLK); 23828c2ecf20Sopenharmony_ci break; 23838c2ecf20Sopenharmony_ci case RT5682_PLL1_S_BCLK1: 23848c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, 23858c2ecf20Sopenharmony_ci RT5682_GLB_CLK, RT5682_PLL1_SRC_MASK, 23868c2ecf20Sopenharmony_ci RT5682_PLL1_SRC_BCLK1); 23878c2ecf20Sopenharmony_ci break; 23888c2ecf20Sopenharmony_ci default: 23898c2ecf20Sopenharmony_ci dev_err(component->dev, "Unknown PLL1 Source %d\n", 23908c2ecf20Sopenharmony_ci source); 23918c2ecf20Sopenharmony_ci return -EINVAL; 23928c2ecf20Sopenharmony_ci } 23938c2ecf20Sopenharmony_ci 23948c2ecf20Sopenharmony_ci ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); 23958c2ecf20Sopenharmony_ci if (ret < 0) { 23968c2ecf20Sopenharmony_ci dev_err(component->dev, "Unsupport input clock %d\n", 23978c2ecf20Sopenharmony_ci freq_in); 23988c2ecf20Sopenharmony_ci return ret; 23998c2ecf20Sopenharmony_ci } 24008c2ecf20Sopenharmony_ci 24018c2ecf20Sopenharmony_ci dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", 24028c2ecf20Sopenharmony_ci pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), 24038c2ecf20Sopenharmony_ci pll_code.n_code, pll_code.k_code); 24048c2ecf20Sopenharmony_ci 24058c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL_CTRL_1, 24068c2ecf20Sopenharmony_ci pll_code.n_code << RT5682_PLL_N_SFT | pll_code.k_code); 24078c2ecf20Sopenharmony_ci snd_soc_component_write(component, RT5682_PLL_CTRL_2, 24088c2ecf20Sopenharmony_ci (pll_code.m_bp ? 0 : pll_code.m_code) << RT5682_PLL_M_SFT | 24098c2ecf20Sopenharmony_ci pll_code.m_bp << RT5682_PLL_M_BP_SFT | RT5682_PLL_RST); 24108c2ecf20Sopenharmony_ci } 24118c2ecf20Sopenharmony_ci 24128c2ecf20Sopenharmony_ci rt5682->pll_in[pll_id] = freq_in; 24138c2ecf20Sopenharmony_ci rt5682->pll_out[pll_id] = freq_out; 24148c2ecf20Sopenharmony_ci rt5682->pll_src[pll_id] = source; 24158c2ecf20Sopenharmony_ci 24168c2ecf20Sopenharmony_ci return 0; 24178c2ecf20Sopenharmony_ci} 24188c2ecf20Sopenharmony_ci 24198c2ecf20Sopenharmony_cistatic int rt5682_set_bclk1_ratio(struct snd_soc_dai *dai, unsigned int ratio) 24208c2ecf20Sopenharmony_ci{ 24218c2ecf20Sopenharmony_ci struct snd_soc_component *component = dai->component; 24228c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 24238c2ecf20Sopenharmony_ci 24248c2ecf20Sopenharmony_ci rt5682->bclk[dai->id] = ratio; 24258c2ecf20Sopenharmony_ci 24268c2ecf20Sopenharmony_ci switch (ratio) { 24278c2ecf20Sopenharmony_ci case 256: 24288c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 24298c2ecf20Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_256); 24308c2ecf20Sopenharmony_ci break; 24318c2ecf20Sopenharmony_ci case 128: 24328c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 24338c2ecf20Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_128); 24348c2ecf20Sopenharmony_ci break; 24358c2ecf20Sopenharmony_ci case 64: 24368c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 24378c2ecf20Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_64); 24388c2ecf20Sopenharmony_ci break; 24398c2ecf20Sopenharmony_ci case 32: 24408c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_TDM_TCON_CTRL, 24418c2ecf20Sopenharmony_ci RT5682_TDM_BCLK_MS1_MASK, RT5682_TDM_BCLK_MS1_32); 24428c2ecf20Sopenharmony_ci break; 24438c2ecf20Sopenharmony_ci default: 24448c2ecf20Sopenharmony_ci dev_err(dai->dev, "Invalid bclk1 ratio %d\n", ratio); 24458c2ecf20Sopenharmony_ci return -EINVAL; 24468c2ecf20Sopenharmony_ci } 24478c2ecf20Sopenharmony_ci 24488c2ecf20Sopenharmony_ci return 0; 24498c2ecf20Sopenharmony_ci} 24508c2ecf20Sopenharmony_ci 24518c2ecf20Sopenharmony_cistatic int rt5682_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int ratio) 24528c2ecf20Sopenharmony_ci{ 24538c2ecf20Sopenharmony_ci struct snd_soc_component *component = dai->component; 24548c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 24558c2ecf20Sopenharmony_ci 24568c2ecf20Sopenharmony_ci rt5682->bclk[dai->id] = ratio; 24578c2ecf20Sopenharmony_ci 24588c2ecf20Sopenharmony_ci switch (ratio) { 24598c2ecf20Sopenharmony_ci case 64: 24608c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2, 24618c2ecf20Sopenharmony_ci RT5682_I2S2_BCLK_MS2_MASK, 24628c2ecf20Sopenharmony_ci RT5682_I2S2_BCLK_MS2_64); 24638c2ecf20Sopenharmony_ci break; 24648c2ecf20Sopenharmony_ci case 32: 24658c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_2, 24668c2ecf20Sopenharmony_ci RT5682_I2S2_BCLK_MS2_MASK, 24678c2ecf20Sopenharmony_ci RT5682_I2S2_BCLK_MS2_32); 24688c2ecf20Sopenharmony_ci break; 24698c2ecf20Sopenharmony_ci default: 24708c2ecf20Sopenharmony_ci dev_err(dai->dev, "Invalid bclk2 ratio %d\n", ratio); 24718c2ecf20Sopenharmony_ci return -EINVAL; 24728c2ecf20Sopenharmony_ci } 24738c2ecf20Sopenharmony_ci 24748c2ecf20Sopenharmony_ci return 0; 24758c2ecf20Sopenharmony_ci} 24768c2ecf20Sopenharmony_ci 24778c2ecf20Sopenharmony_cistatic int rt5682_set_bias_level(struct snd_soc_component *component, 24788c2ecf20Sopenharmony_ci enum snd_soc_bias_level level) 24798c2ecf20Sopenharmony_ci{ 24808c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 24818c2ecf20Sopenharmony_ci 24828c2ecf20Sopenharmony_ci switch (level) { 24838c2ecf20Sopenharmony_ci case SND_SOC_BIAS_PREPARE: 24848c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1, 24858c2ecf20Sopenharmony_ci RT5682_PWR_BG, RT5682_PWR_BG); 24868c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1, 24878c2ecf20Sopenharmony_ci RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 24888c2ecf20Sopenharmony_ci RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO); 24898c2ecf20Sopenharmony_ci break; 24908c2ecf20Sopenharmony_ci 24918c2ecf20Sopenharmony_ci case SND_SOC_BIAS_STANDBY: 24928c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1, 24938c2ecf20Sopenharmony_ci RT5682_DIG_GATE_CTRL, RT5682_DIG_GATE_CTRL); 24948c2ecf20Sopenharmony_ci break; 24958c2ecf20Sopenharmony_ci case SND_SOC_BIAS_OFF: 24968c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_DIG_1, 24978c2ecf20Sopenharmony_ci RT5682_DIG_GATE_CTRL | RT5682_PWR_LDO, 0); 24988c2ecf20Sopenharmony_ci regmap_update_bits(rt5682->regmap, RT5682_PWR_ANLG_1, 24998c2ecf20Sopenharmony_ci RT5682_PWR_BG, 0); 25008c2ecf20Sopenharmony_ci break; 25018c2ecf20Sopenharmony_ci case SND_SOC_BIAS_ON: 25028c2ecf20Sopenharmony_ci break; 25038c2ecf20Sopenharmony_ci } 25048c2ecf20Sopenharmony_ci 25058c2ecf20Sopenharmony_ci return 0; 25068c2ecf20Sopenharmony_ci} 25078c2ecf20Sopenharmony_ci 25088c2ecf20Sopenharmony_ci#ifdef CONFIG_COMMON_CLK 25098c2ecf20Sopenharmony_ci#define CLK_PLL2_FIN 48000000 25108c2ecf20Sopenharmony_ci#define CLK_48 48000 25118c2ecf20Sopenharmony_ci#define CLK_44 44100 25128c2ecf20Sopenharmony_ci 25138c2ecf20Sopenharmony_cistatic bool rt5682_clk_check(struct rt5682_priv *rt5682) 25148c2ecf20Sopenharmony_ci{ 25158c2ecf20Sopenharmony_ci if (!rt5682->master[RT5682_AIF1]) { 25168c2ecf20Sopenharmony_ci dev_dbg(rt5682->component->dev, "sysclk/dai not set correctly\n"); 25178c2ecf20Sopenharmony_ci return false; 25188c2ecf20Sopenharmony_ci } 25198c2ecf20Sopenharmony_ci return true; 25208c2ecf20Sopenharmony_ci} 25218c2ecf20Sopenharmony_ci 25228c2ecf20Sopenharmony_cistatic int rt5682_wclk_prepare(struct clk_hw *hw) 25238c2ecf20Sopenharmony_ci{ 25248c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 25258c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 25268c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 25278c2ecf20Sopenharmony_ci struct snd_soc_component *component = rt5682->component; 25288c2ecf20Sopenharmony_ci struct snd_soc_dapm_context *dapm = 25298c2ecf20Sopenharmony_ci snd_soc_component_get_dapm(component); 25308c2ecf20Sopenharmony_ci 25318c2ecf20Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 25328c2ecf20Sopenharmony_ci return -EINVAL; 25338c2ecf20Sopenharmony_ci 25348c2ecf20Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 25358c2ecf20Sopenharmony_ci 25368c2ecf20Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "MICBIAS"); 25378c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 25388c2ecf20Sopenharmony_ci RT5682_PWR_MB, RT5682_PWR_MB); 25398c2ecf20Sopenharmony_ci 25408c2ecf20Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "Vref2"); 25418c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 25428c2ecf20Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_FV2, 25438c2ecf20Sopenharmony_ci RT5682_PWR_VREF2); 25448c2ecf20Sopenharmony_ci usleep_range(55000, 60000); 25458c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 25468c2ecf20Sopenharmony_ci RT5682_PWR_FV2, RT5682_PWR_FV2); 25478c2ecf20Sopenharmony_ci 25488c2ecf20Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "I2S1"); 25498c2ecf20Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2F"); 25508c2ecf20Sopenharmony_ci snd_soc_dapm_force_enable_pin_unlocked(dapm, "PLL2B"); 25518c2ecf20Sopenharmony_ci snd_soc_dapm_sync_unlocked(dapm); 25528c2ecf20Sopenharmony_ci 25538c2ecf20Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 25548c2ecf20Sopenharmony_ci 25558c2ecf20Sopenharmony_ci return 0; 25568c2ecf20Sopenharmony_ci} 25578c2ecf20Sopenharmony_ci 25588c2ecf20Sopenharmony_cistatic void rt5682_wclk_unprepare(struct clk_hw *hw) 25598c2ecf20Sopenharmony_ci{ 25608c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 25618c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 25628c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 25638c2ecf20Sopenharmony_ci struct snd_soc_component *component = rt5682->component; 25648c2ecf20Sopenharmony_ci struct snd_soc_dapm_context *dapm = 25658c2ecf20Sopenharmony_ci snd_soc_component_get_dapm(component); 25668c2ecf20Sopenharmony_ci 25678c2ecf20Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 25688c2ecf20Sopenharmony_ci return; 25698c2ecf20Sopenharmony_ci 25708c2ecf20Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 25718c2ecf20Sopenharmony_ci 25728c2ecf20Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "MICBIAS"); 25738c2ecf20Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "Vref2"); 25748c2ecf20Sopenharmony_ci if (!rt5682->jack_type) 25758c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_PWR_ANLG_1, 25768c2ecf20Sopenharmony_ci RT5682_PWR_VREF2 | RT5682_PWR_FV2 | 25778c2ecf20Sopenharmony_ci RT5682_PWR_MB, 0); 25788c2ecf20Sopenharmony_ci 25798c2ecf20Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "I2S1"); 25808c2ecf20Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2F"); 25818c2ecf20Sopenharmony_ci snd_soc_dapm_disable_pin_unlocked(dapm, "PLL2B"); 25828c2ecf20Sopenharmony_ci snd_soc_dapm_sync_unlocked(dapm); 25838c2ecf20Sopenharmony_ci 25848c2ecf20Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 25858c2ecf20Sopenharmony_ci} 25868c2ecf20Sopenharmony_ci 25878c2ecf20Sopenharmony_cistatic unsigned long rt5682_wclk_recalc_rate(struct clk_hw *hw, 25888c2ecf20Sopenharmony_ci unsigned long parent_rate) 25898c2ecf20Sopenharmony_ci{ 25908c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 25918c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 25928c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 25938c2ecf20Sopenharmony_ci struct snd_soc_component *component = rt5682->component; 25948c2ecf20Sopenharmony_ci const char * const clk_name = clk_hw_get_name(hw); 25958c2ecf20Sopenharmony_ci 25968c2ecf20Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 25978c2ecf20Sopenharmony_ci return 0; 25988c2ecf20Sopenharmony_ci /* 25998c2ecf20Sopenharmony_ci * Only accept to set wclk rate to 44.1k or 48kHz. 26008c2ecf20Sopenharmony_ci */ 26018c2ecf20Sopenharmony_ci if (rt5682->lrck[RT5682_AIF1] != CLK_48 && 26028c2ecf20Sopenharmony_ci rt5682->lrck[RT5682_AIF1] != CLK_44) { 26038c2ecf20Sopenharmony_ci dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n", 26048c2ecf20Sopenharmony_ci __func__, clk_name, CLK_44, CLK_48); 26058c2ecf20Sopenharmony_ci return 0; 26068c2ecf20Sopenharmony_ci } 26078c2ecf20Sopenharmony_ci 26088c2ecf20Sopenharmony_ci return rt5682->lrck[RT5682_AIF1]; 26098c2ecf20Sopenharmony_ci} 26108c2ecf20Sopenharmony_ci 26118c2ecf20Sopenharmony_cistatic long rt5682_wclk_round_rate(struct clk_hw *hw, unsigned long rate, 26128c2ecf20Sopenharmony_ci unsigned long *parent_rate) 26138c2ecf20Sopenharmony_ci{ 26148c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 26158c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 26168c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 26178c2ecf20Sopenharmony_ci struct snd_soc_component *component = rt5682->component; 26188c2ecf20Sopenharmony_ci const char * const clk_name = clk_hw_get_name(hw); 26198c2ecf20Sopenharmony_ci 26208c2ecf20Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 26218c2ecf20Sopenharmony_ci return -EINVAL; 26228c2ecf20Sopenharmony_ci /* 26238c2ecf20Sopenharmony_ci * Only accept to set wclk rate to 44.1k or 48kHz. 26248c2ecf20Sopenharmony_ci * It will force to 48kHz if not both. 26258c2ecf20Sopenharmony_ci */ 26268c2ecf20Sopenharmony_ci if (rate != CLK_48 && rate != CLK_44) { 26278c2ecf20Sopenharmony_ci dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n", 26288c2ecf20Sopenharmony_ci __func__, clk_name, CLK_44, CLK_48); 26298c2ecf20Sopenharmony_ci rate = CLK_48; 26308c2ecf20Sopenharmony_ci } 26318c2ecf20Sopenharmony_ci 26328c2ecf20Sopenharmony_ci return rate; 26338c2ecf20Sopenharmony_ci} 26348c2ecf20Sopenharmony_ci 26358c2ecf20Sopenharmony_cistatic int rt5682_wclk_set_rate(struct clk_hw *hw, unsigned long rate, 26368c2ecf20Sopenharmony_ci unsigned long parent_rate) 26378c2ecf20Sopenharmony_ci{ 26388c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 26398c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 26408c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_WCLK_IDX]); 26418c2ecf20Sopenharmony_ci struct snd_soc_component *component = rt5682->component; 26428c2ecf20Sopenharmony_ci struct clk *parent_clk; 26438c2ecf20Sopenharmony_ci const char * const clk_name = clk_hw_get_name(hw); 26448c2ecf20Sopenharmony_ci int pre_div; 26458c2ecf20Sopenharmony_ci unsigned int clk_pll2_out; 26468c2ecf20Sopenharmony_ci 26478c2ecf20Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 26488c2ecf20Sopenharmony_ci return -EINVAL; 26498c2ecf20Sopenharmony_ci 26508c2ecf20Sopenharmony_ci /* 26518c2ecf20Sopenharmony_ci * Whether the wclk's parent clk (mclk) exists or not, please ensure 26528c2ecf20Sopenharmony_ci * it is fixed or set to 48MHz before setting wclk rate. It's a 26538c2ecf20Sopenharmony_ci * temporary limitation. Only accept 48MHz clk as the clk provider. 26548c2ecf20Sopenharmony_ci * 26558c2ecf20Sopenharmony_ci * It will set the codec anyway by assuming mclk is 48MHz. 26568c2ecf20Sopenharmony_ci */ 26578c2ecf20Sopenharmony_ci parent_clk = clk_get_parent(hw->clk); 26588c2ecf20Sopenharmony_ci if (!parent_clk) 26598c2ecf20Sopenharmony_ci dev_warn(component->dev, 26608c2ecf20Sopenharmony_ci "Parent mclk of wclk not acquired in driver. Please ensure mclk was provided as %d Hz.\n", 26618c2ecf20Sopenharmony_ci CLK_PLL2_FIN); 26628c2ecf20Sopenharmony_ci 26638c2ecf20Sopenharmony_ci if (parent_rate != CLK_PLL2_FIN) 26648c2ecf20Sopenharmony_ci dev_warn(component->dev, "clk %s only support %d Hz input\n", 26658c2ecf20Sopenharmony_ci clk_name, CLK_PLL2_FIN); 26668c2ecf20Sopenharmony_ci 26678c2ecf20Sopenharmony_ci /* 26688c2ecf20Sopenharmony_ci * To achieve the rate conversion from 48MHz to 44.1k or 48kHz, 26698c2ecf20Sopenharmony_ci * PLL2 is needed. 26708c2ecf20Sopenharmony_ci */ 26718c2ecf20Sopenharmony_ci clk_pll2_out = rate * 512; 26728c2ecf20Sopenharmony_ci rt5682_set_component_pll(component, RT5682_PLL2, RT5682_PLL2_S_MCLK, 26738c2ecf20Sopenharmony_ci CLK_PLL2_FIN, clk_pll2_out); 26748c2ecf20Sopenharmony_ci 26758c2ecf20Sopenharmony_ci rt5682_set_component_sysclk(component, RT5682_SCLK_S_PLL2, 0, 26768c2ecf20Sopenharmony_ci clk_pll2_out, SND_SOC_CLOCK_IN); 26778c2ecf20Sopenharmony_ci 26788c2ecf20Sopenharmony_ci rt5682->lrck[RT5682_AIF1] = rate; 26798c2ecf20Sopenharmony_ci 26808c2ecf20Sopenharmony_ci pre_div = rl6231_get_clk_info(rt5682->sysclk, rate); 26818c2ecf20Sopenharmony_ci 26828c2ecf20Sopenharmony_ci snd_soc_component_update_bits(component, RT5682_ADDA_CLK_1, 26838c2ecf20Sopenharmony_ci RT5682_I2S_M_DIV_MASK | RT5682_I2S_CLK_SRC_MASK, 26848c2ecf20Sopenharmony_ci pre_div << RT5682_I2S_M_DIV_SFT | 26858c2ecf20Sopenharmony_ci (rt5682->sysclk_src) << RT5682_I2S_CLK_SRC_SFT); 26868c2ecf20Sopenharmony_ci 26878c2ecf20Sopenharmony_ci return 0; 26888c2ecf20Sopenharmony_ci} 26898c2ecf20Sopenharmony_ci 26908c2ecf20Sopenharmony_cistatic unsigned long rt5682_bclk_recalc_rate(struct clk_hw *hw, 26918c2ecf20Sopenharmony_ci unsigned long parent_rate) 26928c2ecf20Sopenharmony_ci{ 26938c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 26948c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 26958c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_BCLK_IDX]); 26968c2ecf20Sopenharmony_ci struct snd_soc_component *component = rt5682->component; 26978c2ecf20Sopenharmony_ci unsigned int bclks_per_wclk; 26988c2ecf20Sopenharmony_ci 26998c2ecf20Sopenharmony_ci bclks_per_wclk = snd_soc_component_read(component, RT5682_TDM_TCON_CTRL); 27008c2ecf20Sopenharmony_ci 27018c2ecf20Sopenharmony_ci switch (bclks_per_wclk & RT5682_TDM_BCLK_MS1_MASK) { 27028c2ecf20Sopenharmony_ci case RT5682_TDM_BCLK_MS1_256: 27038c2ecf20Sopenharmony_ci return parent_rate * 256; 27048c2ecf20Sopenharmony_ci case RT5682_TDM_BCLK_MS1_128: 27058c2ecf20Sopenharmony_ci return parent_rate * 128; 27068c2ecf20Sopenharmony_ci case RT5682_TDM_BCLK_MS1_64: 27078c2ecf20Sopenharmony_ci return parent_rate * 64; 27088c2ecf20Sopenharmony_ci case RT5682_TDM_BCLK_MS1_32: 27098c2ecf20Sopenharmony_ci return parent_rate * 32; 27108c2ecf20Sopenharmony_ci default: 27118c2ecf20Sopenharmony_ci return 0; 27128c2ecf20Sopenharmony_ci } 27138c2ecf20Sopenharmony_ci} 27148c2ecf20Sopenharmony_ci 27158c2ecf20Sopenharmony_cistatic unsigned long rt5682_bclk_get_factor(unsigned long rate, 27168c2ecf20Sopenharmony_ci unsigned long parent_rate) 27178c2ecf20Sopenharmony_ci{ 27188c2ecf20Sopenharmony_ci unsigned long factor; 27198c2ecf20Sopenharmony_ci 27208c2ecf20Sopenharmony_ci factor = rate / parent_rate; 27218c2ecf20Sopenharmony_ci if (factor < 64) 27228c2ecf20Sopenharmony_ci return 32; 27238c2ecf20Sopenharmony_ci else if (factor < 128) 27248c2ecf20Sopenharmony_ci return 64; 27258c2ecf20Sopenharmony_ci else if (factor < 256) 27268c2ecf20Sopenharmony_ci return 128; 27278c2ecf20Sopenharmony_ci else 27288c2ecf20Sopenharmony_ci return 256; 27298c2ecf20Sopenharmony_ci} 27308c2ecf20Sopenharmony_ci 27318c2ecf20Sopenharmony_cistatic long rt5682_bclk_round_rate(struct clk_hw *hw, unsigned long rate, 27328c2ecf20Sopenharmony_ci unsigned long *parent_rate) 27338c2ecf20Sopenharmony_ci{ 27348c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 27358c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 27368c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_BCLK_IDX]); 27378c2ecf20Sopenharmony_ci unsigned long factor; 27388c2ecf20Sopenharmony_ci 27398c2ecf20Sopenharmony_ci if (!*parent_rate || !rt5682_clk_check(rt5682)) 27408c2ecf20Sopenharmony_ci return -EINVAL; 27418c2ecf20Sopenharmony_ci 27428c2ecf20Sopenharmony_ci /* 27438c2ecf20Sopenharmony_ci * BCLK rates are set as a multiplier of WCLK in HW. 27448c2ecf20Sopenharmony_ci * We don't allow changing the parent WCLK. We just do 27458c2ecf20Sopenharmony_ci * some rounding down based on the parent WCLK rate 27468c2ecf20Sopenharmony_ci * and find the appropriate multiplier of BCLK to 27478c2ecf20Sopenharmony_ci * get the rounded down BCLK value. 27488c2ecf20Sopenharmony_ci */ 27498c2ecf20Sopenharmony_ci factor = rt5682_bclk_get_factor(rate, *parent_rate); 27508c2ecf20Sopenharmony_ci 27518c2ecf20Sopenharmony_ci return *parent_rate * factor; 27528c2ecf20Sopenharmony_ci} 27538c2ecf20Sopenharmony_ci 27548c2ecf20Sopenharmony_cistatic int rt5682_bclk_set_rate(struct clk_hw *hw, unsigned long rate, 27558c2ecf20Sopenharmony_ci unsigned long parent_rate) 27568c2ecf20Sopenharmony_ci{ 27578c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = 27588c2ecf20Sopenharmony_ci container_of(hw, struct rt5682_priv, 27598c2ecf20Sopenharmony_ci dai_clks_hw[RT5682_DAI_BCLK_IDX]); 27608c2ecf20Sopenharmony_ci struct snd_soc_component *component = rt5682->component; 27618c2ecf20Sopenharmony_ci struct snd_soc_dai *dai = NULL; 27628c2ecf20Sopenharmony_ci unsigned long factor; 27638c2ecf20Sopenharmony_ci 27648c2ecf20Sopenharmony_ci if (!rt5682_clk_check(rt5682)) 27658c2ecf20Sopenharmony_ci return -EINVAL; 27668c2ecf20Sopenharmony_ci 27678c2ecf20Sopenharmony_ci factor = rt5682_bclk_get_factor(rate, parent_rate); 27688c2ecf20Sopenharmony_ci 27698c2ecf20Sopenharmony_ci for_each_component_dais(component, dai) 27708c2ecf20Sopenharmony_ci if (dai->id == RT5682_AIF1) 27718c2ecf20Sopenharmony_ci break; 27728c2ecf20Sopenharmony_ci if (!dai) { 27738c2ecf20Sopenharmony_ci dev_err(component->dev, "dai %d not found in component\n", 27748c2ecf20Sopenharmony_ci RT5682_AIF1); 27758c2ecf20Sopenharmony_ci return -ENODEV; 27768c2ecf20Sopenharmony_ci } 27778c2ecf20Sopenharmony_ci 27788c2ecf20Sopenharmony_ci return rt5682_set_bclk1_ratio(dai, factor); 27798c2ecf20Sopenharmony_ci} 27808c2ecf20Sopenharmony_ci 27818c2ecf20Sopenharmony_cistatic const struct clk_ops rt5682_dai_clk_ops[RT5682_DAI_NUM_CLKS] = { 27828c2ecf20Sopenharmony_ci [RT5682_DAI_WCLK_IDX] = { 27838c2ecf20Sopenharmony_ci .prepare = rt5682_wclk_prepare, 27848c2ecf20Sopenharmony_ci .unprepare = rt5682_wclk_unprepare, 27858c2ecf20Sopenharmony_ci .recalc_rate = rt5682_wclk_recalc_rate, 27868c2ecf20Sopenharmony_ci .round_rate = rt5682_wclk_round_rate, 27878c2ecf20Sopenharmony_ci .set_rate = rt5682_wclk_set_rate, 27888c2ecf20Sopenharmony_ci }, 27898c2ecf20Sopenharmony_ci [RT5682_DAI_BCLK_IDX] = { 27908c2ecf20Sopenharmony_ci .recalc_rate = rt5682_bclk_recalc_rate, 27918c2ecf20Sopenharmony_ci .round_rate = rt5682_bclk_round_rate, 27928c2ecf20Sopenharmony_ci .set_rate = rt5682_bclk_set_rate, 27938c2ecf20Sopenharmony_ci }, 27948c2ecf20Sopenharmony_ci}; 27958c2ecf20Sopenharmony_ci 27968c2ecf20Sopenharmony_cistatic int rt5682_register_dai_clks(struct snd_soc_component *component) 27978c2ecf20Sopenharmony_ci{ 27988c2ecf20Sopenharmony_ci struct device *dev = component->dev; 27998c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 28008c2ecf20Sopenharmony_ci struct rt5682_platform_data *pdata = &rt5682->pdata; 28018c2ecf20Sopenharmony_ci struct clk_hw *dai_clk_hw; 28028c2ecf20Sopenharmony_ci int i, ret; 28038c2ecf20Sopenharmony_ci 28048c2ecf20Sopenharmony_ci for (i = 0; i < RT5682_DAI_NUM_CLKS; ++i) { 28058c2ecf20Sopenharmony_ci struct clk_init_data init = { }; 28068c2ecf20Sopenharmony_ci struct clk_parent_data parent_data; 28078c2ecf20Sopenharmony_ci const struct clk_hw *parent; 28088c2ecf20Sopenharmony_ci 28098c2ecf20Sopenharmony_ci dai_clk_hw = &rt5682->dai_clks_hw[i]; 28108c2ecf20Sopenharmony_ci 28118c2ecf20Sopenharmony_ci switch (i) { 28128c2ecf20Sopenharmony_ci case RT5682_DAI_WCLK_IDX: 28138c2ecf20Sopenharmony_ci /* Make MCLK the parent of WCLK */ 28148c2ecf20Sopenharmony_ci if (rt5682->mclk) { 28158c2ecf20Sopenharmony_ci parent_data = (struct clk_parent_data){ 28168c2ecf20Sopenharmony_ci .fw_name = "mclk", 28178c2ecf20Sopenharmony_ci }; 28188c2ecf20Sopenharmony_ci init.parent_data = &parent_data; 28198c2ecf20Sopenharmony_ci init.num_parents = 1; 28208c2ecf20Sopenharmony_ci } 28218c2ecf20Sopenharmony_ci break; 28228c2ecf20Sopenharmony_ci case RT5682_DAI_BCLK_IDX: 28238c2ecf20Sopenharmony_ci /* Make WCLK the parent of BCLK */ 28248c2ecf20Sopenharmony_ci parent = &rt5682->dai_clks_hw[RT5682_DAI_WCLK_IDX]; 28258c2ecf20Sopenharmony_ci init.parent_hws = &parent; 28268c2ecf20Sopenharmony_ci init.num_parents = 1; 28278c2ecf20Sopenharmony_ci break; 28288c2ecf20Sopenharmony_ci default: 28298c2ecf20Sopenharmony_ci dev_err(dev, "Invalid clock index\n"); 28308c2ecf20Sopenharmony_ci return -EINVAL; 28318c2ecf20Sopenharmony_ci } 28328c2ecf20Sopenharmony_ci 28338c2ecf20Sopenharmony_ci init.name = pdata->dai_clk_names[i]; 28348c2ecf20Sopenharmony_ci init.ops = &rt5682_dai_clk_ops[i]; 28358c2ecf20Sopenharmony_ci init.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_GATE; 28368c2ecf20Sopenharmony_ci dai_clk_hw->init = &init; 28378c2ecf20Sopenharmony_ci 28388c2ecf20Sopenharmony_ci ret = devm_clk_hw_register(dev, dai_clk_hw); 28398c2ecf20Sopenharmony_ci if (ret) { 28408c2ecf20Sopenharmony_ci dev_warn(dev, "Failed to register %s: %d\n", 28418c2ecf20Sopenharmony_ci init.name, ret); 28428c2ecf20Sopenharmony_ci return ret; 28438c2ecf20Sopenharmony_ci } 28448c2ecf20Sopenharmony_ci 28458c2ecf20Sopenharmony_ci if (dev->of_node) { 28468c2ecf20Sopenharmony_ci devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, 28478c2ecf20Sopenharmony_ci dai_clk_hw); 28488c2ecf20Sopenharmony_ci } else { 28498c2ecf20Sopenharmony_ci ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw, 28508c2ecf20Sopenharmony_ci init.name, 28518c2ecf20Sopenharmony_ci dev_name(dev)); 28528c2ecf20Sopenharmony_ci if (ret) 28538c2ecf20Sopenharmony_ci return ret; 28548c2ecf20Sopenharmony_ci } 28558c2ecf20Sopenharmony_ci } 28568c2ecf20Sopenharmony_ci 28578c2ecf20Sopenharmony_ci return 0; 28588c2ecf20Sopenharmony_ci} 28598c2ecf20Sopenharmony_ci#endif /* CONFIG_COMMON_CLK */ 28608c2ecf20Sopenharmony_ci 28618c2ecf20Sopenharmony_cistatic int rt5682_probe(struct snd_soc_component *component) 28628c2ecf20Sopenharmony_ci{ 28638c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 28648c2ecf20Sopenharmony_ci struct sdw_slave *slave; 28658c2ecf20Sopenharmony_ci unsigned long time; 28668c2ecf20Sopenharmony_ci struct snd_soc_dapm_context *dapm = &component->dapm; 28678c2ecf20Sopenharmony_ci 28688c2ecf20Sopenharmony_ci#ifdef CONFIG_COMMON_CLK 28698c2ecf20Sopenharmony_ci int ret; 28708c2ecf20Sopenharmony_ci#endif 28718c2ecf20Sopenharmony_ci rt5682->component = component; 28728c2ecf20Sopenharmony_ci 28738c2ecf20Sopenharmony_ci if (rt5682->is_sdw) { 28748c2ecf20Sopenharmony_ci slave = rt5682->slave; 28758c2ecf20Sopenharmony_ci time = wait_for_completion_timeout( 28768c2ecf20Sopenharmony_ci &slave->initialization_complete, 28778c2ecf20Sopenharmony_ci msecs_to_jiffies(RT5682_PROBE_TIMEOUT)); 28788c2ecf20Sopenharmony_ci if (!time) { 28798c2ecf20Sopenharmony_ci dev_err(&slave->dev, "Initialization not complete, timed out\n"); 28808c2ecf20Sopenharmony_ci return -ETIMEDOUT; 28818c2ecf20Sopenharmony_ci } 28828c2ecf20Sopenharmony_ci } else { 28838c2ecf20Sopenharmony_ci#ifdef CONFIG_COMMON_CLK 28848c2ecf20Sopenharmony_ci /* Check if MCLK provided */ 28858c2ecf20Sopenharmony_ci rt5682->mclk = devm_clk_get(component->dev, "mclk"); 28868c2ecf20Sopenharmony_ci if (IS_ERR(rt5682->mclk)) { 28878c2ecf20Sopenharmony_ci if (PTR_ERR(rt5682->mclk) != -ENOENT) { 28888c2ecf20Sopenharmony_ci ret = PTR_ERR(rt5682->mclk); 28898c2ecf20Sopenharmony_ci return ret; 28908c2ecf20Sopenharmony_ci } 28918c2ecf20Sopenharmony_ci rt5682->mclk = NULL; 28928c2ecf20Sopenharmony_ci } 28938c2ecf20Sopenharmony_ci 28948c2ecf20Sopenharmony_ci /* Register CCF DAI clock control */ 28958c2ecf20Sopenharmony_ci ret = rt5682_register_dai_clks(component); 28968c2ecf20Sopenharmony_ci if (ret) 28978c2ecf20Sopenharmony_ci return ret; 28988c2ecf20Sopenharmony_ci 28998c2ecf20Sopenharmony_ci /* Initial setup for CCF */ 29008c2ecf20Sopenharmony_ci rt5682->lrck[RT5682_AIF1] = CLK_48; 29018c2ecf20Sopenharmony_ci#endif 29028c2ecf20Sopenharmony_ci } 29038c2ecf20Sopenharmony_ci 29048c2ecf20Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "MICBIAS"); 29058c2ecf20Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "Vref2"); 29068c2ecf20Sopenharmony_ci snd_soc_dapm_sync(dapm); 29078c2ecf20Sopenharmony_ci return 0; 29088c2ecf20Sopenharmony_ci} 29098c2ecf20Sopenharmony_ci 29108c2ecf20Sopenharmony_cistatic void rt5682_remove(struct snd_soc_component *component) 29118c2ecf20Sopenharmony_ci{ 29128c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 29138c2ecf20Sopenharmony_ci 29148c2ecf20Sopenharmony_ci rt5682_reset(rt5682); 29158c2ecf20Sopenharmony_ci} 29168c2ecf20Sopenharmony_ci 29178c2ecf20Sopenharmony_ci#ifdef CONFIG_PM 29188c2ecf20Sopenharmony_cistatic int rt5682_suspend(struct snd_soc_component *component) 29198c2ecf20Sopenharmony_ci{ 29208c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 29218c2ecf20Sopenharmony_ci 29228c2ecf20Sopenharmony_ci regcache_cache_only(rt5682->regmap, true); 29238c2ecf20Sopenharmony_ci regcache_mark_dirty(rt5682->regmap); 29248c2ecf20Sopenharmony_ci return 0; 29258c2ecf20Sopenharmony_ci} 29268c2ecf20Sopenharmony_ci 29278c2ecf20Sopenharmony_cistatic int rt5682_resume(struct snd_soc_component *component) 29288c2ecf20Sopenharmony_ci{ 29298c2ecf20Sopenharmony_ci struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component); 29308c2ecf20Sopenharmony_ci 29318c2ecf20Sopenharmony_ci regcache_cache_only(rt5682->regmap, false); 29328c2ecf20Sopenharmony_ci regcache_sync(rt5682->regmap); 29338c2ecf20Sopenharmony_ci 29348c2ecf20Sopenharmony_ci mod_delayed_work(system_power_efficient_wq, 29358c2ecf20Sopenharmony_ci &rt5682->jack_detect_work, msecs_to_jiffies(250)); 29368c2ecf20Sopenharmony_ci 29378c2ecf20Sopenharmony_ci return 0; 29388c2ecf20Sopenharmony_ci} 29398c2ecf20Sopenharmony_ci#else 29408c2ecf20Sopenharmony_ci#define rt5682_suspend NULL 29418c2ecf20Sopenharmony_ci#define rt5682_resume NULL 29428c2ecf20Sopenharmony_ci#endif 29438c2ecf20Sopenharmony_ci 29448c2ecf20Sopenharmony_ciconst struct snd_soc_dai_ops rt5682_aif1_dai_ops = { 29458c2ecf20Sopenharmony_ci .hw_params = rt5682_hw_params, 29468c2ecf20Sopenharmony_ci .set_fmt = rt5682_set_dai_fmt, 29478c2ecf20Sopenharmony_ci .set_tdm_slot = rt5682_set_tdm_slot, 29488c2ecf20Sopenharmony_ci .set_bclk_ratio = rt5682_set_bclk1_ratio, 29498c2ecf20Sopenharmony_ci}; 29508c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_aif1_dai_ops); 29518c2ecf20Sopenharmony_ci 29528c2ecf20Sopenharmony_ciconst struct snd_soc_dai_ops rt5682_aif2_dai_ops = { 29538c2ecf20Sopenharmony_ci .hw_params = rt5682_hw_params, 29548c2ecf20Sopenharmony_ci .set_fmt = rt5682_set_dai_fmt, 29558c2ecf20Sopenharmony_ci .set_bclk_ratio = rt5682_set_bclk2_ratio, 29568c2ecf20Sopenharmony_ci}; 29578c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_aif2_dai_ops); 29588c2ecf20Sopenharmony_ci 29598c2ecf20Sopenharmony_ciconst struct snd_soc_component_driver rt5682_soc_component_dev = { 29608c2ecf20Sopenharmony_ci .probe = rt5682_probe, 29618c2ecf20Sopenharmony_ci .remove = rt5682_remove, 29628c2ecf20Sopenharmony_ci .suspend = rt5682_suspend, 29638c2ecf20Sopenharmony_ci .resume = rt5682_resume, 29648c2ecf20Sopenharmony_ci .set_bias_level = rt5682_set_bias_level, 29658c2ecf20Sopenharmony_ci .controls = rt5682_snd_controls, 29668c2ecf20Sopenharmony_ci .num_controls = ARRAY_SIZE(rt5682_snd_controls), 29678c2ecf20Sopenharmony_ci .dapm_widgets = rt5682_dapm_widgets, 29688c2ecf20Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(rt5682_dapm_widgets), 29698c2ecf20Sopenharmony_ci .dapm_routes = rt5682_dapm_routes, 29708c2ecf20Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(rt5682_dapm_routes), 29718c2ecf20Sopenharmony_ci .set_sysclk = rt5682_set_component_sysclk, 29728c2ecf20Sopenharmony_ci .set_pll = rt5682_set_component_pll, 29738c2ecf20Sopenharmony_ci .set_jack = rt5682_set_jack_detect, 29748c2ecf20Sopenharmony_ci .use_pmdown_time = 1, 29758c2ecf20Sopenharmony_ci .endianness = 1, 29768c2ecf20Sopenharmony_ci .non_legacy_dai_naming = 1, 29778c2ecf20Sopenharmony_ci}; 29788c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_soc_component_dev); 29798c2ecf20Sopenharmony_ci 29808c2ecf20Sopenharmony_ciint rt5682_parse_dt(struct rt5682_priv *rt5682, struct device *dev) 29818c2ecf20Sopenharmony_ci{ 29828c2ecf20Sopenharmony_ci 29838c2ecf20Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic1-data-pin", 29848c2ecf20Sopenharmony_ci &rt5682->pdata.dmic1_data_pin); 29858c2ecf20Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic1-clk-pin", 29868c2ecf20Sopenharmony_ci &rt5682->pdata.dmic1_clk_pin); 29878c2ecf20Sopenharmony_ci device_property_read_u32(dev, "realtek,jd-src", 29888c2ecf20Sopenharmony_ci &rt5682->pdata.jd_src); 29898c2ecf20Sopenharmony_ci device_property_read_u32(dev, "realtek,btndet-delay", 29908c2ecf20Sopenharmony_ci &rt5682->pdata.btndet_delay); 29918c2ecf20Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic-clk-rate-hz", 29928c2ecf20Sopenharmony_ci &rt5682->pdata.dmic_clk_rate); 29938c2ecf20Sopenharmony_ci device_property_read_u32(dev, "realtek,dmic-delay-ms", 29948c2ecf20Sopenharmony_ci &rt5682->pdata.dmic_delay); 29958c2ecf20Sopenharmony_ci 29968c2ecf20Sopenharmony_ci rt5682->pdata.ldo1_en = of_get_named_gpio(dev->of_node, 29978c2ecf20Sopenharmony_ci "realtek,ldo1-en-gpios", 0); 29988c2ecf20Sopenharmony_ci 29998c2ecf20Sopenharmony_ci if (device_property_read_string_array(dev, "clock-output-names", 30008c2ecf20Sopenharmony_ci rt5682->pdata.dai_clk_names, 30018c2ecf20Sopenharmony_ci RT5682_DAI_NUM_CLKS) < 0) 30028c2ecf20Sopenharmony_ci dev_warn(dev, "Using default DAI clk names: %s, %s\n", 30038c2ecf20Sopenharmony_ci rt5682->pdata.dai_clk_names[RT5682_DAI_WCLK_IDX], 30048c2ecf20Sopenharmony_ci rt5682->pdata.dai_clk_names[RT5682_DAI_BCLK_IDX]); 30058c2ecf20Sopenharmony_ci 30068c2ecf20Sopenharmony_ci return 0; 30078c2ecf20Sopenharmony_ci} 30088c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_parse_dt); 30098c2ecf20Sopenharmony_ci 30108c2ecf20Sopenharmony_civoid rt5682_calibrate(struct rt5682_priv *rt5682) 30118c2ecf20Sopenharmony_ci{ 30128c2ecf20Sopenharmony_ci int value, count; 30138c2ecf20Sopenharmony_ci 30148c2ecf20Sopenharmony_ci mutex_lock(&rt5682->calibrate_mutex); 30158c2ecf20Sopenharmony_ci 30168c2ecf20Sopenharmony_ci rt5682_reset(rt5682); 30178c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_I2C_CTRL, 0x000f); 30188c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xa2af); 30198c2ecf20Sopenharmony_ci usleep_range(15000, 20000); 30208c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0xf2af); 30218c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0300); 30228c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x8000); 30238c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0100); 30248c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_IMP_SENS_CTRL_19, 0x3800); 30258c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x3000); 30268c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x7005); 30278c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0x686c); 30288c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0d0d); 30298c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_2, 0x0321); 30308c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_LOGIC_CTRL_2, 0x0004); 30318c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00); 30328c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_3, 0x06a1); 30338c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_A_DAC1_MUX, 0x0311); 30348c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0x7c00); 30358c2ecf20Sopenharmony_ci 30368c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_HP_CALIB_CTRL_1, 0xfc00); 30378c2ecf20Sopenharmony_ci 30388c2ecf20Sopenharmony_ci for (count = 0; count < 60; count++) { 30398c2ecf20Sopenharmony_ci regmap_read(rt5682->regmap, RT5682_HP_CALIB_STA_1, &value); 30408c2ecf20Sopenharmony_ci if (!(value & 0x8000)) 30418c2ecf20Sopenharmony_ci break; 30428c2ecf20Sopenharmony_ci 30438c2ecf20Sopenharmony_ci usleep_range(10000, 10005); 30448c2ecf20Sopenharmony_ci } 30458c2ecf20Sopenharmony_ci 30468c2ecf20Sopenharmony_ci if (count >= 60) 30478c2ecf20Sopenharmony_ci dev_err(rt5682->component->dev, "HP Calibration Failure\n"); 30488c2ecf20Sopenharmony_ci 30498c2ecf20Sopenharmony_ci /* restore settings */ 30508c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_ANLG_1, 0x002f); 30518c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_MICBIAS_2, 0x0080); 30528c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_GLB_CLK, 0x0000); 30538c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_PWR_DIG_1, 0x0000); 30548c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CHOP_DAC, 0x2000); 30558c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CALIB_ADC_CTRL, 0x2005); 30568c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_STO1_ADC_MIXER, 0xc0c4); 30578c2ecf20Sopenharmony_ci regmap_write(rt5682->regmap, RT5682_CAL_REC, 0x0c0c); 30588c2ecf20Sopenharmony_ci 30598c2ecf20Sopenharmony_ci mutex_unlock(&rt5682->calibrate_mutex); 30608c2ecf20Sopenharmony_ci} 30618c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5682_calibrate); 30628c2ecf20Sopenharmony_ci 30638c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT5682 driver"); 30648c2ecf20Sopenharmony_ciMODULE_AUTHOR("Bard Liao <bardliao@realtek.com>"); 30658c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3066