brintos

brintos / linux-shallow public Read only

0
0
Text · 99.9 KiB · ce2e88e Raw
3346 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2//3// rt5682s.c  --  RT5682I-VS ALSA SoC audio component driver4//5// Copyright 2021 Realtek Semiconductor Corp.6// Author: Derek Fang <derek.fang@realtek.com>7//8 9#include <linux/module.h>10#include <linux/moduleparam.h>11#include <linux/init.h>12#include <linux/delay.h>13#include <linux/pm.h>14#include <linux/i2c.h>15#include <linux/platform_device.h>16#include <linux/spi/spi.h>17#include <linux/acpi.h>18#include <linux/gpio/consumer.h>19#include <linux/mutex.h>20#include <sound/core.h>21#include <sound/pcm.h>22#include <sound/pcm_params.h>23#include <sound/jack.h>24#include <sound/soc.h>25#include <sound/soc-dapm.h>26#include <sound/initval.h>27#include <sound/tlv.h>28#include <sound/rt5682s.h>29 30#include "rt5682s.h"31 32#define DEVICE_ID 0x674933 34static const struct rt5682s_platform_data i2s_default_platform_data = {35	.dmic1_data_pin = RT5682S_DMIC1_DATA_GPIO2,36	.dmic1_clk_pin = RT5682S_DMIC1_CLK_GPIO3,37	.jd_src = RT5682S_JD1,38	.dai_clk_names[RT5682S_DAI_WCLK_IDX] = "rt5682-dai-wclk",39	.dai_clk_names[RT5682S_DAI_BCLK_IDX] = "rt5682-dai-bclk",40};41 42static const char *rt5682s_supply_names[RT5682S_NUM_SUPPLIES] = {43	[RT5682S_SUPPLY_AVDD] = "AVDD",44	[RT5682S_SUPPLY_MICVDD] = "MICVDD",45	[RT5682S_SUPPLY_DBVDD] = "DBVDD",46	[RT5682S_SUPPLY_LDO1_IN] = "LDO1-IN",47};48 49static const struct reg_sequence patch_list[] = {50	{RT5682S_I2C_CTRL,			0x0007},51	{RT5682S_DIG_IN_CTRL_1,			0x0000},52	{RT5682S_CHOP_DAC_2,			0x2020},53	{RT5682S_VREF_REC_OP_FB_CAP_CTRL_2,	0x0101},54	{RT5682S_VREF_REC_OP_FB_CAP_CTRL_1,	0x80c0},55	{RT5682S_HP_CALIB_CTRL_9,		0x0002},56	{RT5682S_DEPOP_1,			0x0000},57	{RT5682S_HP_CHARGE_PUMP_2,		0x3c15},58	{RT5682S_DAC1_DIG_VOL,			0xfefe},59	{RT5682S_SAR_IL_CMD_2,			0xac00},60	{RT5682S_SAR_IL_CMD_3,			0x024c},61	{RT5682S_CBJ_CTRL_6,			0x0804},62};63 64static void rt5682s_apply_patch_list(struct rt5682s_priv *rt5682s,65		struct device *dev)66{67	int ret;68 69	ret = regmap_multi_reg_write(rt5682s->regmap, patch_list, ARRAY_SIZE(patch_list));70	if (ret)71		dev_warn(dev, "Failed to apply regmap patch: %d\n", ret);72}73 74static const struct reg_default rt5682s_reg[] = {75	{0x0002, 0x8080},76	{0x0003, 0x0001},77	{0x0005, 0x0000},78	{0x0006, 0x0000},79	{0x0008, 0x8007},80	{0x000b, 0x0000},81	{0x000f, 0x4000},82	{0x0010, 0x4040},83	{0x0011, 0x0000},84	{0x0012, 0x0000},85	{0x0013, 0x1200},86	{0x0014, 0x200a},87	{0x0015, 0x0404},88	{0x0016, 0x0404},89	{0x0017, 0x05a4},90	{0x0019, 0xffff},91	{0x001c, 0x2f2f},92	{0x001f, 0x0000},93	{0x0022, 0x5757},94	{0x0023, 0x0039},95	{0x0024, 0x000b},96	{0x0026, 0xc0c4},97	{0x0029, 0x8080},98	{0x002a, 0xa0a0},99	{0x002b, 0x0300},100	{0x0030, 0x0000},101	{0x003c, 0x08c0},102	{0x0044, 0x1818},103	{0x004b, 0x00c0},104	{0x004c, 0x0000},105	{0x004d, 0x0000},106	{0x0061, 0x00c0},107	{0x0062, 0x008a},108	{0x0063, 0x0800},109	{0x0064, 0x0000},110	{0x0065, 0x0000},111	{0x0066, 0x0030},112	{0x0067, 0x000c},113	{0x0068, 0x0000},114	{0x0069, 0x0000},115	{0x006a, 0x0000},116	{0x006b, 0x0000},117	{0x006c, 0x0000},118	{0x006d, 0x2200},119	{0x006e, 0x0810},120	{0x006f, 0xe4de},121	{0x0070, 0x3320},122	{0x0071, 0x0000},123	{0x0073, 0x0000},124	{0x0074, 0x0000},125	{0x0075, 0x0002},126	{0x0076, 0x0001},127	{0x0079, 0x0000},128	{0x007a, 0x0000},129	{0x007b, 0x0000},130	{0x007c, 0x0100},131	{0x007e, 0x0000},132	{0x007f, 0x0000},133	{0x0080, 0x0000},134	{0x0083, 0x0000},135	{0x0084, 0x0000},136	{0x0085, 0x0000},137	{0x0086, 0x0005},138	{0x0087, 0x0000},139	{0x0088, 0x0000},140	{0x008c, 0x0003},141	{0x008e, 0x0060},142	{0x008f, 0x4da1},143	{0x0091, 0x1c15},144	{0x0092, 0x0425},145	{0x0093, 0x0000},146	{0x0094, 0x0080},147	{0x0095, 0x008f},148	{0x0096, 0x0000},149	{0x0097, 0x0000},150	{0x0098, 0x0000},151	{0x0099, 0x0000},152	{0x009a, 0x0000},153	{0x009b, 0x0000},154	{0x009c, 0x0000},155	{0x009d, 0x0000},156	{0x009e, 0x0000},157	{0x009f, 0x0009},158	{0x00a0, 0x0000},159	{0x00a3, 0x0002},160	{0x00a4, 0x0001},161	{0x00b6, 0x0000},162	{0x00b7, 0x0000},163	{0x00b8, 0x0000},164	{0x00b9, 0x0002},165	{0x00be, 0x0000},166	{0x00c0, 0x0160},167	{0x00c1, 0x82a0},168	{0x00c2, 0x0000},169	{0x00d0, 0x0000},170	{0x00d2, 0x3300},171	{0x00d3, 0x2200},172	{0x00d4, 0x0000},173	{0x00d9, 0x0000},174	{0x00da, 0x0000},175	{0x00db, 0x0000},176	{0x00dc, 0x00c0},177	{0x00dd, 0x2220},178	{0x00de, 0x3131},179	{0x00df, 0x3131},180	{0x00e0, 0x3131},181	{0x00e2, 0x0000},182	{0x00e3, 0x4000},183	{0x00e4, 0x0aa0},184	{0x00e5, 0x3131},185	{0x00e6, 0x3131},186	{0x00e7, 0x3131},187	{0x00e8, 0x3131},188	{0x00ea, 0xb320},189	{0x00eb, 0x0000},190	{0x00f0, 0x0000},191	{0x00f6, 0x0000},192	{0x00fa, 0x0000},193	{0x00fb, 0x0000},194	{0x00fc, 0x0000},195	{0x00fd, 0x0000},196	{0x00fe, 0x10ec},197	{0x00ff, 0x6749},198	{0x0100, 0xa000},199	{0x010b, 0x0066},200	{0x010c, 0x6666},201	{0x010d, 0x2202},202	{0x010e, 0x6666},203	{0x010f, 0xa800},204	{0x0110, 0x0006},205	{0x0111, 0x0460},206	{0x0112, 0x2000},207	{0x0113, 0x0200},208	{0x0117, 0x8000},209	{0x0118, 0x0303},210	{0x0125, 0x0020},211	{0x0132, 0x5026},212	{0x0136, 0x8000},213	{0x0139, 0x0005},214	{0x013a, 0x3030},215	{0x013b, 0xa000},216	{0x013c, 0x4110},217	{0x013f, 0x0000},218	{0x0145, 0x0022},219	{0x0146, 0x0000},220	{0x0147, 0x0000},221	{0x0148, 0x0000},222	{0x0156, 0x0022},223	{0x0157, 0x0303},224	{0x0158, 0x2222},225	{0x0159, 0x0000},226	{0x0160, 0x4ec0},227	{0x0161, 0x0080},228	{0x0162, 0x0200},229	{0x0163, 0x0800},230	{0x0164, 0x0000},231	{0x0165, 0x0000},232	{0x0166, 0x0000},233	{0x0167, 0x000f},234	{0x0168, 0x000f},235	{0x0169, 0x0001},236	{0x0190, 0x4131},237	{0x0194, 0x0000},238	{0x0195, 0x0000},239	{0x0197, 0x0022},240	{0x0198, 0x0000},241	{0x0199, 0x0000},242	{0x01ac, 0x0000},243	{0x01ad, 0x0000},244	{0x01ae, 0x0000},245	{0x01af, 0x2000},246	{0x01b0, 0x0000},247	{0x01b1, 0x0000},248	{0x01b2, 0x0000},249	{0x01b3, 0x0017},250	{0x01b4, 0x004b},251	{0x01b5, 0x0000},252	{0x01b6, 0x03e8},253	{0x01b7, 0x0000},254	{0x01b8, 0x0000},255	{0x01b9, 0x0400},256	{0x01ba, 0xb5b6},257	{0x01bb, 0x9124},258	{0x01bc, 0x4924},259	{0x01bd, 0x0009},260	{0x01be, 0x0018},261	{0x01bf, 0x002a},262	{0x01c0, 0x004c},263	{0x01c1, 0x0097},264	{0x01c2, 0x01c3},265	{0x01c3, 0x03e9},266	{0x01c4, 0x1389},267	{0x01c5, 0xc351},268	{0x01c6, 0x02a0},269	{0x01c7, 0x0b0f},270	{0x01c8, 0x402f},271	{0x01c9, 0x0702},272	{0x01ca, 0x0000},273	{0x01cb, 0x0000},274	{0x01cc, 0x5757},275	{0x01cd, 0x5757},276	{0x01ce, 0x5757},277	{0x01cf, 0x5757},278	{0x01d0, 0x5757},279	{0x01d1, 0x5757},280	{0x01d2, 0x5757},281	{0x01d3, 0x5757},282	{0x01d4, 0x5757},283	{0x01d5, 0x5757},284	{0x01d6, 0x0000},285	{0x01d7, 0x0000},286	{0x01d8, 0x0162},287	{0x01d9, 0x0007},288	{0x01da, 0x0000},289	{0x01db, 0x0004},290	{0x01dc, 0x0000},291	{0x01de, 0x7c00},292	{0x01df, 0x0020},293	{0x01e0, 0x04c1},294	{0x01e1, 0x0000},295	{0x01e2, 0x0000},296	{0x01e3, 0x0000},297	{0x01e4, 0x0000},298	{0x01e5, 0x0000},299	{0x01e6, 0x0001},300	{0x01e7, 0x0000},301	{0x01e8, 0x0000},302	{0x01eb, 0x0000},303	{0x01ec, 0x0000},304	{0x01ed, 0x0000},305	{0x01ee, 0x0000},306	{0x01ef, 0x0000},307	{0x01f0, 0x0000},308	{0x01f1, 0x0000},309	{0x01f2, 0x0000},310	{0x01f3, 0x0000},311	{0x01f4, 0x0000},312	{0x0210, 0x6297},313	{0x0211, 0xa004},314	{0x0212, 0x0365},315	{0x0213, 0xf7ff},316	{0x0214, 0xf24c},317	{0x0215, 0x0102},318	{0x0216, 0x00a3},319	{0x0217, 0x0048},320	{0x0218, 0xa2c0},321	{0x0219, 0x0400},322	{0x021a, 0x00c8},323	{0x021b, 0x00c0},324	{0x021c, 0x0000},325	{0x021d, 0x024c},326	{0x02fa, 0x0000},327	{0x02fb, 0x0000},328	{0x02fc, 0x0000},329	{0x03fe, 0x0000},330	{0x03ff, 0x0000},331	{0x0500, 0x0000},332	{0x0600, 0x0000},333	{0x0610, 0x6666},334	{0x0611, 0xa9aa},335	{0x0620, 0x6666},336	{0x0621, 0xa9aa},337	{0x0630, 0x6666},338	{0x0631, 0xa9aa},339	{0x0640, 0x6666},340	{0x0641, 0xa9aa},341	{0x07fa, 0x0000},342	{0x08fa, 0x0000},343	{0x08fb, 0x0000},344	{0x0d00, 0x0000},345	{0x1100, 0x0000},346	{0x1101, 0x0000},347	{0x1102, 0x0000},348	{0x1103, 0x0000},349	{0x1104, 0x0000},350	{0x1105, 0x0000},351	{0x1106, 0x0000},352	{0x1107, 0x0000},353	{0x1108, 0x0000},354	{0x1109, 0x0000},355	{0x110a, 0x0000},356	{0x110b, 0x0000},357	{0x110c, 0x0000},358	{0x1111, 0x0000},359	{0x1112, 0x0000},360	{0x1113, 0x0000},361	{0x1114, 0x0000},362	{0x1115, 0x0000},363	{0x1116, 0x0000},364	{0x1117, 0x0000},365	{0x1118, 0x0000},366	{0x1119, 0x0000},367	{0x111a, 0x0000},368	{0x111b, 0x0000},369	{0x111c, 0x0000},370	{0x1401, 0x0404},371	{0x1402, 0x0007},372	{0x1403, 0x0365},373	{0x1404, 0x0210},374	{0x1405, 0x0365},375	{0x1406, 0x0210},376	{0x1407, 0x0000},377	{0x1408, 0x0000},378	{0x1409, 0x0000},379	{0x140a, 0x0000},380	{0x140b, 0x0000},381	{0x140c, 0x0000},382	{0x140d, 0x0000},383	{0x140e, 0x0000},384	{0x140f, 0x0000},385	{0x1410, 0x0000},386	{0x1411, 0x0000},387	{0x1801, 0x0004},388	{0x1802, 0x0000},389	{0x1803, 0x0000},390	{0x1804, 0x0000},391	{0x1805, 0x00ff},392	{0x2c00, 0x0000},393	{0x3400, 0x0200},394	{0x3404, 0x0000},395	{0x3405, 0x0000},396	{0x3406, 0x0000},397	{0x3407, 0x0000},398	{0x3408, 0x0000},399	{0x3409, 0x0000},400	{0x340a, 0x0000},401	{0x340b, 0x0000},402	{0x340c, 0x0000},403	{0x340d, 0x0000},404	{0x340e, 0x0000},405	{0x340f, 0x0000},406	{0x3410, 0x0000},407	{0x3411, 0x0000},408	{0x3412, 0x0000},409	{0x3413, 0x0000},410	{0x3414, 0x0000},411	{0x3415, 0x0000},412	{0x3424, 0x0000},413	{0x3425, 0x0000},414	{0x3426, 0x0000},415	{0x3427, 0x0000},416	{0x3428, 0x0000},417	{0x3429, 0x0000},418	{0x342a, 0x0000},419	{0x342b, 0x0000},420	{0x342c, 0x0000},421	{0x342d, 0x0000},422	{0x342e, 0x0000},423	{0x342f, 0x0000},424	{0x3430, 0x0000},425	{0x3431, 0x0000},426	{0x3432, 0x0000},427	{0x3433, 0x0000},428	{0x3434, 0x0000},429	{0x3435, 0x0000},430	{0x3440, 0x6319},431	{0x3441, 0x3771},432	{0x3500, 0x0002},433	{0x3501, 0x5728},434	{0x3b00, 0x3010},435	{0x3b01, 0x3300},436	{0x3b02, 0x2200},437	{0x3b03, 0x0100},438};439 440static bool rt5682s_volatile_register(struct device *dev, unsigned int reg)441{442	switch (reg) {443	case RT5682S_RESET:444	case RT5682S_CBJ_CTRL_2:445	case RT5682S_I2S1_F_DIV_CTRL_2:446	case RT5682S_I2S2_F_DIV_CTRL_2:447	case RT5682S_INT_ST_1:448	case RT5682S_GPIO_ST:449	case RT5682S_IL_CMD_1:450	case RT5682S_4BTN_IL_CMD_1:451	case RT5682S_AJD1_CTRL:452	case RT5682S_VERSION_ID...RT5682S_DEVICE_ID:453	case RT5682S_STO_NG2_CTRL_1:454	case RT5682S_STO_NG2_CTRL_5...RT5682S_STO_NG2_CTRL_7:455	case RT5682S_STO1_DAC_SIL_DET:456	case RT5682S_HP_IMP_SENS_CTRL_1...RT5682S_HP_IMP_SENS_CTRL_4:457	case RT5682S_HP_IMP_SENS_CTRL_13:458	case RT5682S_HP_IMP_SENS_CTRL_14:459	case RT5682S_HP_IMP_SENS_CTRL_43...RT5682S_HP_IMP_SENS_CTRL_46:460	case RT5682S_HP_CALIB_CTRL_1:461	case RT5682S_HP_CALIB_CTRL_10:462	case RT5682S_HP_CALIB_ST_1...RT5682S_HP_CALIB_ST_11:463	case RT5682S_SAR_IL_CMD_2...RT5682S_SAR_IL_CMD_5:464	case RT5682S_SAR_IL_CMD_10:465	case RT5682S_SAR_IL_CMD_11:466	case RT5682S_VERSION_ID_HIDE:467	case RT5682S_VERSION_ID_CUS:468	case RT5682S_I2C_TRANS_CTRL:469	case RT5682S_DMIC_FLOAT_DET:470	case RT5682S_HA_CMP_OP_1:471	case RT5682S_NEW_CBJ_DET_CTL_10...RT5682S_NEW_CBJ_DET_CTL_16:472	case RT5682S_CLK_SW_TEST_1:473	case RT5682S_CLK_SW_TEST_2:474	case RT5682S_EFUSE_READ_1...RT5682S_EFUSE_READ_18:475	case RT5682S_PILOT_DIG_CTL_1:476		return true;477	default:478		return false;479	}480}481 482static bool rt5682s_readable_register(struct device *dev, unsigned int reg)483{484	switch (reg) {485	case RT5682S_RESET:486	case RT5682S_VERSION_ID:487	case RT5682S_VENDOR_ID:488	case RT5682S_DEVICE_ID:489	case RT5682S_HP_CTRL_1:490	case RT5682S_HP_CTRL_2:491	case RT5682S_HPL_GAIN:492	case RT5682S_HPR_GAIN:493	case RT5682S_I2C_CTRL:494	case RT5682S_CBJ_BST_CTRL:495	case RT5682S_CBJ_DET_CTRL:496	case RT5682S_CBJ_CTRL_1...RT5682S_CBJ_CTRL_8:497	case RT5682S_DAC1_DIG_VOL:498	case RT5682S_STO1_ADC_DIG_VOL:499	case RT5682S_STO1_ADC_BOOST:500	case RT5682S_HP_IMP_GAIN_1:501	case RT5682S_HP_IMP_GAIN_2:502	case RT5682S_SIDETONE_CTRL:503	case RT5682S_STO1_ADC_MIXER:504	case RT5682S_AD_DA_MIXER:505	case RT5682S_STO1_DAC_MIXER:506	case RT5682S_A_DAC1_MUX:507	case RT5682S_DIG_INF2_DATA:508	case RT5682S_REC_MIXER:509	case RT5682S_CAL_REC:510	case RT5682S_HP_ANA_OST_CTRL_1...RT5682S_HP_ANA_OST_CTRL_3:511	case RT5682S_PWR_DIG_1...RT5682S_PWR_MIXER:512	case RT5682S_MB_CTRL:513	case RT5682S_CLK_GATE_TCON_1...RT5682S_CLK_GATE_TCON_3:514	case RT5682S_CLK_DET...RT5682S_LPF_AD_DMIC:515	case RT5682S_I2S1_SDP:516	case RT5682S_I2S2_SDP:517	case RT5682S_ADDA_CLK_1:518	case RT5682S_ADDA_CLK_2:519	case RT5682S_I2S1_F_DIV_CTRL_1:520	case RT5682S_I2S1_F_DIV_CTRL_2:521	case RT5682S_TDM_CTRL:522	case RT5682S_TDM_ADDA_CTRL_1:523	case RT5682S_TDM_ADDA_CTRL_2:524	case RT5682S_DATA_SEL_CTRL_1:525	case RT5682S_TDM_TCON_CTRL_1:526	case RT5682S_TDM_TCON_CTRL_2:527	case RT5682S_GLB_CLK:528	case RT5682S_PLL_TRACK_1...RT5682S_PLL_TRACK_6:529	case RT5682S_PLL_TRACK_11:530	case RT5682S_DEPOP_1:531	case RT5682S_HP_CHARGE_PUMP_1:532	case RT5682S_HP_CHARGE_PUMP_2:533	case RT5682S_HP_CHARGE_PUMP_3:534	case RT5682S_MICBIAS_1...RT5682S_MICBIAS_3:535	case RT5682S_PLL_TRACK_12...RT5682S_PLL_CTRL_7:536	case RT5682S_RC_CLK_CTRL:537	case RT5682S_I2S2_M_CLK_CTRL_1:538	case RT5682S_I2S2_F_DIV_CTRL_1:539	case RT5682S_I2S2_F_DIV_CTRL_2:540	case RT5682S_IRQ_CTRL_1...RT5682S_IRQ_CTRL_4:541	case RT5682S_INT_ST_1:542	case RT5682S_GPIO_CTRL_1:543	case RT5682S_GPIO_CTRL_2:544	case RT5682S_GPIO_ST:545	case RT5682S_HP_AMP_DET_CTRL_1:546	case RT5682S_MID_HP_AMP_DET:547	case RT5682S_LOW_HP_AMP_DET:548	case RT5682S_DELAY_BUF_CTRL:549	case RT5682S_SV_ZCD_1:550	case RT5682S_SV_ZCD_2:551	case RT5682S_IL_CMD_1...RT5682S_IL_CMD_6:552	case RT5682S_4BTN_IL_CMD_1...RT5682S_4BTN_IL_CMD_7:553	case RT5682S_ADC_STO1_HP_CTRL_1:554	case RT5682S_ADC_STO1_HP_CTRL_2:555	case RT5682S_AJD1_CTRL:556	case RT5682S_JD_CTRL_1:557	case RT5682S_DUMMY_1...RT5682S_DUMMY_3:558	case RT5682S_DAC_ADC_DIG_VOL1:559	case RT5682S_BIAS_CUR_CTRL_2...RT5682S_BIAS_CUR_CTRL_10:560	case RT5682S_VREF_REC_OP_FB_CAP_CTRL_1:561	case RT5682S_VREF_REC_OP_FB_CAP_CTRL_2:562	case RT5682S_CHARGE_PUMP_1:563	case RT5682S_DIG_IN_CTRL_1:564	case RT5682S_PAD_DRIVING_CTRL:565	case RT5682S_CHOP_DAC_1:566	case RT5682S_CHOP_DAC_2:567	case RT5682S_CHOP_ADC:568	case RT5682S_CALIB_ADC_CTRL:569	case RT5682S_VOL_TEST:570	case RT5682S_SPKVDD_DET_ST:571	case RT5682S_TEST_MODE_CTRL_1...RT5682S_TEST_MODE_CTRL_4:572	case RT5682S_PLL_INTERNAL_1...RT5682S_PLL_INTERNAL_4:573	case RT5682S_STO_NG2_CTRL_1...RT5682S_STO_NG2_CTRL_10:574	case RT5682S_STO1_DAC_SIL_DET:575	case RT5682S_SIL_PSV_CTRL1:576	case RT5682S_SIL_PSV_CTRL2:577	case RT5682S_SIL_PSV_CTRL3:578	case RT5682S_SIL_PSV_CTRL4:579	case RT5682S_SIL_PSV_CTRL5:580	case RT5682S_HP_IMP_SENS_CTRL_1...RT5682S_HP_IMP_SENS_CTRL_46:581	case RT5682S_HP_LOGIC_CTRL_1...RT5682S_HP_LOGIC_CTRL_3:582	case RT5682S_HP_CALIB_CTRL_1...RT5682S_HP_CALIB_CTRL_11:583	case RT5682S_HP_CALIB_ST_1...RT5682S_HP_CALIB_ST_11:584	case RT5682S_SAR_IL_CMD_1...RT5682S_SAR_IL_CMD_14:585	case RT5682S_DUMMY_4...RT5682S_DUMMY_6:586	case RT5682S_VERSION_ID_HIDE:587	case RT5682S_VERSION_ID_CUS:588	case RT5682S_SCAN_CTL:589	case RT5682S_HP_AMP_DET:590	case RT5682S_BIAS_CUR_CTRL_11:591	case RT5682S_BIAS_CUR_CTRL_12:592	case RT5682S_BIAS_CUR_CTRL_13:593	case RT5682S_BIAS_CUR_CTRL_14:594	case RT5682S_BIAS_CUR_CTRL_15:595	case RT5682S_BIAS_CUR_CTRL_16:596	case RT5682S_BIAS_CUR_CTRL_17:597	case RT5682S_BIAS_CUR_CTRL_18:598	case RT5682S_I2C_TRANS_CTRL:599	case RT5682S_DUMMY_7:600	case RT5682S_DUMMY_8:601	case RT5682S_DMIC_FLOAT_DET:602	case RT5682S_HA_CMP_OP_1...RT5682S_HA_CMP_OP_13:603	case RT5682S_HA_CMP_OP_14...RT5682S_HA_CMP_OP_25:604	case RT5682S_NEW_CBJ_DET_CTL_1...RT5682S_NEW_CBJ_DET_CTL_16:605	case RT5682S_DA_FILTER_1...RT5682S_DA_FILTER_5:606	case RT5682S_CLK_SW_TEST_1:607	case RT5682S_CLK_SW_TEST_2:608	case RT5682S_CLK_SW_TEST_3...RT5682S_CLK_SW_TEST_14:609	case RT5682S_EFUSE_MANU_WRITE_1...RT5682S_EFUSE_MANU_WRITE_6:610	case RT5682S_EFUSE_READ_1...RT5682S_EFUSE_READ_18:611	case RT5682S_EFUSE_TIMING_CTL_1:612	case RT5682S_EFUSE_TIMING_CTL_2:613	case RT5682S_PILOT_DIG_CTL_1:614	case RT5682S_PILOT_DIG_CTL_2:615	case RT5682S_HP_AMP_DET_CTL_1...RT5682S_HP_AMP_DET_CTL_4:616		return true;617	default:618		return false;619	}620}621 622static void rt5682s_reset(struct rt5682s_priv *rt5682s)623{624	regmap_write(rt5682s->regmap, RT5682S_RESET, 0);625}626 627static int rt5682s_button_detect(struct snd_soc_component *component)628{629	int btn_type, val;630 631	val = snd_soc_component_read(component, RT5682S_4BTN_IL_CMD_1);632	btn_type = val & 0xfff0;633	snd_soc_component_write(component, RT5682S_4BTN_IL_CMD_1, val);634	dev_dbg(component->dev, "%s btn_type=%x\n", __func__, btn_type);635	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_2,636		RT5682S_SAR_ADC_PSV_MASK, RT5682S_SAR_ADC_PSV_ENTRY);637 638	return btn_type;639}640 641enum {642	SAR_PWR_OFF,643	SAR_PWR_NORMAL,644	SAR_PWR_SAVING,645};646 647static void rt5682s_sar_power_mode(struct snd_soc_component *component, int mode)648{649	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);650 651	mutex_lock(&rt5682s->sar_mutex);652 653	switch (mode) {654	case SAR_PWR_SAVING:655		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,656			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_DIS);657		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,658			RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK,659			RT5682S_CTRL_MB1_REG | RT5682S_CTRL_MB2_REG);660		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,661			RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |662			RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS |663			RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU);664		usleep_range(5000, 5500);665		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,666			RT5682S_SAR_BUTDET_MASK, RT5682S_SAR_BUTDET_EN);667		usleep_range(5000, 5500);668		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_2,669			RT5682S_SAR_ADC_PSV_MASK, RT5682S_SAR_ADC_PSV_ENTRY);670		break;671	case SAR_PWR_NORMAL:672		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,673			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_EN);674		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,675			RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK,676			RT5682S_CTRL_MB1_FSM | RT5682S_CTRL_MB2_FSM);677		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,678			RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_SEL_MB1_2_AUTO);679		usleep_range(5000, 5500);680		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,681			RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK,682			RT5682S_SAR_BUTDET_EN | RT5682S_SAR_BUTDET_POW_NORM);683		break;684	case SAR_PWR_OFF:685		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,686			RT5682S_MB1_PATH_MASK | RT5682S_MB2_PATH_MASK,687			RT5682S_CTRL_MB1_FSM | RT5682S_CTRL_MB2_FSM);688		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,689			RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |690			RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS |691			RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU);692		break;693	default:694		dev_err(component->dev, "Invalid SAR Power mode: %d\n", mode);695		break;696	}697 698	mutex_unlock(&rt5682s->sar_mutex);699}700 701static void rt5682s_enable_push_button_irq(struct snd_soc_component *component)702{703	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_13,704		RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_BTN);705	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,706		RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |707		RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_EN |708		RT5682S_SAR_BUTDET_POW_NORM | RT5682S_SAR_SEL_MB1_2_AUTO);709	snd_soc_component_write(component, RT5682S_IL_CMD_1, 0x0040);710	snd_soc_component_update_bits(component, RT5682S_4BTN_IL_CMD_2,711		RT5682S_4BTN_IL_MASK | RT5682S_4BTN_IL_RST_MASK,712		RT5682S_4BTN_IL_EN | RT5682S_4BTN_IL_NOR);713	snd_soc_component_update_bits(component, RT5682S_IRQ_CTRL_3,714		RT5682S_IL_IRQ_MASK, RT5682S_IL_IRQ_EN);715}716 717static void rt5682s_disable_push_button_irq(struct snd_soc_component *component)718{719	snd_soc_component_update_bits(component, RT5682S_IRQ_CTRL_3,720		RT5682S_IL_IRQ_MASK, RT5682S_IL_IRQ_DIS);721	snd_soc_component_update_bits(component, RT5682S_4BTN_IL_CMD_2,722		RT5682S_4BTN_IL_MASK, RT5682S_4BTN_IL_DIS);723	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_13,724		RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_TYPE);725	snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,726		RT5682S_SAR_BUTDET_MASK | RT5682S_SAR_BUTDET_POW_MASK |727		RT5682S_SAR_SEL_MB1_2_CTL_MASK, RT5682S_SAR_BUTDET_DIS |728		RT5682S_SAR_BUTDET_POW_SAV | RT5682S_SAR_SEL_MB1_2_MANU);729}730 731/**732 * rt5682s_headset_detect - Detect headset.733 * @component: SoC audio component device.734 * @jack_insert: Jack insert or not.735 *736 * Detect whether is headset or not when jack inserted.737 *738 * Returns detect status.739 */740static int rt5682s_headset_detect(struct snd_soc_component *component, int jack_insert)741{742	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);743	unsigned int val, count;744	int jack_type = 0;745 746	if (jack_insert) {747		rt5682s_disable_push_button_irq(component);748		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,749			RT5682S_PWR_VREF1 | RT5682S_PWR_VREF2 | RT5682S_PWR_MB,750			RT5682S_PWR_VREF1 | RT5682S_PWR_VREF2 | RT5682S_PWR_MB);751		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,752			RT5682S_PWR_FV1 | RT5682S_PWR_FV2, 0);753		usleep_range(15000, 20000);754		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,755			RT5682S_PWR_FV1 | RT5682S_PWR_FV2,756			RT5682S_PWR_FV1 | RT5682S_PWR_FV2);757		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,758			RT5682S_PWR_CBJ, RT5682S_PWR_CBJ);759		snd_soc_component_write(component, RT5682S_SAR_IL_CMD_3, 0x0365);760		snd_soc_component_update_bits(component, RT5682S_HP_CHARGE_PUMP_2,761			RT5682S_OSW_L_MASK | RT5682S_OSW_R_MASK,762			RT5682S_OSW_L_DIS | RT5682S_OSW_R_DIS);763		snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_13,764			RT5682S_SAR_SOUR_MASK, RT5682S_SAR_SOUR_TYPE);765		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,766			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_EN);767		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,768			RT5682S_TRIG_JD_MASK, RT5682S_TRIG_JD_LOW);769		usleep_range(45000, 50000);770		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,771			RT5682S_TRIG_JD_MASK, RT5682S_TRIG_JD_HIGH);772 773		count = 0;774		do {775			usleep_range(10000, 15000);776			val = snd_soc_component_read(component, RT5682S_CBJ_CTRL_2)777				& RT5682S_JACK_TYPE_MASK;778			count++;779		} while (val == 0 && count < 50);780 781		dev_dbg(component->dev, "%s, val=%d, count=%d\n", __func__, val, count);782 783		switch (val) {784		case 0x1:785		case 0x2:786			jack_type = SND_JACK_HEADSET;787			snd_soc_component_write(component, RT5682S_SAR_IL_CMD_3, 0x024c);788			snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,789				RT5682S_FAST_OFF_MASK, RT5682S_FAST_OFF_EN);790			snd_soc_component_update_bits(component, RT5682S_SAR_IL_CMD_1,791				RT5682S_SAR_SEL_MB1_2_MASK, val << RT5682S_SAR_SEL_MB1_2_SFT);792			rt5682s_enable_push_button_irq(component);793			rt5682s_sar_power_mode(component, SAR_PWR_SAVING);794			break;795		default:796			jack_type = SND_JACK_HEADPHONE;797			break;798		}799		snd_soc_component_update_bits(component, RT5682S_HP_CHARGE_PUMP_2,800			RT5682S_OSW_L_MASK | RT5682S_OSW_R_MASK,801			RT5682S_OSW_L_EN | RT5682S_OSW_R_EN);802		usleep_range(35000, 40000);803	} else {804		rt5682s_sar_power_mode(component, SAR_PWR_OFF);805		rt5682s_disable_push_button_irq(component);806		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,807			RT5682S_TRIG_JD_MASK, RT5682S_TRIG_JD_LOW);808 809		if (!rt5682s->wclk_enabled) {810			snd_soc_component_update_bits(component,811				RT5682S_PWR_ANLG_1, RT5682S_PWR_VREF2 | RT5682S_PWR_MB, 0);812		}813 814		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,815			RT5682S_PWR_CBJ, 0);816		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_1,817			RT5682S_FAST_OFF_MASK, RT5682S_FAST_OFF_DIS);818		snd_soc_component_update_bits(component, RT5682S_CBJ_CTRL_3,819			RT5682S_CBJ_IN_BUF_MASK, RT5682S_CBJ_IN_BUF_DIS);820		jack_type = 0;821	}822 823	dev_dbg(component->dev, "jack_type = %d\n", jack_type);824 825	return jack_type;826}827 828static void rt5682s_jack_detect_handler(struct work_struct *work)829{830	struct rt5682s_priv *rt5682s =831		container_of(work, struct rt5682s_priv, jack_detect_work.work);832	struct snd_soc_dapm_context *dapm;833	int val, btn_type;834 835	if (!rt5682s->component ||836	    !snd_soc_card_is_instantiated(rt5682s->component->card)) {837		/* card not yet ready, try later */838		mod_delayed_work(system_power_efficient_wq,839				 &rt5682s->jack_detect_work, msecs_to_jiffies(15));840		return;841	}842 843	dapm = snd_soc_component_get_dapm(rt5682s->component);844 845	snd_soc_dapm_mutex_lock(dapm);846	mutex_lock(&rt5682s->calibrate_mutex);847	mutex_lock(&rt5682s->wclk_mutex);848 849	val = snd_soc_component_read(rt5682s->component, RT5682S_AJD1_CTRL)850		& RT5682S_JDH_RS_MASK;851	if (!val) {852		/* jack in */853		if (rt5682s->jack_type == 0) {854			/* jack was out, report jack type */855			rt5682s->jack_type = rt5682s_headset_detect(rt5682s->component, 1);856			rt5682s->irq_work_delay_time = 0;857		} else if ((rt5682s->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {858			/* jack is already in, report button event */859			rt5682s->jack_type = SND_JACK_HEADSET;860			btn_type = rt5682s_button_detect(rt5682s->component);861			/**862			 * rt5682s can report three kinds of button behavior,863			 * one click, double click and hold. However,864			 * currently we will report button pressed/released865			 * event. So all the three button behaviors are866			 * treated as button pressed.867			 */868			switch (btn_type) {869			case 0x8000:870			case 0x4000:871			case 0x2000:872				rt5682s->jack_type |= SND_JACK_BTN_0;873				break;874			case 0x1000:875			case 0x0800:876			case 0x0400:877				rt5682s->jack_type |= SND_JACK_BTN_1;878				break;879			case 0x0200:880			case 0x0100:881			case 0x0080:882				rt5682s->jack_type |= SND_JACK_BTN_2;883				break;884			case 0x0040:885			case 0x0020:886			case 0x0010:887				rt5682s->jack_type |= SND_JACK_BTN_3;888				break;889			case 0x0000: /* unpressed */890				break;891			default:892				dev_err(rt5682s->component->dev,893					"Unexpected button code 0x%04x\n", btn_type);894				break;895			}896		}897	} else {898		/* jack out */899		rt5682s->jack_type = rt5682s_headset_detect(rt5682s->component, 0);900		rt5682s->irq_work_delay_time = 50;901	}902 903	mutex_unlock(&rt5682s->wclk_mutex);904	mutex_unlock(&rt5682s->calibrate_mutex);905	snd_soc_dapm_mutex_unlock(dapm);906 907	snd_soc_jack_report(rt5682s->hs_jack, rt5682s->jack_type,908		SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |909		SND_JACK_BTN_2 | SND_JACK_BTN_3);910 911	if (rt5682s->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |912		SND_JACK_BTN_2 | SND_JACK_BTN_3))913		schedule_delayed_work(&rt5682s->jd_check_work, 0);914	else915		cancel_delayed_work_sync(&rt5682s->jd_check_work);916}917 918static void rt5682s_jd_check_handler(struct work_struct *work)919{920	struct rt5682s_priv *rt5682s =921		container_of(work, struct rt5682s_priv, jd_check_work.work);922 923	if (snd_soc_component_read(rt5682s->component, RT5682S_AJD1_CTRL) & RT5682S_JDH_RS_MASK) {924		/* jack out */925		schedule_delayed_work(&rt5682s->jack_detect_work, 0);926	} else {927		schedule_delayed_work(&rt5682s->jd_check_work, 500);928	}929}930 931static irqreturn_t rt5682s_irq(int irq, void *data)932{933	struct rt5682s_priv *rt5682s = data;934 935	mod_delayed_work(system_power_efficient_wq, &rt5682s->jack_detect_work,936		msecs_to_jiffies(rt5682s->irq_work_delay_time));937 938	return IRQ_HANDLED;939}940 941static int rt5682s_set_jack_detect(struct snd_soc_component *component,942		struct snd_soc_jack *hs_jack, void *data)943{944	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);945	int btndet_delay = 16;946 947	rt5682s->hs_jack = hs_jack;948 949	if (!hs_jack) {950		regmap_update_bits(rt5682s->regmap, RT5682S_IRQ_CTRL_2,951			RT5682S_JD1_EN_MASK, RT5682S_JD1_DIS);952		regmap_update_bits(rt5682s->regmap, RT5682S_RC_CLK_CTRL,953			RT5682S_POW_JDH, 0);954		cancel_delayed_work_sync(&rt5682s->jack_detect_work);955 956		return 0;957	}958 959	switch (rt5682s->pdata.jd_src) {960	case RT5682S_JD1:961		regmap_update_bits(rt5682s->regmap, RT5682S_CBJ_CTRL_5,962			RT5682S_JD_FAST_OFF_SRC_MASK, RT5682S_JD_FAST_OFF_SRC_JDH);963		regmap_update_bits(rt5682s->regmap, RT5682S_CBJ_CTRL_2,964			RT5682S_EXT_JD_SRC, RT5682S_EXT_JD_SRC_MANUAL);965		regmap_update_bits(rt5682s->regmap, RT5682S_CBJ_CTRL_1,966			RT5682S_EMB_JD_MASK | RT5682S_DET_TYPE |967			RT5682S_POL_FAST_OFF_MASK | RT5682S_MIC_CAP_MASK,968			RT5682S_EMB_JD_EN | RT5682S_DET_TYPE |969			RT5682S_POL_FAST_OFF_HIGH | RT5682S_MIC_CAP_HS);970		regmap_update_bits(rt5682s->regmap, RT5682S_SAR_IL_CMD_1,971			RT5682S_SAR_POW_MASK, RT5682S_SAR_POW_EN);972		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,973			RT5682S_GP1_PIN_MASK, RT5682S_GP1_PIN_IRQ);974		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_ANLG_3,975			RT5682S_PWR_BGLDO, RT5682S_PWR_BGLDO);976		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_ANLG_2,977			RT5682S_PWR_JD_MASK, RT5682S_PWR_JD_ENABLE);978		regmap_update_bits(rt5682s->regmap, RT5682S_RC_CLK_CTRL,979			RT5682S_POW_IRQ | RT5682S_POW_JDH, RT5682S_POW_IRQ | RT5682S_POW_JDH);980		regmap_update_bits(rt5682s->regmap, RT5682S_IRQ_CTRL_2,981			RT5682S_JD1_EN_MASK | RT5682S_JD1_POL_MASK,982			RT5682S_JD1_EN | RT5682S_JD1_POL_NOR);983		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_4,984			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,985			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));986		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_5,987			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,988			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));989		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_6,990			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,991			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));992		regmap_update_bits(rt5682s->regmap, RT5682S_4BTN_IL_CMD_7,993			RT5682S_4BTN_IL_HOLD_WIN_MASK | RT5682S_4BTN_IL_CLICK_WIN_MASK,994			(btndet_delay << RT5682S_4BTN_IL_HOLD_WIN_SFT | btndet_delay));995 996		mod_delayed_work(system_power_efficient_wq,997			&rt5682s->jack_detect_work, msecs_to_jiffies(250));998		break;999 1000	case RT5682S_JD_NULL:1001		regmap_update_bits(rt5682s->regmap, RT5682S_IRQ_CTRL_2,1002			RT5682S_JD1_EN_MASK, RT5682S_JD1_DIS);1003		regmap_update_bits(rt5682s->regmap, RT5682S_RC_CLK_CTRL,1004			RT5682S_POW_JDH, 0);1005		break;1006 1007	default:1008		dev_warn(component->dev, "Wrong JD source\n");1009		break;1010	}1011 1012	return 0;1013}1014 1015static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -9562, 75, 0);1016static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);1017static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);1018static const DECLARE_TLV_DB_SCALE(cbj_bst_tlv, -1200, 150, 0);1019 1020static const struct snd_kcontrol_new rt5682s_snd_controls[] = {1021	/* DAC Digital Volume */1022	SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5682S_DAC1_DIG_VOL,1023		RT5682S_L_VOL_SFT + 1, RT5682S_R_VOL_SFT + 1, 127, 0, dac_vol_tlv),1024 1025	/* CBJ Boost Volume */1026	SOC_SINGLE_TLV("CBJ Boost Volume", RT5682S_REC_MIXER,1027		RT5682S_BST_CBJ_SFT, 35, 0,  cbj_bst_tlv),1028 1029	/* ADC Digital Volume Control */1030	SOC_DOUBLE("STO1 ADC Capture Switch", RT5682S_STO1_ADC_DIG_VOL,1031		RT5682S_L_MUTE_SFT, RT5682S_R_MUTE_SFT, 1, 1),1032	SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5682S_STO1_ADC_DIG_VOL,1033		RT5682S_L_VOL_SFT + 1, RT5682S_R_VOL_SFT + 1, 63, 0, adc_vol_tlv),1034 1035	/* ADC Boost Volume Control */1036	SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5682S_STO1_ADC_BOOST,1037		RT5682S_STO1_ADC_L_BST_SFT, RT5682S_STO1_ADC_R_BST_SFT, 3, 0, adc_bst_tlv),1038};1039 1040/**1041 * rt5682s_sel_asrc_clk_src - select ASRC clock source for a set of filters1042 * @component: SoC audio component device.1043 * @filter_mask: mask of filters.1044 * @clk_src: clock source1045 *1046 * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5682S can1047 * only support standard 32fs or 64fs i2s format, ASRC should be enabled to1048 * support special i2s clock format such as Intel's 100fs(100 * sampling rate).1049 * ASRC function will track i2s clock and generate a corresponding system clock1050 * for codec. This function provides an API to select the clock source for a1051 * set of filters specified by the mask. And the component driver will turn on1052 * ASRC for these filters if ASRC is selected as their clock source.1053 */1054int rt5682s_sel_asrc_clk_src(struct snd_soc_component *component,1055		unsigned int filter_mask, unsigned int clk_src)1056{1057	switch (clk_src) {1058	case RT5682S_CLK_SEL_SYS:1059	case RT5682S_CLK_SEL_I2S1_ASRC:1060	case RT5682S_CLK_SEL_I2S2_ASRC:1061		break;1062 1063	default:1064		return -EINVAL;1065	}1066 1067	if (filter_mask & RT5682S_DA_STEREO1_FILTER) {1068		snd_soc_component_update_bits(component, RT5682S_PLL_TRACK_2,1069			RT5682S_FILTER_CLK_SEL_MASK, clk_src << RT5682S_FILTER_CLK_SEL_SFT);1070	}1071 1072	if (filter_mask & RT5682S_AD_STEREO1_FILTER) {1073		snd_soc_component_update_bits(component, RT5682S_PLL_TRACK_3,1074			RT5682S_FILTER_CLK_SEL_MASK, clk_src << RT5682S_FILTER_CLK_SEL_SFT);1075	}1076 1077	snd_soc_component_update_bits(component, RT5682S_PLL_TRACK_11,1078		RT5682S_ASRCIN_AUTO_CLKOUT_MASK, RT5682S_ASRCIN_AUTO_CLKOUT_EN);1079 1080	return 0;1081}1082EXPORT_SYMBOL_GPL(rt5682s_sel_asrc_clk_src);1083 1084static int rt5682s_div_sel(struct rt5682s_priv *rt5682s,1085		int target, const int div[], int size)1086{1087	int i;1088 1089	if (rt5682s->sysclk < target) {1090		dev_err(rt5682s->component->dev,1091			"sysclk rate %d is too low\n", rt5682s->sysclk);1092		return 0;1093	}1094 1095	for (i = 0; i < size - 1; i++) {1096		dev_dbg(rt5682s->component->dev, "div[%d]=%d\n", i, div[i]);1097		if (target * div[i] == rt5682s->sysclk)1098			return i;1099		if (target * div[i + 1] > rt5682s->sysclk) {1100			dev_dbg(rt5682s->component->dev,1101				"can't find div for sysclk %d\n", rt5682s->sysclk);1102			return i;1103		}1104	}1105 1106	if (target * div[i] < rt5682s->sysclk)1107		dev_err(rt5682s->component->dev,1108			"sysclk rate %d is too high\n", rt5682s->sysclk);1109 1110	return size - 1;1111}1112 1113static int get_clk_info(int sclk, int rate)1114{1115	int i;1116	static const int pd[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};1117 1118	if (sclk <= 0 || rate <= 0)1119		return -EINVAL;1120 1121	rate = rate << 8;1122	for (i = 0; i < ARRAY_SIZE(pd); i++)1123		if (sclk == rate * pd[i])1124			return i;1125 1126	return -EINVAL;1127}1128 1129/**1130 * set_dmic_clk - Set parameter of dmic.1131 *1132 * @w: DAPM widget.1133 * @kcontrol: The kcontrol of this widget.1134 * @event: Event id.1135 *1136 * Choose dmic clock between 1MHz and 3MHz.1137 * It is better for clock to approximate 3MHz.1138 */1139static int set_dmic_clk(struct snd_soc_dapm_widget *w,1140		struct snd_kcontrol *kcontrol, int event)1141{1142	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1143	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1144	int idx, dmic_clk_rate = 3072000;1145	static const int div[] = {2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128};1146 1147	if (rt5682s->pdata.dmic_clk_rate)1148		dmic_clk_rate = rt5682s->pdata.dmic_clk_rate;1149 1150	idx = rt5682s_div_sel(rt5682s, dmic_clk_rate, div, ARRAY_SIZE(div));1151 1152	snd_soc_component_update_bits(component, RT5682S_DMIC_CTRL_1,1153		RT5682S_DMIC_CLK_MASK, idx << RT5682S_DMIC_CLK_SFT);1154 1155	return 0;1156}1157 1158 1159static int rt5682s_set_pllb_power(struct rt5682s_priv *rt5682s, int on)1160{1161	struct snd_soc_component *component = rt5682s->component;1162 1163	if (on) {1164		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,1165			RT5682S_PWR_LDO_PLLB | RT5682S_PWR_BIAS_PLLB | RT5682S_PWR_PLLB,1166			RT5682S_PWR_LDO_PLLB | RT5682S_PWR_BIAS_PLLB | RT5682S_PWR_PLLB);1167		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,1168			RT5682S_RSTB_PLLB, RT5682S_RSTB_PLLB);1169	} else {1170		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_3,1171			RT5682S_PWR_LDO_PLLB | RT5682S_PWR_BIAS_PLLB |1172			RT5682S_RSTB_PLLB | RT5682S_PWR_PLLB, 0);1173	}1174 1175	return 0;1176}1177 1178static int set_pllb_event(struct snd_soc_dapm_widget *w,1179		struct snd_kcontrol *kcontrol, int event)1180{1181	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1182	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1183	int on = 0;1184 1185	if (rt5682s->wclk_enabled)1186		return 0;1187 1188	if (SND_SOC_DAPM_EVENT_ON(event))1189		on = 1;1190 1191	rt5682s_set_pllb_power(rt5682s, on);1192 1193	return 0;1194}1195 1196static void rt5682s_set_filter_clk(struct rt5682s_priv *rt5682s, int reg, int ref)1197{1198	struct snd_soc_component *component = rt5682s->component;1199	int idx;1200	static const int div_f[] = {1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48};1201	static const int div_o[] = {1, 2, 4, 6, 8, 12, 16, 24, 32, 48};1202 1203	idx = rt5682s_div_sel(rt5682s, ref, div_f, ARRAY_SIZE(div_f));1204 1205	snd_soc_component_update_bits(component, reg,1206		RT5682S_FILTER_CLK_DIV_MASK, idx << RT5682S_FILTER_CLK_DIV_SFT);1207 1208	/* select over sample rate */1209	for (idx = 0; idx < ARRAY_SIZE(div_o); idx++) {1210		if (rt5682s->sysclk <= 12288000 * div_o[idx])1211			break;1212	}1213 1214	snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_1,1215		RT5682S_ADC_OSR_MASK | RT5682S_DAC_OSR_MASK,1216		(idx << RT5682S_ADC_OSR_SFT) | (idx << RT5682S_DAC_OSR_SFT));1217}1218 1219static int set_filter_clk(struct snd_soc_dapm_widget *w,1220		struct snd_kcontrol *kcontrol, int event)1221{1222	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1223	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1224	int ref, reg, val;1225 1226	val = snd_soc_component_read(component, RT5682S_GPIO_CTRL_1)1227			& RT5682S_GP4_PIN_MASK;1228 1229	if (w->shift == RT5682S_PWR_ADC_S1F_BIT && val == RT5682S_GP4_PIN_ADCDAT2)1230		ref = 256 * rt5682s->lrck[RT5682S_AIF2];1231	else1232		ref = 256 * rt5682s->lrck[RT5682S_AIF1];1233 1234	if (w->shift == RT5682S_PWR_ADC_S1F_BIT)1235		reg = RT5682S_PLL_TRACK_3;1236	else1237		reg = RT5682S_PLL_TRACK_2;1238 1239	rt5682s_set_filter_clk(rt5682s, reg, ref);1240 1241	return 0;1242}1243 1244static int set_dmic_power(struct snd_soc_dapm_widget *w,1245		struct snd_kcontrol *kcontrol, int event)1246{1247	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1248	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1249	unsigned int delay = 50, val;1250 1251	if (rt5682s->pdata.dmic_delay)1252		delay = rt5682s->pdata.dmic_delay;1253 1254	switch (event) {1255	case SND_SOC_DAPM_POST_PMU:1256		val = (snd_soc_component_read(component, RT5682S_GLB_CLK)1257			& RT5682S_SCLK_SRC_MASK) >> RT5682S_SCLK_SRC_SFT;1258		if (val == RT5682S_CLK_SRC_PLL1 || val == RT5682S_CLK_SRC_PLL2)1259			snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,1260				RT5682S_PWR_VREF2 | RT5682S_PWR_MB,1261				RT5682S_PWR_VREF2 | RT5682S_PWR_MB);1262 1263		/*Add delay to avoid pop noise*/1264		msleep(delay);1265		break;1266 1267	case SND_SOC_DAPM_POST_PMD:1268		if (!rt5682s->jack_type && !rt5682s->wclk_enabled) {1269			snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,1270				RT5682S_PWR_VREF2 | RT5682S_PWR_MB, 0);1271		}1272		break;1273	}1274 1275	return 0;1276}1277 1278static void rt5682s_set_i2s(struct rt5682s_priv *rt5682s, int id, int on)1279{1280	struct snd_soc_component *component = rt5682s->component;1281	int pre_div;1282	unsigned int p_reg, p_mask, p_sft;1283	unsigned int c_reg, c_mask, c_sft;1284 1285	if (id == RT5682S_AIF1) {1286		c_reg = RT5682S_ADDA_CLK_1;1287		c_mask = RT5682S_I2S_M_D_MASK;1288		c_sft = RT5682S_I2S_M_D_SFT;1289		p_reg = RT5682S_PWR_DIG_1;1290		p_mask = RT5682S_PWR_I2S1;1291		p_sft = RT5682S_PWR_I2S1_BIT;1292	} else {1293		c_reg = RT5682S_I2S2_M_CLK_CTRL_1;1294		c_mask = RT5682S_I2S2_M_D_MASK;1295		c_sft = RT5682S_I2S2_M_D_SFT;1296		p_reg = RT5682S_PWR_DIG_1;1297		p_mask = RT5682S_PWR_I2S2;1298		p_sft = RT5682S_PWR_I2S2_BIT;1299	}1300 1301	if (on && rt5682s->master[id]) {1302		pre_div = get_clk_info(rt5682s->sysclk, rt5682s->lrck[id]);1303		if (pre_div < 0) {1304			dev_err(component->dev, "get pre_div failed\n");1305			return;1306		}1307 1308		dev_dbg(component->dev, "lrck is %dHz and pre_div is %d for iis %d master\n",1309			rt5682s->lrck[id], pre_div, id);1310		snd_soc_component_update_bits(component, c_reg, c_mask, pre_div << c_sft);1311	}1312 1313	snd_soc_component_update_bits(component, p_reg, p_mask, on << p_sft);1314}1315 1316static int set_i2s_event(struct snd_soc_dapm_widget *w,1317		struct snd_kcontrol *kcontrol, int event)1318{1319	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1320	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1321	int on = 0;1322 1323	if (SND_SOC_DAPM_EVENT_ON(event))1324		on = 1;1325 1326	if (!snd_soc_dapm_widget_name_cmp(w, "I2S1") && !rt5682s->wclk_enabled)1327		rt5682s_set_i2s(rt5682s, RT5682S_AIF1, on);1328	else if (!snd_soc_dapm_widget_name_cmp(w, "I2S2"))1329		rt5682s_set_i2s(rt5682s, RT5682S_AIF2, on);1330 1331	return 0;1332}1333 1334static int is_sys_clk_from_plla(struct snd_soc_dapm_widget *w,1335		struct snd_soc_dapm_widget *sink)1336{1337	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1338	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1339 1340	if ((rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL1) ||1341	    (rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL2 && rt5682s->pll_comb == USE_PLLAB))1342		return 1;1343 1344	return 0;1345}1346 1347static int is_sys_clk_from_pllb(struct snd_soc_dapm_widget *w,1348		struct snd_soc_dapm_widget *sink)1349{1350	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1351	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1352 1353	if (rt5682s->sysclk_src == RT5682S_CLK_SRC_PLL2)1354		return 1;1355 1356	return 0;1357}1358 1359static int is_using_asrc(struct snd_soc_dapm_widget *w,1360		struct snd_soc_dapm_widget *sink)1361{1362	unsigned int reg, sft, val;1363	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1364 1365	switch (w->shift) {1366	case RT5682S_ADC_STO1_ASRC_SFT:1367		reg = RT5682S_PLL_TRACK_3;1368		sft = RT5682S_FILTER_CLK_SEL_SFT;1369		break;1370	case RT5682S_DAC_STO1_ASRC_SFT:1371		reg = RT5682S_PLL_TRACK_2;1372		sft = RT5682S_FILTER_CLK_SEL_SFT;1373		break;1374	default:1375		return 0;1376	}1377 1378	val = (snd_soc_component_read(component, reg) >> sft) & 0xf;1379	switch (val) {1380	case RT5682S_CLK_SEL_I2S1_ASRC:1381	case RT5682S_CLK_SEL_I2S2_ASRC:1382		return 1;1383	default:1384		return 0;1385	}1386}1387 1388static int rt5682s_hp_amp_event(struct snd_soc_dapm_widget *w,1389		struct snd_kcontrol *kcontrol, int event)1390{1391	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1392 1393	switch (event) {1394	case SND_SOC_DAPM_POST_PMU:1395		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,1396			RT5682S_OUT_HP_L_EN | RT5682S_OUT_HP_R_EN,1397			RT5682S_OUT_HP_L_EN | RT5682S_OUT_HP_R_EN);1398		usleep_range(15000, 20000);1399		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,1400			RT5682S_LDO_PUMP_EN | RT5682S_PUMP_EN |1401			RT5682S_CAPLESS_L_EN | RT5682S_CAPLESS_R_EN,1402			RT5682S_LDO_PUMP_EN | RT5682S_PUMP_EN |1403			RT5682S_CAPLESS_L_EN | RT5682S_CAPLESS_R_EN);1404		snd_soc_component_write(component, RT5682S_BIAS_CUR_CTRL_11, 0x6666);1405		snd_soc_component_write(component, RT5682S_BIAS_CUR_CTRL_12, 0xa82a);1406 1407		snd_soc_component_update_bits(component, RT5682S_HP_CTRL_2,1408			RT5682S_HPO_L_PATH_MASK | RT5682S_HPO_R_PATH_MASK |1409			RT5682S_HPO_SEL_IP_EN_SW, RT5682S_HPO_L_PATH_EN |1410			RT5682S_HPO_R_PATH_EN | RT5682S_HPO_IP_EN_GATING);1411		usleep_range(5000, 10000);1412		snd_soc_component_update_bits(component, RT5682S_HP_AMP_DET_CTL_1,1413			RT5682S_CP_SW_SIZE_MASK, RT5682S_CP_SW_SIZE_L | RT5682S_CP_SW_SIZE_S);1414		break;1415 1416	case SND_SOC_DAPM_POST_PMD:1417		snd_soc_component_update_bits(component, RT5682S_HP_CTRL_2,1418			RT5682S_HPO_L_PATH_MASK | RT5682S_HPO_R_PATH_MASK |1419			RT5682S_HPO_SEL_IP_EN_SW, 0);1420		snd_soc_component_update_bits(component, RT5682S_HP_AMP_DET_CTL_1,1421			RT5682S_CP_SW_SIZE_MASK, RT5682S_CP_SW_SIZE_M);1422		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,1423			RT5682S_LDO_PUMP_EN | RT5682S_PUMP_EN |1424			RT5682S_CAPLESS_L_EN | RT5682S_CAPLESS_R_EN, 0);1425		snd_soc_component_update_bits(component, RT5682S_DEPOP_1,1426			RT5682S_OUT_HP_L_EN | RT5682S_OUT_HP_R_EN, 0);1427		break;1428	}1429 1430	return 0;1431}1432 1433static int rt5682s_stereo1_adc_mixl_event(struct snd_soc_dapm_widget *w,1434		struct snd_kcontrol *kcontrol, int event)1435{1436	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1437	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1438	unsigned int delay = 0;1439 1440	if (rt5682s->pdata.amic_delay)1441		delay = rt5682s->pdata.amic_delay;1442 1443	switch (event) {1444	case SND_SOC_DAPM_POST_PMU:1445		msleep(delay);1446		snd_soc_component_update_bits(component, RT5682S_STO1_ADC_DIG_VOL,1447			RT5682S_L_MUTE, 0);1448		break;1449	case SND_SOC_DAPM_PRE_PMD:1450		snd_soc_component_update_bits(component, RT5682S_STO1_ADC_DIG_VOL,1451			RT5682S_L_MUTE, RT5682S_L_MUTE);1452		break;1453	}1454 1455	return 0;1456}1457 1458static int sar_power_event(struct snd_soc_dapm_widget *w,1459		struct snd_kcontrol *kcontrol, int event)1460{1461	struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);1462	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);1463 1464	if ((rt5682s->jack_type & SND_JACK_HEADSET) != SND_JACK_HEADSET)1465		return 0;1466 1467	switch (event) {1468	case SND_SOC_DAPM_PRE_PMU:1469		rt5682s_sar_power_mode(component, SAR_PWR_NORMAL);1470		break;1471	case SND_SOC_DAPM_POST_PMD:1472		rt5682s_sar_power_mode(component, SAR_PWR_SAVING);1473		break;1474	}1475 1476	return 0;1477}1478 1479/* Interface data select */1480static const char * const rt5682s_data_select[] = {1481	"L/R", "R/L", "L/L", "R/R"1482};1483 1484static SOC_ENUM_SINGLE_DECL(rt5682s_if2_adc_enum, RT5682S_DIG_INF2_DATA,1485	RT5682S_IF2_ADC_SEL_SFT, rt5682s_data_select);1486 1487static SOC_ENUM_SINGLE_DECL(rt5682s_if1_01_adc_enum, RT5682S_TDM_ADDA_CTRL_1,1488	RT5682S_IF1_ADC1_SEL_SFT, rt5682s_data_select);1489 1490static SOC_ENUM_SINGLE_DECL(rt5682s_if1_23_adc_enum, RT5682S_TDM_ADDA_CTRL_1,1491	RT5682S_IF1_ADC2_SEL_SFT, rt5682s_data_select);1492 1493static SOC_ENUM_SINGLE_DECL(rt5682s_if1_45_adc_enum, RT5682S_TDM_ADDA_CTRL_1,1494	RT5682S_IF1_ADC3_SEL_SFT, rt5682s_data_select);1495 1496static SOC_ENUM_SINGLE_DECL(rt5682s_if1_67_adc_enum, RT5682S_TDM_ADDA_CTRL_1,1497	RT5682S_IF1_ADC4_SEL_SFT, rt5682s_data_select);1498 1499static const struct snd_kcontrol_new rt5682s_if2_adc_swap_mux =1500	SOC_DAPM_ENUM("IF2 ADC Swap Mux", rt5682s_if2_adc_enum);1501 1502static const struct snd_kcontrol_new rt5682s_if1_01_adc_swap_mux =1503	SOC_DAPM_ENUM("IF1 01 ADC Swap Mux", rt5682s_if1_01_adc_enum);1504 1505static const struct snd_kcontrol_new rt5682s_if1_23_adc_swap_mux =1506	SOC_DAPM_ENUM("IF1 23 ADC Swap Mux", rt5682s_if1_23_adc_enum);1507 1508static const struct snd_kcontrol_new rt5682s_if1_45_adc_swap_mux =1509	SOC_DAPM_ENUM("IF1 45 ADC Swap Mux", rt5682s_if1_45_adc_enum);1510 1511static const struct snd_kcontrol_new rt5682s_if1_67_adc_swap_mux =1512	SOC_DAPM_ENUM("IF1 67 ADC Swap Mux", rt5682s_if1_67_adc_enum);1513 1514/* Digital Mixer */1515static const struct snd_kcontrol_new rt5682s_sto1_adc_l_mix[] = {1516	SOC_DAPM_SINGLE("ADC1 Switch", RT5682S_STO1_ADC_MIXER,1517			RT5682S_M_STO1_ADC_L1_SFT, 1, 1),1518	SOC_DAPM_SINGLE("ADC2 Switch", RT5682S_STO1_ADC_MIXER,1519			RT5682S_M_STO1_ADC_L2_SFT, 1, 1),1520};1521 1522static const struct snd_kcontrol_new rt5682s_sto1_adc_r_mix[] = {1523	SOC_DAPM_SINGLE("ADC1 Switch", RT5682S_STO1_ADC_MIXER,1524			RT5682S_M_STO1_ADC_R1_SFT, 1, 1),1525	SOC_DAPM_SINGLE("ADC2 Switch", RT5682S_STO1_ADC_MIXER,1526			RT5682S_M_STO1_ADC_R2_SFT, 1, 1),1527};1528 1529static const struct snd_kcontrol_new rt5682s_dac_l_mix[] = {1530	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682S_AD_DA_MIXER,1531			RT5682S_M_ADCMIX_L_SFT, 1, 1),1532	SOC_DAPM_SINGLE("DAC1 Switch", RT5682S_AD_DA_MIXER,1533			RT5682S_M_DAC1_L_SFT, 1, 1),1534};1535 1536static const struct snd_kcontrol_new rt5682s_dac_r_mix[] = {1537	SOC_DAPM_SINGLE("Stereo ADC Switch", RT5682S_AD_DA_MIXER,1538			RT5682S_M_ADCMIX_R_SFT, 1, 1),1539	SOC_DAPM_SINGLE("DAC1 Switch", RT5682S_AD_DA_MIXER,1540			RT5682S_M_DAC1_R_SFT, 1, 1),1541};1542 1543static const struct snd_kcontrol_new rt5682s_sto1_dac_l_mix[] = {1544	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682S_STO1_DAC_MIXER,1545			RT5682S_M_DAC_L1_STO_L_SFT, 1, 1),1546	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682S_STO1_DAC_MIXER,1547			RT5682S_M_DAC_R1_STO_L_SFT, 1, 1),1548};1549 1550static const struct snd_kcontrol_new rt5682s_sto1_dac_r_mix[] = {1551	SOC_DAPM_SINGLE("DAC L1 Switch", RT5682S_STO1_DAC_MIXER,1552			RT5682S_M_DAC_L1_STO_R_SFT, 1, 1),1553	SOC_DAPM_SINGLE("DAC R1 Switch", RT5682S_STO1_DAC_MIXER,1554			RT5682S_M_DAC_R1_STO_R_SFT, 1, 1),1555};1556 1557/* Analog Input Mixer */1558static const struct snd_kcontrol_new rt5682s_rec1_l_mix[] = {1559	SOC_DAPM_SINGLE("CBJ Switch", RT5682S_REC_MIXER,1560			RT5682S_M_CBJ_RM1_L_SFT, 1, 1),1561};1562 1563static const struct snd_kcontrol_new rt5682s_rec1_r_mix[] = {1564	SOC_DAPM_SINGLE("CBJ Switch", RT5682S_REC_MIXER,1565			RT5682S_M_CBJ_RM1_R_SFT, 1, 1),1566};1567 1568/* STO1 ADC1 Source */1569/* MX-26 [13] [5] */1570static const char * const rt5682s_sto1_adc1_src[] = {1571	"DAC MIX", "ADC"1572};1573 1574static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc1l_enum, RT5682S_STO1_ADC_MIXER,1575	RT5682S_STO1_ADC1L_SRC_SFT, rt5682s_sto1_adc1_src);1576 1577static const struct snd_kcontrol_new rt5682s_sto1_adc1l_mux =1578	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682s_sto1_adc1l_enum);1579 1580static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc1r_enum, RT5682S_STO1_ADC_MIXER,1581	RT5682S_STO1_ADC1R_SRC_SFT, rt5682s_sto1_adc1_src);1582 1583static const struct snd_kcontrol_new rt5682s_sto1_adc1r_mux =1584	SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5682s_sto1_adc1r_enum);1585 1586/* STO1 ADC Source */1587/* MX-26 [11:10] [3:2] */1588static const char * const rt5682s_sto1_adc_src[] = {1589	"ADC1 L", "ADC1 R"1590};1591 1592static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adcl_enum, RT5682S_STO1_ADC_MIXER,1593	RT5682S_STO1_ADCL_SRC_SFT, rt5682s_sto1_adc_src);1594 1595static const struct snd_kcontrol_new rt5682s_sto1_adcl_mux =1596	SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5682s_sto1_adcl_enum);1597 1598static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adcr_enum, RT5682S_STO1_ADC_MIXER,1599	RT5682S_STO1_ADCR_SRC_SFT, rt5682s_sto1_adc_src);1600 1601static const struct snd_kcontrol_new rt5682s_sto1_adcr_mux =1602	SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5682s_sto1_adcr_enum);1603 1604/* STO1 ADC2 Source */1605/* MX-26 [12] [4] */1606static const char * const rt5682s_sto1_adc2_src[] = {1607	"DAC MIX", "DMIC"1608};1609 1610static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc2l_enum, RT5682S_STO1_ADC_MIXER,1611	RT5682S_STO1_ADC2L_SRC_SFT, rt5682s_sto1_adc2_src);1612 1613static const struct snd_kcontrol_new rt5682s_sto1_adc2l_mux =1614	SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5682s_sto1_adc2l_enum);1615 1616static SOC_ENUM_SINGLE_DECL(rt5682s_sto1_adc2r_enum, RT5682S_STO1_ADC_MIXER,1617	RT5682S_STO1_ADC2R_SRC_SFT, rt5682s_sto1_adc2_src);1618 1619static const struct snd_kcontrol_new rt5682s_sto1_adc2r_mux =1620	SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5682s_sto1_adc2r_enum);1621 1622/* MX-79 [6:4] I2S1 ADC data location */1623static const unsigned int rt5682s_if1_adc_slot_values[] = {1624	0, 2, 4, 6,1625};1626 1627static const char * const rt5682s_if1_adc_slot_src[] = {1628	"Slot 0", "Slot 2", "Slot 4", "Slot 6"1629};1630 1631static SOC_VALUE_ENUM_SINGLE_DECL(rt5682s_if1_adc_slot_enum,1632	RT5682S_TDM_CTRL, RT5682S_TDM_ADC_LCA_SFT, RT5682S_TDM_ADC_LCA_MASK,1633	rt5682s_if1_adc_slot_src, rt5682s_if1_adc_slot_values);1634 1635static const struct snd_kcontrol_new rt5682s_if1_adc_slot_mux =1636	SOC_DAPM_ENUM("IF1 ADC Slot location", rt5682s_if1_adc_slot_enum);1637 1638/* Analog DAC L1 Source, Analog DAC R1 Source*/1639/* MX-2B [4], MX-2B [0]*/1640static const char * const rt5682s_alg_dac1_src[] = {1641	"Stereo1 DAC Mixer", "DAC1"1642};1643 1644static SOC_ENUM_SINGLE_DECL(rt5682s_alg_dac_l1_enum, RT5682S_A_DAC1_MUX,1645	RT5682S_A_DACL1_SFT, rt5682s_alg_dac1_src);1646 1647static const struct snd_kcontrol_new rt5682s_alg_dac_l1_mux =1648	SOC_DAPM_ENUM("Analog DAC L1 Source", rt5682s_alg_dac_l1_enum);1649 1650static SOC_ENUM_SINGLE_DECL(rt5682s_alg_dac_r1_enum, RT5682S_A_DAC1_MUX,1651	RT5682S_A_DACR1_SFT, rt5682s_alg_dac1_src);1652 1653static const struct snd_kcontrol_new rt5682s_alg_dac_r1_mux =1654	SOC_DAPM_ENUM("Analog DAC R1 Source", rt5682s_alg_dac_r1_enum);1655 1656static const unsigned int rt5682s_adcdat_pin_values[] = {1657	1, 3,1658};1659 1660static const char * const rt5682s_adcdat_pin_select[] = {1661	"ADCDAT1", "ADCDAT2",1662};1663 1664static SOC_VALUE_ENUM_SINGLE_DECL(rt5682s_adcdat_pin_enum,1665	RT5682S_GPIO_CTRL_1, RT5682S_GP4_PIN_SFT, RT5682S_GP4_PIN_MASK,1666	rt5682s_adcdat_pin_select, rt5682s_adcdat_pin_values);1667 1668static const struct snd_kcontrol_new rt5682s_adcdat_pin_ctrl =1669	SOC_DAPM_ENUM("ADCDAT", rt5682s_adcdat_pin_enum);1670 1671static const struct snd_soc_dapm_widget rt5682s_dapm_widgets[] = {1672	SND_SOC_DAPM_SUPPLY("LDO MB1", RT5682S_PWR_ANLG_3,1673		RT5682S_PWR_LDO_MB1_BIT, 0, NULL, 0),1674	SND_SOC_DAPM_SUPPLY("LDO MB2", RT5682S_PWR_ANLG_3,1675		RT5682S_PWR_LDO_MB2_BIT, 0, NULL, 0),1676	SND_SOC_DAPM_SUPPLY("LDO", RT5682S_PWR_ANLG_3,1677		RT5682S_PWR_LDO_BIT, 0, NULL, 0),1678 1679	/* PLL Powers */1680	SND_SOC_DAPM_SUPPLY_S("PLLA_LDO", 0, RT5682S_PWR_ANLG_3,1681		RT5682S_PWR_LDO_PLLA_BIT, 0, NULL, 0),1682	SND_SOC_DAPM_SUPPLY_S("PLLA_BIAS", 0, RT5682S_PWR_ANLG_3,1683		RT5682S_PWR_BIAS_PLLA_BIT, 0, NULL, 0),1684	SND_SOC_DAPM_SUPPLY_S("PLLA", 0, RT5682S_PWR_ANLG_3,1685		RT5682S_PWR_PLLA_BIT, 0, NULL, 0),1686	SND_SOC_DAPM_SUPPLY_S("PLLA_RST", 1, RT5682S_PWR_ANLG_3,1687		RT5682S_RSTB_PLLA_BIT, 0, NULL, 0),1688	SND_SOC_DAPM_SUPPLY("PLLB", SND_SOC_NOPM, 0, 0,1689		set_pllb_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1690 1691	/* ASRC */1692	SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5682S_PLL_TRACK_1,1693		RT5682S_DAC_STO1_ASRC_SFT, 0, NULL, 0),1694	SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5682S_PLL_TRACK_1,1695		RT5682S_ADC_STO1_ASRC_SFT, 0, NULL, 0),1696	SND_SOC_DAPM_SUPPLY_S("AD ASRC", 1, RT5682S_PLL_TRACK_1,1697		RT5682S_AD_ASRC_SFT, 0, NULL, 0),1698	SND_SOC_DAPM_SUPPLY_S("DA ASRC", 1, RT5682S_PLL_TRACK_1,1699		RT5682S_DA_ASRC_SFT, 0, NULL, 0),1700	SND_SOC_DAPM_SUPPLY_S("DMIC ASRC", 1, RT5682S_PLL_TRACK_1,1701		RT5682S_DMIC_ASRC_SFT, 0, NULL, 0),1702 1703	/* Input Side */1704	SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5682S_PWR_ANLG_2,1705		RT5682S_PWR_MB1_BIT, 0, NULL, 0),1706	SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5682S_PWR_ANLG_2,1707		RT5682S_PWR_MB2_BIT, 0, NULL, 0),1708 1709	/* Input Lines */1710	SND_SOC_DAPM_INPUT("DMIC L1"),1711	SND_SOC_DAPM_INPUT("DMIC R1"),1712 1713	SND_SOC_DAPM_INPUT("IN1P"),1714 1715	SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,1716		set_dmic_clk, SND_SOC_DAPM_PRE_PMU),1717	SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5682S_DMIC_CTRL_1, RT5682S_DMIC_1_EN_SFT, 0,1718		set_dmic_power, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),1719 1720	/* Boost */1721	SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 0, 0, NULL, 0),1722 1723	/* REC Mixer */1724	SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5682s_rec1_l_mix,1725		ARRAY_SIZE(rt5682s_rec1_l_mix)),1726	SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, rt5682s_rec1_r_mix,1727		ARRAY_SIZE(rt5682s_rec1_r_mix)),1728	SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5682S_CAL_REC,1729		RT5682S_PWR_RM1_L_BIT, 0, NULL, 0),1730	SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5682S_CAL_REC,1731		RT5682S_PWR_RM1_R_BIT, 0, NULL, 0),1732 1733	/* ADCs */1734	SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),1735	SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),1736 1737	SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5682S_PWR_DIG_1,1738		RT5682S_PWR_ADC_L1_BIT, 0, NULL, 0),1739	SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5682S_PWR_DIG_1,1740		RT5682S_PWR_ADC_R1_BIT, 0, NULL, 0),1741	SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5682S_CHOP_ADC,1742		RT5682S_CKGEN_ADC1_SFT, 0, NULL, 0),1743 1744	/* ADC Mux */1745	SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,1746		&rt5682s_sto1_adc1l_mux),1747	SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,1748		&rt5682s_sto1_adc1r_mux),1749	SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,1750		&rt5682s_sto1_adc2l_mux),1751	SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,1752		&rt5682s_sto1_adc2r_mux),1753	SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,1754		&rt5682s_sto1_adcl_mux),1755	SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,1756		&rt5682s_sto1_adcr_mux),1757	SND_SOC_DAPM_MUX("IF1_ADC Mux", SND_SOC_NOPM, 0, 0,1758		&rt5682s_if1_adc_slot_mux),1759 1760	/* ADC Mixer */1761	SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5682S_PWR_DIG_2,1762		RT5682S_PWR_ADC_S1F_BIT, 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),1763	SND_SOC_DAPM_MIXER_E("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0,1764		rt5682s_sto1_adc_l_mix, ARRAY_SIZE(rt5682s_sto1_adc_l_mix),1765		rt5682s_stereo1_adc_mixl_event,1766		SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU),1767	SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5682S_STO1_ADC_DIG_VOL,1768		RT5682S_R_MUTE_SFT, 1, rt5682s_sto1_adc_r_mix,1769		ARRAY_SIZE(rt5682s_sto1_adc_r_mix)),1770 1771	/* ADC PGA */1772	SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),1773 1774	/* Digital Interface */1775	SND_SOC_DAPM_SUPPLY("I2S1", SND_SOC_NOPM, 0, 0,1776		set_i2s_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1777	SND_SOC_DAPM_SUPPLY("I2S2", SND_SOC_NOPM, 0, 0,1778		set_i2s_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1779	SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),1780	SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),1781 1782	/* Digital Interface Select */1783	SND_SOC_DAPM_MUX("IF1 01 ADC Swap Mux", SND_SOC_NOPM, 0, 0,1784		&rt5682s_if1_01_adc_swap_mux),1785	SND_SOC_DAPM_MUX("IF1 23 ADC Swap Mux", SND_SOC_NOPM, 0, 0,1786		&rt5682s_if1_23_adc_swap_mux),1787	SND_SOC_DAPM_MUX("IF1 45 ADC Swap Mux", SND_SOC_NOPM, 0, 0,1788		&rt5682s_if1_45_adc_swap_mux),1789	SND_SOC_DAPM_MUX("IF1 67 ADC Swap Mux", SND_SOC_NOPM, 0, 0,1790		&rt5682s_if1_67_adc_swap_mux),1791	SND_SOC_DAPM_MUX("IF2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,1792		&rt5682s_if2_adc_swap_mux),1793 1794	SND_SOC_DAPM_MUX("ADCDAT Mux", SND_SOC_NOPM, 0, 0, &rt5682s_adcdat_pin_ctrl),1795 1796	/* Audio Interface */1797	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, RT5682S_I2S1_SDP,1798		RT5682S_SEL_ADCDAT_SFT, 1),1799	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, RT5682S_I2S2_SDP,1800		RT5682S_I2S2_PIN_CFG_SFT, 1),1801	SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),1802 1803	/* Output Side */1804	/* DAC mixer before sound effect  */1805	SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,1806		rt5682s_dac_l_mix, ARRAY_SIZE(rt5682s_dac_l_mix)),1807	SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,1808		rt5682s_dac_r_mix, ARRAY_SIZE(rt5682s_dac_r_mix)),1809 1810	/* DAC channel Mux */1811	SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0, &rt5682s_alg_dac_l1_mux),1812	SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0, &rt5682s_alg_dac_r1_mux),1813 1814	/* DAC Mixer */1815	SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5682S_PWR_DIG_2,1816		RT5682S_PWR_DAC_S1F_BIT, 0, set_filter_clk, SND_SOC_DAPM_PRE_PMU),1817	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0,1818		rt5682s_sto1_dac_l_mix, ARRAY_SIZE(rt5682s_sto1_dac_l_mix)),1819	SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0,1820		rt5682s_sto1_dac_r_mix, ARRAY_SIZE(rt5682s_sto1_dac_r_mix)),1821 1822	/* DACs */1823	SND_SOC_DAPM_DAC("DAC L1", NULL, RT5682S_PWR_DIG_1, RT5682S_PWR_DAC_L1_BIT, 0),1824	SND_SOC_DAPM_DAC("DAC R1", NULL, RT5682S_PWR_DIG_1, RT5682S_PWR_DAC_R1_BIT, 0),1825 1826	/* HPO */1827	SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5682s_hp_amp_event,1828		SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_POST_PMU),1829 1830	/* CLK DET */1831	SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5682S_CLK_DET,1832		RT5682S_SYS_CLK_DET_SFT, 0, NULL, 0),1833	SND_SOC_DAPM_SUPPLY("CLKDET PLL1", RT5682S_CLK_DET,1834		RT5682S_PLL1_CLK_DET_SFT, 0, NULL, 0),1835	SND_SOC_DAPM_SUPPLY("MCLK0 DET PWR", RT5682S_PWR_ANLG_2,1836		RT5682S_PWR_MCLK0_WD_BIT, 0, NULL, 0),1837 1838	/* SAR */1839	SND_SOC_DAPM_SUPPLY("SAR", SND_SOC_NOPM, 0, 0, sar_power_event,1840		SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),1841 1842	/* Output Lines */1843	SND_SOC_DAPM_OUTPUT("HPOL"),1844	SND_SOC_DAPM_OUTPUT("HPOR"),1845};1846 1847static const struct snd_soc_dapm_route rt5682s_dapm_routes[] = {1848	/*PLL*/1849	{"ADC Stereo1 Filter", NULL, "PLLA", is_sys_clk_from_plla},1850	{"ADC Stereo1 Filter", NULL, "PLLB", is_sys_clk_from_pllb},1851	{"DAC Stereo1 Filter", NULL, "PLLA", is_sys_clk_from_plla},1852	{"DAC Stereo1 Filter", NULL, "PLLB", is_sys_clk_from_pllb},1853	{"PLLA", NULL, "PLLA_LDO"},1854	{"PLLA", NULL, "PLLA_BIAS"},1855	{"PLLA", NULL, "PLLA_RST"},1856 1857	/*ASRC*/1858	{"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},1859	{"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},1860	{"ADC STO1 ASRC", NULL, "AD ASRC"},1861	{"ADC STO1 ASRC", NULL, "DA ASRC"},1862	{"DAC STO1 ASRC", NULL, "AD ASRC"},1863	{"DAC STO1 ASRC", NULL, "DA ASRC"},1864 1865	{"CLKDET SYS", NULL, "MCLK0 DET PWR"},1866 1867	{"BST1 CBJ", NULL, "IN1P"},1868	{"BST1 CBJ", NULL, "SAR"},1869 1870	{"RECMIX1L", "CBJ Switch", "BST1 CBJ"},1871	{"RECMIX1L", NULL, "RECMIX1L Power"},1872	{"RECMIX1R", "CBJ Switch", "BST1 CBJ"},1873	{"RECMIX1R", NULL, "RECMIX1R Power"},1874 1875	{"ADC1 L", NULL, "RECMIX1L"},1876	{"ADC1 L", NULL, "ADC1 L Power"},1877	{"ADC1 L", NULL, "ADC1 clock"},1878	{"ADC1 R", NULL, "RECMIX1R"},1879	{"ADC1 R", NULL, "ADC1 R Power"},1880	{"ADC1 R", NULL, "ADC1 clock"},1881 1882	{"DMIC L1", NULL, "DMIC CLK"},1883	{"DMIC L1", NULL, "DMIC1 Power"},1884	{"DMIC R1", NULL, "DMIC CLK"},1885	{"DMIC R1", NULL, "DMIC1 Power"},1886	{"DMIC CLK", NULL, "DMIC ASRC"},1887 1888	{"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"},1889	{"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"},1890	{"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"},1891	{"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"},1892 1893	{"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"},1894	{"Stereo1 ADC L1 Mux", "DAC MIX", "Stereo1 DAC MIXL"},1895	{"Stereo1 ADC L2 Mux", "DMIC", "DMIC L1"},1896	{"Stereo1 ADC L2 Mux", "DAC MIX", "Stereo1 DAC MIXL"},1897 1898	{"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"},1899	{"Stereo1 ADC R1 Mux", "DAC MIX", "Stereo1 DAC MIXR"},1900	{"Stereo1 ADC R2 Mux", "DMIC", "DMIC R1"},1901	{"Stereo1 ADC R2 Mux", "DAC MIX", "Stereo1 DAC MIXR"},1902 1903	{"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"},1904	{"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"},1905	{"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"},1906 1907	{"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"},1908	{"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"},1909	{"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"},1910 1911	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"},1912	{"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"},1913 1914	{"IF1 01 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},1915	{"IF1 01 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},1916	{"IF1 01 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},1917	{"IF1 01 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},1918	{"IF1 23 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},1919	{"IF1 23 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},1920	{"IF1 23 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},1921	{"IF1 23 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},1922	{"IF1 45 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},1923	{"IF1 45 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},1924	{"IF1 45 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},1925	{"IF1 45 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},1926	{"IF1 67 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},1927	{"IF1 67 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},1928	{"IF1 67 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},1929	{"IF1 67 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},1930 1931	{"IF1_ADC Mux", "Slot 0", "IF1 01 ADC Swap Mux"},1932	{"IF1_ADC Mux", "Slot 2", "IF1 23 ADC Swap Mux"},1933	{"IF1_ADC Mux", "Slot 4", "IF1 45 ADC Swap Mux"},1934	{"IF1_ADC Mux", "Slot 6", "IF1 67 ADC Swap Mux"},1935	{"ADCDAT Mux", "ADCDAT1", "IF1_ADC Mux"},1936	{"AIF1TX", NULL, "I2S1"},1937	{"AIF1TX", NULL, "ADCDAT Mux"},1938	{"IF2 ADC Swap Mux", "L/R", "Stereo1 ADC MIX"},1939	{"IF2 ADC Swap Mux", "R/L", "Stereo1 ADC MIX"},1940	{"IF2 ADC Swap Mux", "L/L", "Stereo1 ADC MIX"},1941	{"IF2 ADC Swap Mux", "R/R", "Stereo1 ADC MIX"},1942	{"ADCDAT Mux", "ADCDAT2", "IF2 ADC Swap Mux"},1943	{"AIF2TX", NULL, "ADCDAT Mux"},1944 1945	{"IF1 DAC1 L", NULL, "AIF1RX"},1946	{"IF1 DAC1 L", NULL, "I2S1"},1947	{"IF1 DAC1 L", NULL, "DAC Stereo1 Filter"},1948	{"IF1 DAC1 R", NULL, "AIF1RX"},1949	{"IF1 DAC1 R", NULL, "I2S1"},1950	{"IF1 DAC1 R", NULL, "DAC Stereo1 Filter"},1951 1952	{"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},1953	{"DAC1 MIXL", "DAC1 Switch", "IF1 DAC1 L"},1954	{"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},1955	{"DAC1 MIXR", "DAC1 Switch", "IF1 DAC1 R"},1956 1957	{"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},1958	{"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},1959 1960	{"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},1961	{"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},1962 1963	{"DAC L1 Source", "DAC1", "DAC1 MIXL"},1964	{"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},1965	{"DAC R1 Source", "DAC1", "DAC1 MIXR"},1966	{"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},1967 1968	{"DAC L1", NULL, "DAC L1 Source"},1969	{"DAC R1", NULL, "DAC R1 Source"},1970 1971	{"HP Amp", NULL, "DAC L1"},1972	{"HP Amp", NULL, "DAC R1"},1973	{"HP Amp", NULL, "CLKDET SYS"},1974	{"HP Amp", NULL, "SAR"},1975 1976	{"HPOL", NULL, "HP Amp"},1977	{"HPOR", NULL, "HP Amp"},1978};1979 1980static int rt5682s_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,1981		unsigned int rx_mask, int slots, int slot_width)1982{1983	struct snd_soc_component *component = dai->component;1984	unsigned int cl, val = 0, tx_slotnum;1985 1986	if (tx_mask || rx_mask)1987		snd_soc_component_update_bits(component,1988			RT5682S_TDM_ADDA_CTRL_2, RT5682S_TDM_EN, RT5682S_TDM_EN);1989	else1990		snd_soc_component_update_bits(component,1991			RT5682S_TDM_ADDA_CTRL_2, RT5682S_TDM_EN, 0);1992 1993	/* Tx slot configuration */1994	tx_slotnum = hweight_long(tx_mask);1995	if (tx_slotnum) {1996		if (tx_slotnum > slots) {1997			dev_err(component->dev, "Invalid or oversized Tx slots.\n");1998			return -EINVAL;1999		}2000		val |= (tx_slotnum - 1) << RT5682S_TDM_ADC_DL_SFT;2001	}2002 2003	switch (slots) {2004	case 4:2005		val |= RT5682S_TDM_TX_CH_4;2006		val |= RT5682S_TDM_RX_CH_4;2007		break;2008	case 6:2009		val |= RT5682S_TDM_TX_CH_6;2010		val |= RT5682S_TDM_RX_CH_6;2011		break;2012	case 8:2013		val |= RT5682S_TDM_TX_CH_8;2014		val |= RT5682S_TDM_RX_CH_8;2015		break;2016	case 2:2017		break;2018	default:2019		return -EINVAL;2020	}2021 2022	snd_soc_component_update_bits(component, RT5682S_TDM_CTRL,2023		RT5682S_TDM_TX_CH_MASK | RT5682S_TDM_RX_CH_MASK |2024		RT5682S_TDM_ADC_DL_MASK, val);2025 2026	switch (slot_width) {2027	case 8:2028		if (tx_mask || rx_mask)2029			return -EINVAL;2030		cl = RT5682S_I2S1_TX_CHL_8 | RT5682S_I2S1_RX_CHL_8;2031		break;2032	case 16:2033		val = RT5682S_TDM_CL_16;2034		cl = RT5682S_I2S1_TX_CHL_16 | RT5682S_I2S1_RX_CHL_16;2035		break;2036	case 20:2037		val = RT5682S_TDM_CL_20;2038		cl = RT5682S_I2S1_TX_CHL_20 | RT5682S_I2S1_RX_CHL_20;2039		break;2040	case 24:2041		val = RT5682S_TDM_CL_24;2042		cl = RT5682S_I2S1_TX_CHL_24 | RT5682S_I2S1_RX_CHL_24;2043		break;2044	case 32:2045		val = RT5682S_TDM_CL_32;2046		cl = RT5682S_I2S1_TX_CHL_32 | RT5682S_I2S1_RX_CHL_32;2047		break;2048	default:2049		return -EINVAL;2050	}2051 2052	snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,2053		RT5682S_TDM_CL_MASK, val);2054	snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,2055		RT5682S_I2S1_TX_CHL_MASK | RT5682S_I2S1_RX_CHL_MASK, cl);2056 2057	return 0;2058}2059 2060static int rt5682s_hw_params(struct snd_pcm_substream *substream,2061		struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)2062{2063	struct snd_soc_component *component = dai->component;2064	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2065	unsigned int len_1 = 0, len_2 = 0;2066	int frame_size;2067 2068	rt5682s->lrck[dai->id] = params_rate(params);2069 2070	frame_size = snd_soc_params_to_frame_size(params);2071	if (frame_size < 0) {2072		dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);2073		return -EINVAL;2074	}2075 2076	switch (params_width(params)) {2077	case 16:2078		break;2079	case 20:2080		len_1 |= RT5682S_I2S1_DL_20;2081		len_2 |= RT5682S_I2S2_DL_20;2082		break;2083	case 24:2084		len_1 |= RT5682S_I2S1_DL_24;2085		len_2 |= RT5682S_I2S2_DL_24;2086		break;2087	case 32:2088		len_1 |= RT5682S_I2S1_DL_32;2089		len_2 |= RT5682S_I2S2_DL_24;2090		break;2091	case 8:2092		len_1 |= RT5682S_I2S2_DL_8;2093		len_2 |= RT5682S_I2S2_DL_8;2094		break;2095	default:2096		return -EINVAL;2097	}2098 2099	switch (dai->id) {2100	case RT5682S_AIF1:2101		snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,2102			RT5682S_I2S1_DL_MASK, len_1);2103		if (params_channels(params) == 1) /* mono mode */2104			snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,2105				RT5682S_I2S1_MONO_MASK, RT5682S_I2S1_MONO_EN);2106		else2107			snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,2108				RT5682S_I2S1_MONO_MASK, RT5682S_I2S1_MONO_DIS);2109		break;2110	case RT5682S_AIF2:2111		snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,2112			RT5682S_I2S2_DL_MASK, len_2);2113		if (params_channels(params) == 1) /* mono mode */2114			snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,2115				RT5682S_I2S2_MONO_MASK, RT5682S_I2S2_MONO_EN);2116		else2117			snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,2118				RT5682S_I2S2_MONO_MASK, RT5682S_I2S2_MONO_DIS);2119		break;2120	default:2121		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);2122		return -EINVAL;2123	}2124 2125	return 0;2126}2127 2128static int rt5682s_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)2129{2130	struct snd_soc_component *component = dai->component;2131	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2132	unsigned int reg_val = 0, tdm_ctrl = 0;2133 2134	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {2135	case SND_SOC_DAIFMT_CBM_CFM:2136		rt5682s->master[dai->id] = 1;2137		break;2138	case SND_SOC_DAIFMT_CBS_CFS:2139		rt5682s->master[dai->id] = 0;2140		break;2141	default:2142		return -EINVAL;2143	}2144 2145	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {2146	case SND_SOC_DAIFMT_NB_NF:2147		break;2148	case SND_SOC_DAIFMT_IB_NF:2149		reg_val |= RT5682S_I2S_BP_INV;2150		tdm_ctrl |= RT5682S_TDM_S_BP_INV;2151		break;2152	case SND_SOC_DAIFMT_NB_IF:2153		if (dai->id == RT5682S_AIF1)2154			tdm_ctrl |= RT5682S_TDM_S_LP_INV | RT5682S_TDM_M_BP_INV;2155		else2156			return -EINVAL;2157		break;2158	case SND_SOC_DAIFMT_IB_IF:2159		if (dai->id == RT5682S_AIF1)2160			tdm_ctrl |= RT5682S_TDM_S_BP_INV | RT5682S_TDM_S_LP_INV |2161				RT5682S_TDM_M_BP_INV | RT5682S_TDM_M_LP_INV;2162		else2163			return -EINVAL;2164		break;2165	default:2166		return -EINVAL;2167	}2168 2169	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {2170	case SND_SOC_DAIFMT_I2S:2171		break;2172	case SND_SOC_DAIFMT_LEFT_J:2173		reg_val |= RT5682S_I2S_DF_LEFT;2174		tdm_ctrl |= RT5682S_TDM_DF_LEFT;2175		break;2176	case SND_SOC_DAIFMT_DSP_A:2177		reg_val |= RT5682S_I2S_DF_PCM_A;2178		tdm_ctrl |= RT5682S_TDM_DF_PCM_A;2179		break;2180	case SND_SOC_DAIFMT_DSP_B:2181		reg_val |= RT5682S_I2S_DF_PCM_B;2182		tdm_ctrl |= RT5682S_TDM_DF_PCM_B;2183		break;2184	default:2185		return -EINVAL;2186	}2187 2188	switch (dai->id) {2189	case RT5682S_AIF1:2190		snd_soc_component_update_bits(component, RT5682S_I2S1_SDP,2191			RT5682S_I2S_DF_MASK, reg_val);2192		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,2193			RT5682S_TDM_MS_MASK | RT5682S_TDM_S_BP_MASK |2194			RT5682S_TDM_DF_MASK | RT5682S_TDM_M_BP_MASK |2195			RT5682S_TDM_M_LP_MASK | RT5682S_TDM_S_LP_MASK,2196			tdm_ctrl | rt5682s->master[dai->id]);2197		break;2198	case RT5682S_AIF2:2199		if (rt5682s->master[dai->id] == 0)2200			reg_val |= RT5682S_I2S2_MS_S;2201		snd_soc_component_update_bits(component, RT5682S_I2S2_SDP,2202			RT5682S_I2S2_MS_MASK | RT5682S_I2S_BP_MASK |2203			RT5682S_I2S_DF_MASK, reg_val);2204		break;2205	default:2206		dev_err(component->dev, "Invalid dai->id: %d\n", dai->id);2207		return -EINVAL;2208	}2209	return 0;2210}2211 2212static int rt5682s_set_component_sysclk(struct snd_soc_component *component,2213		int clk_id, int source, unsigned int freq, int dir)2214{2215	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2216	unsigned int src = 0;2217 2218	if (freq == rt5682s->sysclk && clk_id == rt5682s->sysclk_src)2219		return 0;2220 2221	switch (clk_id) {2222	case RT5682S_SCLK_S_MCLK:2223		src = RT5682S_CLK_SRC_MCLK;2224		break;2225	case RT5682S_SCLK_S_PLL1:2226		src = RT5682S_CLK_SRC_PLL1;2227		break;2228	case RT5682S_SCLK_S_PLL2:2229		src = RT5682S_CLK_SRC_PLL2;2230		break;2231	case RT5682S_SCLK_S_RCCLK:2232		src = RT5682S_CLK_SRC_RCCLK;2233		break;2234	default:2235		dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);2236		return -EINVAL;2237	}2238 2239	snd_soc_component_update_bits(component, RT5682S_GLB_CLK,2240		RT5682S_SCLK_SRC_MASK, src << RT5682S_SCLK_SRC_SFT);2241	snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_1,2242		RT5682S_I2S_M_CLK_SRC_MASK, src << RT5682S_I2S_M_CLK_SRC_SFT);2243	snd_soc_component_update_bits(component, RT5682S_I2S2_M_CLK_CTRL_1,2244		RT5682S_I2S2_M_CLK_SRC_MASK, src << RT5682S_I2S2_M_CLK_SRC_SFT);2245 2246	rt5682s->sysclk = freq;2247	rt5682s->sysclk_src = clk_id;2248 2249	dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n",2250		freq, clk_id);2251 2252	return 0;2253}2254 2255static const struct pll_calc_map plla_table[] = {2256	{2048000, 24576000, 0, 46, 2, true, false, false, false},2257	{256000, 24576000, 0, 382, 2, true, false, false, false},2258	{512000, 24576000, 0, 190, 2, true, false, false, false},2259	{4096000, 24576000, 0, 22, 2, true, false, false, false},2260	{1024000, 24576000, 0, 94, 2, true, false, false, false},2261	{11289600, 22579200, 1, 22, 2, false, false, false, false},2262	{1411200, 22579200, 0, 62, 2, true, false, false, false},2263	{2822400, 22579200, 0, 30, 2, true, false, false, false},2264	{12288000, 24576000, 1, 22, 2, false, false, false, false},2265	{1536000, 24576000, 0, 62, 2, true, false, false, false},2266	{3072000, 24576000, 0, 30, 2, true, false, false, false},2267	{24576000, 49152000, 4, 22, 0, false, false, false, false},2268	{3072000, 49152000, 0, 30, 0, true, false, false, false},2269	{6144000, 49152000, 0, 30, 0, false, false, false, false},2270	{49152000, 98304000, 10, 22, 0, false, true, false, false},2271	{6144000, 98304000, 0, 30, 0, false, true, false, false},2272	{12288000, 98304000, 1, 22, 0, false, true, false, false},2273	{48000000, 3840000, 10, 22, 23, false, false, false, false},2274	{24000000, 3840000, 4, 22, 23, false, false, false, false},2275	{19200000, 3840000, 3, 23, 23, false, false, false, false},2276	{38400000, 3840000, 8, 23, 23, false, false, false, false},2277};2278 2279static const struct pll_calc_map pllb_table[] = {2280	{48000000, 24576000, 8, 6, 3, false, false, false, false},2281	{48000000, 22579200, 23, 12, 3, false, false, false, true},2282	{24000000, 24576000, 3, 6, 3, false, false, false, false},2283	{24000000, 22579200, 23, 26, 3, false, false, false, true},2284	{19200000, 24576000, 2, 6, 3, false, false, false, false},2285	{19200000, 22579200, 3, 5, 3, false, false, false, true},2286	{38400000, 24576000, 6, 6, 3, false, false, false, false},2287	{38400000, 22579200, 8, 5, 3, false, false, false, true},2288	{3840000, 49152000, 0, 6, 0, true, false, false, false},2289};2290 2291static int find_pll_inter_combination(unsigned int f_in, unsigned int f_out,2292		struct pll_calc_map *a, struct pll_calc_map *b)2293{2294	int i, j;2295 2296	/* Look at PLLA table */2297	for (i = 0; i < ARRAY_SIZE(plla_table); i++) {2298		if (plla_table[i].freq_in == f_in && plla_table[i].freq_out == f_out) {2299			memcpy(a, plla_table + i, sizeof(*a));2300			return USE_PLLA;2301		}2302	}2303 2304	/* Look at PLLB table */2305	for (i = 0; i < ARRAY_SIZE(pllb_table); i++) {2306		if (pllb_table[i].freq_in == f_in && pllb_table[i].freq_out == f_out) {2307			memcpy(b, pllb_table + i, sizeof(*b));2308			return USE_PLLB;2309		}2310	}2311 2312	/* Find a combination of PLLA & PLLB */2313	for (i = ARRAY_SIZE(plla_table) - 1; i >= 0; i--) {2314		if (plla_table[i].freq_in == f_in && plla_table[i].freq_out == 3840000) {2315			for (j = ARRAY_SIZE(pllb_table) - 1; j >= 0; j--) {2316				if (pllb_table[j].freq_in == 3840000 &&2317					pllb_table[j].freq_out == f_out) {2318					memcpy(a, plla_table + i, sizeof(*a));2319					memcpy(b, pllb_table + j, sizeof(*b));2320					return USE_PLLAB;2321				}2322			}2323		}2324	}2325 2326	return -EINVAL;2327}2328 2329static int rt5682s_set_component_pll(struct snd_soc_component *component,2330		int pll_id, int source, unsigned int freq_in,2331		unsigned int freq_out)2332{2333	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2334	struct pll_calc_map a_map, b_map;2335 2336	if (source == rt5682s->pll_src[pll_id] && freq_in == rt5682s->pll_in[pll_id] &&2337	    freq_out == rt5682s->pll_out[pll_id])2338		return 0;2339 2340	if (!freq_in || !freq_out) {2341		dev_dbg(component->dev, "PLL disabled\n");2342		rt5682s->pll_in[pll_id] = 0;2343		rt5682s->pll_out[pll_id] = 0;2344		snd_soc_component_update_bits(component, RT5682S_GLB_CLK,2345			RT5682S_SCLK_SRC_MASK, RT5682S_CLK_SRC_MCLK << RT5682S_SCLK_SRC_SFT);2346		return 0;2347	}2348 2349	switch (source) {2350	case RT5682S_PLL_S_MCLK:2351		snd_soc_component_update_bits(component, RT5682S_GLB_CLK,2352			RT5682S_PLL_SRC_MASK, RT5682S_PLL_SRC_MCLK);2353		break;2354	case RT5682S_PLL_S_BCLK1:2355		snd_soc_component_update_bits(component, RT5682S_GLB_CLK,2356			RT5682S_PLL_SRC_MASK, RT5682S_PLL_SRC_BCLK1);2357		break;2358	default:2359		dev_err(component->dev, "Unknown PLL Source %d\n", source);2360		return -EINVAL;2361	}2362 2363	rt5682s->pll_comb = find_pll_inter_combination(freq_in, freq_out,2364							&a_map, &b_map);2365 2366	if ((pll_id == RT5682S_PLL1 && rt5682s->pll_comb == USE_PLLA) ||2367	    (pll_id == RT5682S_PLL2 && (rt5682s->pll_comb == USE_PLLB ||2368					rt5682s->pll_comb == USE_PLLAB))) {2369		dev_dbg(component->dev,2370			"Supported freq conversion for PLL%d:(%d->%d): %d\n",2371			pll_id + 1, freq_in, freq_out, rt5682s->pll_comb);2372	} else {2373		dev_err(component->dev,2374			"Unsupported freq conversion for PLL%d:(%d->%d): %d\n",2375			pll_id + 1, freq_in, freq_out, rt5682s->pll_comb);2376		return -EINVAL;2377	}2378 2379	if (rt5682s->pll_comb == USE_PLLA || rt5682s->pll_comb == USE_PLLAB) {2380		dev_dbg(component->dev,2381			"PLLA: fin=%d fout=%d m_bp=%d k_bp=%d m=%d n=%d k=%d\n",2382			a_map.freq_in, a_map.freq_out, a_map.m_bp, a_map.k_bp,2383			(a_map.m_bp ? 0 : a_map.m), a_map.n, (a_map.k_bp ? 0 : a_map.k));2384		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_1,2385			RT5682S_PLLA_N_MASK, a_map.n);2386		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_2,2387			RT5682S_PLLA_M_MASK | RT5682S_PLLA_K_MASK,2388			a_map.m << RT5682S_PLLA_M_SFT | a_map.k);2389		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_6,2390			RT5682S_PLLA_M_BP_MASK | RT5682S_PLLA_K_BP_MASK,2391			a_map.m_bp << RT5682S_PLLA_M_BP_SFT |2392			a_map.k_bp << RT5682S_PLLA_K_BP_SFT);2393	}2394 2395	if (rt5682s->pll_comb == USE_PLLB || rt5682s->pll_comb == USE_PLLAB) {2396		dev_dbg(component->dev,2397			"PLLB: fin=%d fout=%d m_bp=%d k_bp=%d m=%d n=%d k=%d byp_ps=%d sel_ps=%d\n",2398			b_map.freq_in, b_map.freq_out, b_map.m_bp, b_map.k_bp,2399			(b_map.m_bp ? 0 : b_map.m), b_map.n, (b_map.k_bp ? 0 : b_map.k),2400			b_map.byp_ps, b_map.sel_ps);2401		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_3,2402			RT5682S_PLLB_N_MASK, b_map.n);2403		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_4,2404			RT5682S_PLLB_M_MASK | RT5682S_PLLB_K_MASK,2405			b_map.m << RT5682S_PLLB_M_SFT | b_map.k);2406		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_6,2407			RT5682S_PLLB_SEL_PS_MASK | RT5682S_PLLB_BYP_PS_MASK |2408			RT5682S_PLLB_M_BP_MASK | RT5682S_PLLB_K_BP_MASK,2409			b_map.sel_ps << RT5682S_PLLB_SEL_PS_SFT |2410			b_map.byp_ps << RT5682S_PLLB_BYP_PS_SFT |2411			b_map.m_bp << RT5682S_PLLB_M_BP_SFT |2412			b_map.k_bp << RT5682S_PLLB_K_BP_SFT);2413	}2414 2415	if (rt5682s->pll_comb == USE_PLLB)2416		snd_soc_component_update_bits(component, RT5682S_PLL_CTRL_7,2417			RT5682S_PLLB_SRC_MASK, RT5682S_PLLB_SRC_DFIN);2418 2419	rt5682s->pll_in[pll_id] = freq_in;2420	rt5682s->pll_out[pll_id] = freq_out;2421	rt5682s->pll_src[pll_id] = source;2422 2423	return 0;2424}2425 2426static int rt5682s_set_bclk1_ratio(struct snd_soc_dai *dai,2427		unsigned int ratio)2428{2429	struct snd_soc_component *component = dai->component;2430	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2431 2432	rt5682s->bclk[dai->id] = ratio;2433 2434	switch (ratio) {2435	case 256:2436		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,2437			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_256);2438		break;2439	case 128:2440		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,2441			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_128);2442		break;2443	case 64:2444		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,2445			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_64);2446		break;2447	case 32:2448		snd_soc_component_update_bits(component, RT5682S_TDM_TCON_CTRL_1,2449			RT5682S_TDM_BCLK_MS1_MASK, RT5682S_TDM_BCLK_MS1_32);2450		break;2451	default:2452		dev_err(dai->dev, "Invalid bclk1 ratio %d\n", ratio);2453		return -EINVAL;2454	}2455 2456	return 0;2457}2458 2459static int rt5682s_set_bclk2_ratio(struct snd_soc_dai *dai, unsigned int ratio)2460{2461	struct snd_soc_component *component = dai->component;2462	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2463 2464	rt5682s->bclk[dai->id] = ratio;2465 2466	switch (ratio) {2467	case 64:2468		snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_2,2469			RT5682S_I2S2_BCLK_MS2_MASK, RT5682S_I2S2_BCLK_MS2_64);2470		break;2471	case 32:2472		snd_soc_component_update_bits(component, RT5682S_ADDA_CLK_2,2473			RT5682S_I2S2_BCLK_MS2_MASK, RT5682S_I2S2_BCLK_MS2_32);2474		break;2475	default:2476		dev_err(dai->dev, "Invalid bclk2 ratio %d\n", ratio);2477		return -EINVAL;2478	}2479 2480	return 0;2481}2482 2483static int rt5682s_set_bias_level(struct snd_soc_component *component,2484		enum snd_soc_bias_level level)2485{2486	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2487 2488	switch (level) {2489	case SND_SOC_BIAS_PREPARE:2490		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1,2491			RT5682S_PWR_LDO, RT5682S_PWR_LDO);2492		break;2493	case SND_SOC_BIAS_STANDBY:2494		if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF)2495			regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1,2496				RT5682S_DIG_GATE_CTRL, RT5682S_DIG_GATE_CTRL);2497		break;2498	case SND_SOC_BIAS_OFF:2499		regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1, RT5682S_PWR_LDO, 0);2500		if (!rt5682s->wclk_enabled)2501			regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_1,2502				RT5682S_DIG_GATE_CTRL, 0);2503		break;2504	case SND_SOC_BIAS_ON:2505		break;2506	}2507 2508	return 0;2509}2510 2511#ifdef CONFIG_COMMON_CLK2512#define CLK_PLL2_FIN 480000002513#define CLK_48 480002514#define CLK_44 441002515 2516static bool rt5682s_clk_check(struct rt5682s_priv *rt5682s)2517{2518	if (!rt5682s->master[RT5682S_AIF1]) {2519		dev_dbg(rt5682s->component->dev, "dai clk fmt not set correctly\n");2520		return false;2521	}2522	return true;2523}2524 2525static int rt5682s_wclk_prepare(struct clk_hw *hw)2526{2527	struct rt5682s_priv *rt5682s =2528		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);2529	struct snd_soc_component *component = rt5682s->component;2530	int ref, reg;2531 2532	if (!rt5682s_clk_check(rt5682s))2533		return -EINVAL;2534 2535	mutex_lock(&rt5682s->wclk_mutex);2536 2537	snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,2538		RT5682S_PWR_VREF2 | RT5682S_PWR_FV2 | RT5682S_PWR_MB,2539		RT5682S_PWR_VREF2 | RT5682S_PWR_MB);2540	usleep_range(15000, 20000);2541	snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,2542		RT5682S_PWR_FV2, RT5682S_PWR_FV2);2543 2544	/* Set and power on I2S1 */2545	snd_soc_component_update_bits(component, RT5682S_PWR_DIG_1,2546		RT5682S_DIG_GATE_CTRL, RT5682S_DIG_GATE_CTRL);2547	rt5682s_set_i2s(rt5682s, RT5682S_AIF1, 1);2548 2549	/* Only need to power on PLLB due to the rate set restriction */2550	reg = RT5682S_PLL_TRACK_2;2551	ref = 256 * rt5682s->lrck[RT5682S_AIF1];2552	rt5682s_set_filter_clk(rt5682s, reg, ref);2553	rt5682s_set_pllb_power(rt5682s, 1);2554 2555	rt5682s->wclk_enabled = 1;2556 2557	mutex_unlock(&rt5682s->wclk_mutex);2558 2559	return 0;2560}2561 2562static void rt5682s_wclk_unprepare(struct clk_hw *hw)2563{2564	struct rt5682s_priv *rt5682s =2565		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);2566	struct snd_soc_component *component = rt5682s->component;2567 2568	if (!rt5682s_clk_check(rt5682s))2569		return;2570 2571	mutex_lock(&rt5682s->wclk_mutex);2572 2573	if (!rt5682s->jack_type)2574		snd_soc_component_update_bits(component, RT5682S_PWR_ANLG_1,2575			RT5682S_PWR_VREF2 | RT5682S_PWR_FV2 | RT5682S_PWR_MB, 0);2576 2577	/* Power down I2S1 */2578	rt5682s_set_i2s(rt5682s, RT5682S_AIF1, 0);2579	snd_soc_component_update_bits(component, RT5682S_PWR_DIG_1,2580		RT5682S_DIG_GATE_CTRL, 0);2581 2582	/* Power down PLLB */2583	rt5682s_set_pllb_power(rt5682s, 0);2584 2585	rt5682s->wclk_enabled = 0;2586 2587	mutex_unlock(&rt5682s->wclk_mutex);2588}2589 2590static unsigned long rt5682s_wclk_recalc_rate(struct clk_hw *hw,2591					     unsigned long parent_rate)2592{2593	struct rt5682s_priv *rt5682s =2594		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);2595	struct snd_soc_component *component = rt5682s->component;2596	const char * const clk_name = clk_hw_get_name(hw);2597 2598	if (!rt5682s_clk_check(rt5682s))2599		return 0;2600	/*2601	 * Only accept to set wclk rate to 44.1k or 48kHz.2602	 */2603	if (rt5682s->lrck[RT5682S_AIF1] != CLK_48 &&2604	    rt5682s->lrck[RT5682S_AIF1] != CLK_44) {2605		dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n",2606			__func__, clk_name, CLK_44, CLK_48);2607		return 0;2608	}2609 2610	return rt5682s->lrck[RT5682S_AIF1];2611}2612 2613static long rt5682s_wclk_round_rate(struct clk_hw *hw, unsigned long rate,2614				   unsigned long *parent_rate)2615{2616	struct rt5682s_priv *rt5682s =2617		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);2618	struct snd_soc_component *component = rt5682s->component;2619	const char * const clk_name = clk_hw_get_name(hw);2620 2621	if (!rt5682s_clk_check(rt5682s))2622		return -EINVAL;2623	/*2624	 * Only accept to set wclk rate to 44.1k or 48kHz.2625	 * It will force to 48kHz if not both.2626	 */2627	if (rate != CLK_48 && rate != CLK_44) {2628		dev_warn(component->dev, "%s: clk %s only support %d or %d Hz output\n",2629			__func__, clk_name, CLK_44, CLK_48);2630		rate = CLK_48;2631	}2632 2633	return rate;2634}2635 2636static int rt5682s_wclk_set_rate(struct clk_hw *hw, unsigned long rate,2637				unsigned long parent_rate)2638{2639	struct rt5682s_priv *rt5682s =2640		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_WCLK_IDX]);2641	struct snd_soc_component *component = rt5682s->component;2642	struct clk *parent_clk;2643	const char * const clk_name = clk_hw_get_name(hw);2644	unsigned int clk_pll2_fout;2645 2646	if (!rt5682s_clk_check(rt5682s))2647		return -EINVAL;2648 2649	/*2650	 * Whether the wclk's parent clk (mclk) exists or not, please ensure2651	 * it is fixed or set to 48MHz before setting wclk rate. It's a2652	 * temporary limitation. Only accept 48MHz clk as the clk provider.2653	 *2654	 * It will set the codec anyway by assuming mclk is 48MHz.2655	 */2656	parent_clk = clk_get_parent(hw->clk);2657	if (!parent_clk)2658		dev_warn(component->dev,2659			"Parent mclk of wclk not acquired in driver. Please ensure mclk was provided as %d Hz.\n",2660			CLK_PLL2_FIN);2661 2662	if (parent_rate != CLK_PLL2_FIN)2663		dev_warn(component->dev, "clk %s only support %d Hz input\n",2664			clk_name, CLK_PLL2_FIN);2665 2666	/*2667	 * To achieve the rate conversion from 48MHz to 44.1k or 48kHz,2668	 * PLL2 is needed.2669	 */2670	clk_pll2_fout = rate * 512;2671	rt5682s_set_component_pll(component, RT5682S_PLL2, RT5682S_PLL_S_MCLK,2672		CLK_PLL2_FIN, clk_pll2_fout);2673 2674	rt5682s_set_component_sysclk(component, RT5682S_SCLK_S_PLL2, 0,2675		clk_pll2_fout, SND_SOC_CLOCK_IN);2676 2677	rt5682s->lrck[RT5682S_AIF1] = rate;2678 2679	return 0;2680}2681 2682static unsigned long rt5682s_bclk_recalc_rate(struct clk_hw *hw,2683					     unsigned long parent_rate)2684{2685	struct rt5682s_priv *rt5682s =2686		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_BCLK_IDX]);2687	struct snd_soc_component *component = rt5682s->component;2688	unsigned int bclks_per_wclk;2689 2690	bclks_per_wclk = snd_soc_component_read(component, RT5682S_TDM_TCON_CTRL_1);2691 2692	switch (bclks_per_wclk & RT5682S_TDM_BCLK_MS1_MASK) {2693	case RT5682S_TDM_BCLK_MS1_256:2694		return parent_rate * 256;2695	case RT5682S_TDM_BCLK_MS1_128:2696		return parent_rate * 128;2697	case RT5682S_TDM_BCLK_MS1_64:2698		return parent_rate * 64;2699	case RT5682S_TDM_BCLK_MS1_32:2700		return parent_rate * 32;2701	default:2702		return 0;2703	}2704}2705 2706static unsigned long rt5682s_bclk_get_factor(unsigned long rate,2707					    unsigned long parent_rate)2708{2709	unsigned long factor;2710 2711	factor = rate / parent_rate;2712	if (factor < 64)2713		return 32;2714	else if (factor < 128)2715		return 64;2716	else if (factor < 256)2717		return 128;2718	else2719		return 256;2720}2721 2722static long rt5682s_bclk_round_rate(struct clk_hw *hw, unsigned long rate,2723				   unsigned long *parent_rate)2724{2725	struct rt5682s_priv *rt5682s =2726		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_BCLK_IDX]);2727	unsigned long factor;2728 2729	if (!*parent_rate || !rt5682s_clk_check(rt5682s))2730		return -EINVAL;2731 2732	/*2733	 * BCLK rates are set as a multiplier of WCLK in HW.2734	 * We don't allow changing the parent WCLK. We just do2735	 * some rounding down based on the parent WCLK rate2736	 * and find the appropriate multiplier of BCLK to2737	 * get the rounded down BCLK value.2738	 */2739	factor = rt5682s_bclk_get_factor(rate, *parent_rate);2740 2741	return *parent_rate * factor;2742}2743 2744static int rt5682s_bclk_set_rate(struct clk_hw *hw, unsigned long rate,2745				unsigned long parent_rate)2746{2747	struct rt5682s_priv *rt5682s =2748		container_of(hw, struct rt5682s_priv, dai_clks_hw[RT5682S_DAI_BCLK_IDX]);2749	struct snd_soc_component *component = rt5682s->component;2750	struct snd_soc_dai *dai;2751	unsigned long factor;2752 2753	if (!rt5682s_clk_check(rt5682s))2754		return -EINVAL;2755 2756	factor = rt5682s_bclk_get_factor(rate, parent_rate);2757 2758	for_each_component_dais(component, dai)2759		if (dai->id == RT5682S_AIF1)2760			return rt5682s_set_bclk1_ratio(dai, factor);2761 2762	dev_err(component->dev, "dai %d not found in component\n",2763		RT5682S_AIF1);2764	return -ENODEV;2765}2766 2767static const struct clk_ops rt5682s_dai_clk_ops[RT5682S_DAI_NUM_CLKS] = {2768	[RT5682S_DAI_WCLK_IDX] = {2769		.prepare = rt5682s_wclk_prepare,2770		.unprepare = rt5682s_wclk_unprepare,2771		.recalc_rate = rt5682s_wclk_recalc_rate,2772		.round_rate = rt5682s_wclk_round_rate,2773		.set_rate = rt5682s_wclk_set_rate,2774	},2775	[RT5682S_DAI_BCLK_IDX] = {2776		.recalc_rate = rt5682s_bclk_recalc_rate,2777		.round_rate = rt5682s_bclk_round_rate,2778		.set_rate = rt5682s_bclk_set_rate,2779	},2780};2781 2782static int rt5682s_register_dai_clks(struct snd_soc_component *component)2783{2784	struct device *dev = component->dev;2785	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2786	struct rt5682s_platform_data *pdata = &rt5682s->pdata;2787	struct clk_hw *dai_clk_hw;2788	int i, ret;2789 2790	for (i = 0; i < RT5682S_DAI_NUM_CLKS; ++i) {2791		struct clk_init_data init = { };2792		struct clk_parent_data parent_data;2793		const struct clk_hw *parent;2794 2795		dai_clk_hw = &rt5682s->dai_clks_hw[i];2796 2797		switch (i) {2798		case RT5682S_DAI_WCLK_IDX:2799			/* Make MCLK the parent of WCLK */2800			if (rt5682s->mclk) {2801				parent_data = (struct clk_parent_data){2802					.fw_name = "mclk",2803				};2804				init.parent_data = &parent_data;2805				init.num_parents = 1;2806			}2807			break;2808		case RT5682S_DAI_BCLK_IDX:2809			/* Make WCLK the parent of BCLK */2810			parent = &rt5682s->dai_clks_hw[RT5682S_DAI_WCLK_IDX];2811			init.parent_hws = &parent;2812			init.num_parents = 1;2813			break;2814		default:2815			dev_err(dev, "Invalid clock index\n");2816			return -EINVAL;2817		}2818 2819		init.name = pdata->dai_clk_names[i];2820		init.ops = &rt5682s_dai_clk_ops[i];2821		init.flags = CLK_GET_RATE_NOCACHE | CLK_SET_RATE_GATE;2822		dai_clk_hw->init = &init;2823 2824		ret = devm_clk_hw_register(dev, dai_clk_hw);2825		if (ret) {2826			dev_warn(dev, "Failed to register %s: %d\n", init.name, ret);2827			return ret;2828		}2829 2830		if (dev->of_node) {2831			ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get, dai_clk_hw);2832			if (ret)2833				return ret;2834		} else {2835			ret = devm_clk_hw_register_clkdev(dev, dai_clk_hw,2836							  init.name, dev_name(dev));2837			if (ret)2838				return ret;2839		}2840	}2841 2842	return 0;2843}2844 2845static int rt5682s_dai_probe_clks(struct snd_soc_component *component)2846{2847	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2848	int ret;2849 2850	/* Check if MCLK provided */2851	rt5682s->mclk = devm_clk_get_optional(component->dev, "mclk");2852	if (IS_ERR(rt5682s->mclk))2853		return PTR_ERR(rt5682s->mclk);2854 2855	/* Register CCF DAI clock control */2856	ret = rt5682s_register_dai_clks(component);2857	if (ret)2858		return ret;2859 2860	/* Initial setup for CCF */2861	rt5682s->lrck[RT5682S_AIF1] = CLK_48;2862 2863	return 0;2864}2865#else2866static inline int rt5682s_dai_probe_clks(struct snd_soc_component *component)2867{2868	return 0;2869}2870#endif /* CONFIG_COMMON_CLK */2871 2872static int rt5682s_probe(struct snd_soc_component *component)2873{2874	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2875 2876	rt5682s->component = component;2877 2878	return rt5682s_dai_probe_clks(component);2879}2880 2881static void rt5682s_remove(struct snd_soc_component *component)2882{2883	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2884 2885	rt5682s_reset(rt5682s);2886}2887 2888#ifdef CONFIG_PM2889static int rt5682s_suspend(struct snd_soc_component *component)2890{2891	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2892 2893	if (rt5682s->irq)2894		disable_irq(rt5682s->irq);2895 2896	cancel_delayed_work_sync(&rt5682s->jack_detect_work);2897	cancel_delayed_work_sync(&rt5682s->jd_check_work);2898 2899	if (rt5682s->hs_jack)2900		rt5682s->jack_type = rt5682s_headset_detect(component, 0);2901 2902	regcache_cache_only(rt5682s->regmap, true);2903	regcache_mark_dirty(rt5682s->regmap);2904 2905	return 0;2906}2907 2908static int rt5682s_resume(struct snd_soc_component *component)2909{2910	struct rt5682s_priv *rt5682s = snd_soc_component_get_drvdata(component);2911 2912	regcache_cache_only(rt5682s->regmap, false);2913	regcache_sync(rt5682s->regmap);2914 2915	if (rt5682s->hs_jack) {2916		mod_delayed_work(system_power_efficient_wq,2917			&rt5682s->jack_detect_work, msecs_to_jiffies(0));2918	}2919 2920	if (rt5682s->irq)2921		enable_irq(rt5682s->irq);2922 2923	return 0;2924}2925#else2926#define rt5682s_suspend NULL2927#define rt5682s_resume NULL2928#endif2929 2930static const struct snd_soc_dai_ops rt5682s_aif1_dai_ops = {2931	.hw_params = rt5682s_hw_params,2932	.set_fmt = rt5682s_set_dai_fmt,2933	.set_tdm_slot = rt5682s_set_tdm_slot,2934	.set_bclk_ratio = rt5682s_set_bclk1_ratio,2935};2936 2937static const struct snd_soc_dai_ops rt5682s_aif2_dai_ops = {2938	.hw_params = rt5682s_hw_params,2939	.set_fmt = rt5682s_set_dai_fmt,2940	.set_bclk_ratio = rt5682s_set_bclk2_ratio,2941};2942 2943static const struct snd_soc_component_driver rt5682s_soc_component_dev = {2944	.probe = rt5682s_probe,2945	.remove = rt5682s_remove,2946	.suspend = rt5682s_suspend,2947	.resume = rt5682s_resume,2948	.set_bias_level = rt5682s_set_bias_level,2949	.controls = rt5682s_snd_controls,2950	.num_controls = ARRAY_SIZE(rt5682s_snd_controls),2951	.dapm_widgets = rt5682s_dapm_widgets,2952	.num_dapm_widgets = ARRAY_SIZE(rt5682s_dapm_widgets),2953	.dapm_routes = rt5682s_dapm_routes,2954	.num_dapm_routes = ARRAY_SIZE(rt5682s_dapm_routes),2955	.set_sysclk = rt5682s_set_component_sysclk,2956	.set_pll = rt5682s_set_component_pll,2957	.set_jack = rt5682s_set_jack_detect,2958	.use_pmdown_time	= 1,2959	.endianness		= 1,2960};2961 2962static int rt5682s_parse_dt(struct rt5682s_priv *rt5682s, struct device *dev)2963{2964	device_property_read_u32(dev, "realtek,dmic1-data-pin",2965		&rt5682s->pdata.dmic1_data_pin);2966	device_property_read_u32(dev, "realtek,dmic1-clk-pin",2967		&rt5682s->pdata.dmic1_clk_pin);2968	device_property_read_u32(dev, "realtek,jd-src",2969		&rt5682s->pdata.jd_src);2970	device_property_read_u32(dev, "realtek,dmic-clk-rate-hz",2971		&rt5682s->pdata.dmic_clk_rate);2972	device_property_read_u32(dev, "realtek,dmic-delay-ms",2973		&rt5682s->pdata.dmic_delay);2974	device_property_read_u32(dev, "realtek,amic-delay-ms",2975		&rt5682s->pdata.amic_delay);2976	device_property_read_u32(dev, "realtek,ldo-sel",2977		&rt5682s->pdata.ldo_dacref);2978 2979	if (device_property_read_string_array(dev, "clock-output-names",2980					      rt5682s->pdata.dai_clk_names,2981					      RT5682S_DAI_NUM_CLKS) < 0)2982		dev_warn(dev, "Using default DAI clk names: %s, %s\n",2983			 rt5682s->pdata.dai_clk_names[RT5682S_DAI_WCLK_IDX],2984			 rt5682s->pdata.dai_clk_names[RT5682S_DAI_BCLK_IDX]);2985 2986	rt5682s->pdata.dmic_clk_driving_high = device_property_read_bool(dev,2987		"realtek,dmic-clk-driving-high");2988 2989	return 0;2990}2991 2992static void rt5682s_calibrate(struct rt5682s_priv *rt5682s)2993{2994	unsigned int count, value;2995 2996	mutex_lock(&rt5682s->calibrate_mutex);2997 2998	regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0xaa80);2999	usleep_range(15000, 20000);3000	regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0xfa80);3001	regmap_write(rt5682s->regmap, RT5682S_PWR_DIG_1, 0x01c0);3002	regmap_write(rt5682s->regmap, RT5682S_MICBIAS_2, 0x0380);3003	regmap_write(rt5682s->regmap, RT5682S_GLB_CLK, 0x8000);3004	regmap_write(rt5682s->regmap, RT5682S_ADDA_CLK_1, 0x1001);3005	regmap_write(rt5682s->regmap, RT5682S_CHOP_DAC_2, 0x3030);3006	regmap_write(rt5682s->regmap, RT5682S_CHOP_ADC, 0xb000);3007	regmap_write(rt5682s->regmap, RT5682S_STO1_ADC_MIXER, 0x686c);3008	regmap_write(rt5682s->regmap, RT5682S_CAL_REC, 0x5151);3009	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_2, 0x0321);3010	regmap_write(rt5682s->regmap, RT5682S_HP_LOGIC_CTRL_2, 0x0004);3011	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_1, 0x7c00);3012	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_1, 0xfc00);3013 3014	for (count = 0; count < 60; count++) {3015		regmap_read(rt5682s->regmap, RT5682S_HP_CALIB_ST_1, &value);3016		if (!(value & 0x8000))3017			break;3018 3019		usleep_range(10000, 10005);3020	}3021 3022	if (count >= 60)3023		dev_err(rt5682s->component->dev, "HP Calibration Failure\n");3024 3025	/* restore settings */3026	regmap_write(rt5682s->regmap, RT5682S_MICBIAS_2, 0x0180);3027	regmap_write(rt5682s->regmap, RT5682S_CAL_REC, 0x5858);3028	regmap_write(rt5682s->regmap, RT5682S_STO1_ADC_MIXER, 0xc0c4);3029	regmap_write(rt5682s->regmap, RT5682S_HP_CALIB_CTRL_2, 0x0320);3030	regmap_write(rt5682s->regmap, RT5682S_PWR_DIG_1, 0x00c0);3031	regmap_write(rt5682s->regmap, RT5682S_PWR_ANLG_1, 0x0800);3032	regmap_write(rt5682s->regmap, RT5682S_GLB_CLK, 0x0000);3033 3034	mutex_unlock(&rt5682s->calibrate_mutex);3035}3036 3037static const struct regmap_config rt5682s_regmap = {3038	.reg_bits = 16,3039	.val_bits = 16,3040	.max_register = RT5682S_MAX_REG,3041	.volatile_reg = rt5682s_volatile_register,3042	.readable_reg = rt5682s_readable_register,3043	.cache_type = REGCACHE_MAPLE,3044	.reg_defaults = rt5682s_reg,3045	.num_reg_defaults = ARRAY_SIZE(rt5682s_reg),3046	.use_single_read = true,3047	.use_single_write = true,3048};3049 3050static struct snd_soc_dai_driver rt5682s_dai[] = {3051	{3052		.name = "rt5682s-aif1",3053		.id = RT5682S_AIF1,3054		.playback = {3055			.stream_name = "AIF1 Playback",3056			.channels_min = 1,3057			.channels_max = 2,3058			.rates = RT5682S_STEREO_RATES,3059			.formats = RT5682S_FORMATS,3060		},3061		.capture = {3062			.stream_name = "AIF1 Capture",3063			.channels_min = 1,3064			.channels_max = 2,3065			.rates = RT5682S_STEREO_RATES,3066			.formats = RT5682S_FORMATS,3067		},3068		.ops = &rt5682s_aif1_dai_ops,3069	},3070	{3071		.name = "rt5682s-aif2",3072		.id = RT5682S_AIF2,3073		.capture = {3074			.stream_name = "AIF2 Capture",3075			.channels_min = 1,3076			.channels_max = 2,3077			.rates = RT5682S_STEREO_RATES,3078			.formats = RT5682S_FORMATS,3079		},3080		.ops = &rt5682s_aif2_dai_ops,3081	},3082};3083 3084static void rt5682s_i2c_disable_regulators(void *data)3085{3086	struct rt5682s_priv *rt5682s = data;3087	struct device *dev = regmap_get_device(rt5682s->regmap);3088	int ret;3089 3090	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_AVDD].consumer);3091	if (ret)3092		dev_err(dev, "Failed to disable supply AVDD: %d\n", ret);3093 3094	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_DBVDD].consumer);3095	if (ret)3096		dev_err(dev, "Failed to disable supply DBVDD: %d\n", ret);3097 3098	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_LDO1_IN].consumer);3099	if (ret)3100		dev_err(dev, "Failed to disable supply LDO1-IN: %d\n", ret);3101 3102	usleep_range(1000, 1500);3103 3104	ret = regulator_disable(rt5682s->supplies[RT5682S_SUPPLY_MICVDD].consumer);3105	if (ret)3106		dev_err(dev, "Failed to disable supply MICVDD: %d\n", ret);3107}3108 3109static int rt5682s_i2c_probe(struct i2c_client *i2c)3110{3111	struct rt5682s_platform_data *pdata = dev_get_platdata(&i2c->dev);3112	struct rt5682s_priv *rt5682s;3113	int i, ret;3114	unsigned int val;3115 3116	rt5682s = devm_kzalloc(&i2c->dev, sizeof(struct rt5682s_priv), GFP_KERNEL);3117	if (!rt5682s)3118		return -ENOMEM;3119 3120	i2c_set_clientdata(i2c, rt5682s);3121 3122	rt5682s->pdata = i2s_default_platform_data;3123 3124	if (pdata)3125		rt5682s->pdata = *pdata;3126	else3127		rt5682s_parse_dt(rt5682s, &i2c->dev);3128 3129	rt5682s->regmap = devm_regmap_init_i2c(i2c, &rt5682s_regmap);3130	if (IS_ERR(rt5682s->regmap)) {3131		ret = PTR_ERR(rt5682s->regmap);3132		dev_err(&i2c->dev, "Failed to allocate register map: %d\n", ret);3133		return ret;3134	}3135 3136	for (i = 0; i < ARRAY_SIZE(rt5682s->supplies); i++)3137		rt5682s->supplies[i].supply = rt5682s_supply_names[i];3138 3139	ret = devm_regulator_bulk_get(&i2c->dev,3140			ARRAY_SIZE(rt5682s->supplies), rt5682s->supplies);3141	if (ret) {3142		dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);3143		return ret;3144	}3145 3146	ret = devm_add_action_or_reset(&i2c->dev, rt5682s_i2c_disable_regulators, rt5682s);3147	if (ret)3148		return ret;3149 3150	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_MICVDD].consumer);3151	if (ret) {3152		dev_err(&i2c->dev, "Failed to enable supply MICVDD: %d\n", ret);3153		return ret;3154	}3155	usleep_range(1000, 1500);3156 3157	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_AVDD].consumer);3158	if (ret) {3159		dev_err(&i2c->dev, "Failed to enable supply AVDD: %d\n", ret);3160		return ret;3161	}3162 3163	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_DBVDD].consumer);3164	if (ret) {3165		dev_err(&i2c->dev, "Failed to enable supply DBVDD: %d\n", ret);3166		return ret;3167	}3168 3169	ret = regulator_enable(rt5682s->supplies[RT5682S_SUPPLY_LDO1_IN].consumer);3170	if (ret) {3171		dev_err(&i2c->dev, "Failed to enable supply LDO1-IN: %d\n", ret);3172		return ret;3173	}3174 3175	rt5682s->ldo1_en = devm_gpiod_get_optional(&i2c->dev,3176						   "realtek,ldo1-en",3177						   GPIOD_OUT_HIGH);3178	if (IS_ERR(rt5682s->ldo1_en)) {3179		dev_err(&i2c->dev, "Fail gpio request ldo1_en\n");3180		return PTR_ERR(rt5682s->ldo1_en);3181	}3182 3183	/* Sleep for 50 ms minimum */3184	usleep_range(50000, 55000);3185 3186	regmap_read(rt5682s->regmap, RT5682S_DEVICE_ID, &val);3187	if (val != DEVICE_ID) {3188		dev_err(&i2c->dev, "Device with ID register %x is not rt5682s\n", val);3189		return -ENODEV;3190	}3191 3192	rt5682s_reset(rt5682s);3193	rt5682s_apply_patch_list(rt5682s, &i2c->dev);3194 3195	regmap_update_bits(rt5682s->regmap, RT5682S_PWR_DIG_2,3196		RT5682S_DLDO_I_LIMIT_MASK, RT5682S_DLDO_I_LIMIT_DIS);3197	usleep_range(20000, 25000);3198 3199	mutex_init(&rt5682s->calibrate_mutex);3200	mutex_init(&rt5682s->sar_mutex);3201	mutex_init(&rt5682s->wclk_mutex);3202	rt5682s_calibrate(rt5682s);3203 3204	regmap_update_bits(rt5682s->regmap, RT5682S_MICBIAS_2,3205		RT5682S_PWR_CLK25M_MASK | RT5682S_PWR_CLK1M_MASK,3206		RT5682S_PWR_CLK25M_PD | RT5682S_PWR_CLK1M_PU);3207	regmap_update_bits(rt5682s->regmap, RT5682S_PWR_ANLG_1,3208		RT5682S_PWR_BG, RT5682S_PWR_BG);3209	regmap_update_bits(rt5682s->regmap, RT5682S_HP_LOGIC_CTRL_2,3210		RT5682S_HP_SIG_SRC_MASK, RT5682S_HP_SIG_SRC_1BIT_CTL);3211	regmap_update_bits(rt5682s->regmap, RT5682S_HP_CHARGE_PUMP_2,3212		RT5682S_PM_HP_MASK, RT5682S_PM_HP_HV);3213	regmap_update_bits(rt5682s->regmap, RT5682S_HP_AMP_DET_CTL_1,3214		RT5682S_CP_SW_SIZE_MASK, RT5682S_CP_SW_SIZE_M);3215 3216	/* DMIC data pin */3217	switch (rt5682s->pdata.dmic1_data_pin) {3218	case RT5682S_DMIC1_DATA_NULL:3219		break;3220	case RT5682S_DMIC1_DATA_GPIO2: /* share with LRCK2 */3221		regmap_update_bits(rt5682s->regmap, RT5682S_DMIC_CTRL_1,3222			RT5682S_DMIC_1_DP_MASK, RT5682S_DMIC_1_DP_GPIO2);3223		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,3224			RT5682S_GP2_PIN_MASK, RT5682S_GP2_PIN_DMIC_SDA);3225		break;3226	case RT5682S_DMIC1_DATA_GPIO5: /* share with DACDAT1 */3227		regmap_update_bits(rt5682s->regmap, RT5682S_DMIC_CTRL_1,3228			RT5682S_DMIC_1_DP_MASK, RT5682S_DMIC_1_DP_GPIO5);3229		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,3230			RT5682S_GP5_PIN_MASK, RT5682S_GP5_PIN_DMIC_SDA);3231		break;3232	default:3233		dev_warn(&i2c->dev, "invalid DMIC_DAT pin\n");3234		break;3235	}3236 3237	/* DMIC clk pin */3238	switch (rt5682s->pdata.dmic1_clk_pin) {3239	case RT5682S_DMIC1_CLK_NULL:3240		break;3241	case RT5682S_DMIC1_CLK_GPIO1: /* share with IRQ */3242		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,3243			RT5682S_GP1_PIN_MASK, RT5682S_GP1_PIN_DMIC_CLK);3244		break;3245	case RT5682S_DMIC1_CLK_GPIO3: /* share with BCLK2 */3246		regmap_update_bits(rt5682s->regmap, RT5682S_GPIO_CTRL_1,3247			RT5682S_GP3_PIN_MASK, RT5682S_GP3_PIN_DMIC_CLK);3248		if (rt5682s->pdata.dmic_clk_driving_high)3249			regmap_update_bits(rt5682s->regmap, RT5682S_PAD_DRIVING_CTRL,3250				RT5682S_PAD_DRV_GP3_MASK, RT5682S_PAD_DRV_GP3_HIGH);3251		break;3252	default:3253		dev_warn(&i2c->dev, "invalid DMIC_CLK pin\n");3254		break;3255	}3256 3257	/* LDO output voltage control */3258	switch (rt5682s->pdata.ldo_dacref) {3259	case RT5682S_LDO_1_607V:3260		break;3261	case RT5682S_LDO_1_5V:3262		regmap_update_bits(rt5682s->regmap, RT5682S_BIAS_CUR_CTRL_7,3263			RT5682S_LDO_DACREF_MASK, RT5682S_LDO_DACREF_1_5V);3264		break;3265	case RT5682S_LDO_1_406V:3266		regmap_update_bits(rt5682s->regmap, RT5682S_BIAS_CUR_CTRL_7,3267			RT5682S_LDO_DACREF_MASK, RT5682S_LDO_DACREF_1_406V);3268		break;3269	case RT5682S_LDO_1_731V:3270		regmap_update_bits(rt5682s->regmap, RT5682S_BIAS_CUR_CTRL_7,3271			RT5682S_LDO_DACREF_MASK, RT5682S_LDO_DACREF_1_731V);3272		break;3273	default:3274		dev_warn(&i2c->dev, "invalid LDO output setting.\n");3275		break;3276	}3277 3278	INIT_DELAYED_WORK(&rt5682s->jack_detect_work, rt5682s_jack_detect_handler);3279	INIT_DELAYED_WORK(&rt5682s->jd_check_work, rt5682s_jd_check_handler);3280 3281	if (i2c->irq) {3282		ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL, rt5682s_irq,3283			IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_ONESHOT,3284			"rt5682s", rt5682s);3285		if (!ret)3286			rt5682s->irq = i2c->irq;3287		else3288			dev_err(&i2c->dev, "Failed to request IRQ: %d\n", ret);3289	}3290 3291	return devm_snd_soc_register_component(&i2c->dev, &rt5682s_soc_component_dev,3292			rt5682s_dai, ARRAY_SIZE(rt5682s_dai));3293}3294 3295static void rt5682s_i2c_shutdown(struct i2c_client *client)3296{3297	struct rt5682s_priv *rt5682s = i2c_get_clientdata(client);3298 3299	disable_irq(client->irq);3300	cancel_delayed_work_sync(&rt5682s->jack_detect_work);3301	cancel_delayed_work_sync(&rt5682s->jd_check_work);3302 3303	rt5682s_reset(rt5682s);3304}3305 3306static void rt5682s_i2c_remove(struct i2c_client *client)3307{3308	rt5682s_i2c_shutdown(client);3309}3310 3311static const struct of_device_id rt5682s_of_match[] = {3312	{.compatible = "realtek,rt5682s"},3313	{},3314};3315MODULE_DEVICE_TABLE(of, rt5682s_of_match);3316 3317static const struct acpi_device_id rt5682s_acpi_match[] = {3318	{"RTL5682", 0,},3319	{},3320};3321MODULE_DEVICE_TABLE(acpi, rt5682s_acpi_match);3322 3323static const struct i2c_device_id rt5682s_i2c_id[] = {3324	{"rt5682s"},3325	{}3326};3327MODULE_DEVICE_TABLE(i2c, rt5682s_i2c_id);3328 3329static struct i2c_driver rt5682s_i2c_driver = {3330	.driver = {3331		.name = "rt5682s",3332		.of_match_table = rt5682s_of_match,3333		.acpi_match_table = rt5682s_acpi_match,3334		.probe_type = PROBE_PREFER_ASYNCHRONOUS,3335	},3336	.probe = rt5682s_i2c_probe,3337	.remove = rt5682s_i2c_remove,3338	.shutdown = rt5682s_i2c_shutdown,3339	.id_table = rt5682s_i2c_id,3340};3341module_i2c_driver(rt5682s_i2c_driver);3342 3343MODULE_DESCRIPTION("ASoC RT5682I-VS driver");3344MODULE_AUTHOR("Derek Fang <derek.fang@realtek.com>");3345MODULE_LICENSE("GPL v2");3346