162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * rt1011.c -- rt1011 ALSA SoC amplifier component driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright(c) 2019 Realtek Semiconductor Corp. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Shuming Fan <shumingf@realtek.com> 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci#include <linux/moduleparam.h> 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/delay.h> 1562306a36Sopenharmony_ci#include <linux/pm.h> 1662306a36Sopenharmony_ci#include <linux/i2c.h> 1762306a36Sopenharmony_ci#include <linux/acpi.h> 1862306a36Sopenharmony_ci#include <linux/regmap.h> 1962306a36Sopenharmony_ci#include <linux/platform_device.h> 2062306a36Sopenharmony_ci#include <linux/firmware.h> 2162306a36Sopenharmony_ci#include <sound/core.h> 2262306a36Sopenharmony_ci#include <sound/pcm.h> 2362306a36Sopenharmony_ci#include <sound/pcm_params.h> 2462306a36Sopenharmony_ci#include <sound/soc.h> 2562306a36Sopenharmony_ci#include <sound/soc-dapm.h> 2662306a36Sopenharmony_ci#include <sound/initval.h> 2762306a36Sopenharmony_ci#include <sound/tlv.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include "rl6231.h" 3062306a36Sopenharmony_ci#include "rt1011.h" 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistatic int rt1011_calibrate(struct rt1011_priv *rt1011, 3362306a36Sopenharmony_ci unsigned char cali_flag); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic const struct reg_sequence init_list[] = { 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci { RT1011_POWER_9, 0xa840 }, 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci { RT1011_ADC_SET_5, 0x0a20 }, 4062306a36Sopenharmony_ci { RT1011_DAC_SET_2, 0xa032 }, 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci { RT1011_SPK_PRO_DC_DET_1, 0xb00c }, 4362306a36Sopenharmony_ci { RT1011_SPK_PRO_DC_DET_2, 0xcccc }, 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci { RT1011_A_TIMING_1, 0x6054 }, 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci { RT1011_POWER_7, 0x3e55 }, 4862306a36Sopenharmony_ci { RT1011_POWER_8, 0x0520 }, 4962306a36Sopenharmony_ci { RT1011_BOOST_CON_1, 0xe188 }, 5062306a36Sopenharmony_ci { RT1011_POWER_4, 0x16f2 }, 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci { RT1011_CROSS_BQ_SET_1, 0x0004 }, 5362306a36Sopenharmony_ci { RT1011_SIL_DET, 0xc313 }, 5462306a36Sopenharmony_ci { RT1011_SINE_GEN_REG_1, 0x0707 }, 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci { RT1011_DC_CALIB_CLASSD_3, 0xcb00 }, 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci { RT1011_DAC_SET_1, 0xe702 }, 5962306a36Sopenharmony_ci { RT1011_DAC_SET_3, 0x2004 }, 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic const struct reg_default rt1011_reg[] = { 6362306a36Sopenharmony_ci {0x0000, 0x0000}, 6462306a36Sopenharmony_ci {0x0002, 0x0000}, 6562306a36Sopenharmony_ci {0x0004, 0xa000}, 6662306a36Sopenharmony_ci {0x0006, 0x0000}, 6762306a36Sopenharmony_ci {0x0008, 0x0003}, 6862306a36Sopenharmony_ci {0x000a, 0x087e}, 6962306a36Sopenharmony_ci {0x000c, 0x0020}, 7062306a36Sopenharmony_ci {0x000e, 0x9002}, 7162306a36Sopenharmony_ci {0x0010, 0x0000}, 7262306a36Sopenharmony_ci {0x0012, 0x0000}, 7362306a36Sopenharmony_ci {0x0020, 0x0c40}, 7462306a36Sopenharmony_ci {0x0022, 0x4313}, 7562306a36Sopenharmony_ci {0x0076, 0x0000}, 7662306a36Sopenharmony_ci {0x0078, 0x0000}, 7762306a36Sopenharmony_ci {0x007a, 0x0000}, 7862306a36Sopenharmony_ci {0x007c, 0x10ec}, 7962306a36Sopenharmony_ci {0x007d, 0x1011}, 8062306a36Sopenharmony_ci {0x00f0, 0x5000}, 8162306a36Sopenharmony_ci {0x00f2, 0x0374}, 8262306a36Sopenharmony_ci {0x00f3, 0x0000}, 8362306a36Sopenharmony_ci {0x00f4, 0x0000}, 8462306a36Sopenharmony_ci {0x0100, 0x0038}, 8562306a36Sopenharmony_ci {0x0102, 0xff02}, 8662306a36Sopenharmony_ci {0x0104, 0x0232}, 8762306a36Sopenharmony_ci {0x0106, 0x200c}, 8862306a36Sopenharmony_ci {0x0107, 0x0000}, 8962306a36Sopenharmony_ci {0x0108, 0x2f2f}, 9062306a36Sopenharmony_ci {0x010a, 0x2f2f}, 9162306a36Sopenharmony_ci {0x010c, 0x002f}, 9262306a36Sopenharmony_ci {0x010e, 0xe000}, 9362306a36Sopenharmony_ci {0x0110, 0x0820}, 9462306a36Sopenharmony_ci {0x0111, 0x4010}, 9562306a36Sopenharmony_ci {0x0112, 0x0000}, 9662306a36Sopenharmony_ci {0x0114, 0x0000}, 9762306a36Sopenharmony_ci {0x0116, 0x0000}, 9862306a36Sopenharmony_ci {0x0118, 0x0000}, 9962306a36Sopenharmony_ci {0x011a, 0x0101}, 10062306a36Sopenharmony_ci {0x011c, 0x4567}, 10162306a36Sopenharmony_ci {0x011e, 0x0000}, 10262306a36Sopenharmony_ci {0x0120, 0x0000}, 10362306a36Sopenharmony_ci {0x0122, 0x0000}, 10462306a36Sopenharmony_ci {0x0124, 0x0123}, 10562306a36Sopenharmony_ci {0x0126, 0x4567}, 10662306a36Sopenharmony_ci {0x0200, 0x0000}, 10762306a36Sopenharmony_ci {0x0300, 0xffdd}, 10862306a36Sopenharmony_ci {0x0302, 0x001e}, 10962306a36Sopenharmony_ci {0x0311, 0x0000}, 11062306a36Sopenharmony_ci {0x0313, 0x5254}, 11162306a36Sopenharmony_ci {0x0314, 0x0062}, 11262306a36Sopenharmony_ci {0x0316, 0x7f40}, 11362306a36Sopenharmony_ci {0x0319, 0x000f}, 11462306a36Sopenharmony_ci {0x031a, 0xffff}, 11562306a36Sopenharmony_ci {0x031b, 0x0000}, 11662306a36Sopenharmony_ci {0x031c, 0x009f}, 11762306a36Sopenharmony_ci {0x031d, 0xffff}, 11862306a36Sopenharmony_ci {0x031e, 0x0000}, 11962306a36Sopenharmony_ci {0x031f, 0x0000}, 12062306a36Sopenharmony_ci {0x0320, 0xe31c}, 12162306a36Sopenharmony_ci {0x0321, 0x0000}, 12262306a36Sopenharmony_ci {0x0322, 0x0000}, 12362306a36Sopenharmony_ci {0x0324, 0x0000}, 12462306a36Sopenharmony_ci {0x0326, 0x0002}, 12562306a36Sopenharmony_ci {0x0328, 0x20b2}, 12662306a36Sopenharmony_ci {0x0329, 0x0175}, 12762306a36Sopenharmony_ci {0x032a, 0x32ad}, 12862306a36Sopenharmony_ci {0x032b, 0x3455}, 12962306a36Sopenharmony_ci {0x032c, 0x0528}, 13062306a36Sopenharmony_ci {0x032d, 0xa800}, 13162306a36Sopenharmony_ci {0x032e, 0x030e}, 13262306a36Sopenharmony_ci {0x0330, 0x2080}, 13362306a36Sopenharmony_ci {0x0332, 0x0034}, 13462306a36Sopenharmony_ci {0x0334, 0x0000}, 13562306a36Sopenharmony_ci {0x0508, 0x0010}, 13662306a36Sopenharmony_ci {0x050a, 0x0018}, 13762306a36Sopenharmony_ci {0x050c, 0x0000}, 13862306a36Sopenharmony_ci {0x050d, 0xffff}, 13962306a36Sopenharmony_ci {0x050e, 0x1f1f}, 14062306a36Sopenharmony_ci {0x050f, 0x04ff}, 14162306a36Sopenharmony_ci {0x0510, 0x4020}, 14262306a36Sopenharmony_ci {0x0511, 0x01f0}, 14362306a36Sopenharmony_ci {0x0512, 0x0702}, 14462306a36Sopenharmony_ci {0x0516, 0xbb80}, 14562306a36Sopenharmony_ci {0x0517, 0xffff}, 14662306a36Sopenharmony_ci {0x0518, 0xffff}, 14762306a36Sopenharmony_ci {0x0519, 0x307f}, 14862306a36Sopenharmony_ci {0x051a, 0xffff}, 14962306a36Sopenharmony_ci {0x051b, 0x0000}, 15062306a36Sopenharmony_ci {0x051c, 0x0000}, 15162306a36Sopenharmony_ci {0x051d, 0x2000}, 15262306a36Sopenharmony_ci {0x051e, 0x0000}, 15362306a36Sopenharmony_ci {0x051f, 0x0000}, 15462306a36Sopenharmony_ci {0x0520, 0x0000}, 15562306a36Sopenharmony_ci {0x0521, 0x1001}, 15662306a36Sopenharmony_ci {0x0522, 0x7fff}, 15762306a36Sopenharmony_ci {0x0524, 0x7fff}, 15862306a36Sopenharmony_ci {0x0526, 0x0000}, 15962306a36Sopenharmony_ci {0x0528, 0x0000}, 16062306a36Sopenharmony_ci {0x052a, 0x0000}, 16162306a36Sopenharmony_ci {0x0530, 0x0401}, 16262306a36Sopenharmony_ci {0x0532, 0x3000}, 16362306a36Sopenharmony_ci {0x0534, 0x0000}, 16462306a36Sopenharmony_ci {0x0535, 0xffff}, 16562306a36Sopenharmony_ci {0x0536, 0x101c}, 16662306a36Sopenharmony_ci {0x0538, 0x1814}, 16762306a36Sopenharmony_ci {0x053a, 0x100c}, 16862306a36Sopenharmony_ci {0x053c, 0x0804}, 16962306a36Sopenharmony_ci {0x053d, 0x0000}, 17062306a36Sopenharmony_ci {0x053e, 0x0000}, 17162306a36Sopenharmony_ci {0x053f, 0x0000}, 17262306a36Sopenharmony_ci {0x0540, 0x0000}, 17362306a36Sopenharmony_ci {0x0541, 0x0000}, 17462306a36Sopenharmony_ci {0x0542, 0x0000}, 17562306a36Sopenharmony_ci {0x0543, 0x0000}, 17662306a36Sopenharmony_ci {0x0544, 0x001c}, 17762306a36Sopenharmony_ci {0x0545, 0x1814}, 17862306a36Sopenharmony_ci {0x0546, 0x100c}, 17962306a36Sopenharmony_ci {0x0547, 0x0804}, 18062306a36Sopenharmony_ci {0x0548, 0x0000}, 18162306a36Sopenharmony_ci {0x0549, 0x0000}, 18262306a36Sopenharmony_ci {0x054a, 0x0000}, 18362306a36Sopenharmony_ci {0x054b, 0x0000}, 18462306a36Sopenharmony_ci {0x054c, 0x0000}, 18562306a36Sopenharmony_ci {0x054d, 0x0000}, 18662306a36Sopenharmony_ci {0x054e, 0x0000}, 18762306a36Sopenharmony_ci {0x054f, 0x0000}, 18862306a36Sopenharmony_ci {0x0566, 0x0000}, 18962306a36Sopenharmony_ci {0x0568, 0x20f1}, 19062306a36Sopenharmony_ci {0x056a, 0x0007}, 19162306a36Sopenharmony_ci {0x0600, 0x9d00}, 19262306a36Sopenharmony_ci {0x0611, 0x2000}, 19362306a36Sopenharmony_ci {0x0612, 0x505f}, 19462306a36Sopenharmony_ci {0x0613, 0x0444}, 19562306a36Sopenharmony_ci {0x0614, 0x4000}, 19662306a36Sopenharmony_ci {0x0615, 0x4004}, 19762306a36Sopenharmony_ci {0x0616, 0x0606}, 19862306a36Sopenharmony_ci {0x0617, 0x8904}, 19962306a36Sopenharmony_ci {0x0618, 0xe021}, 20062306a36Sopenharmony_ci {0x0621, 0x2000}, 20162306a36Sopenharmony_ci {0x0622, 0x505f}, 20262306a36Sopenharmony_ci {0x0623, 0x0444}, 20362306a36Sopenharmony_ci {0x0624, 0x4000}, 20462306a36Sopenharmony_ci {0x0625, 0x4004}, 20562306a36Sopenharmony_ci {0x0626, 0x0606}, 20662306a36Sopenharmony_ci {0x0627, 0x8704}, 20762306a36Sopenharmony_ci {0x0628, 0xe021}, 20862306a36Sopenharmony_ci {0x0631, 0x2000}, 20962306a36Sopenharmony_ci {0x0632, 0x517f}, 21062306a36Sopenharmony_ci {0x0633, 0x0440}, 21162306a36Sopenharmony_ci {0x0634, 0x4000}, 21262306a36Sopenharmony_ci {0x0635, 0x4104}, 21362306a36Sopenharmony_ci {0x0636, 0x0306}, 21462306a36Sopenharmony_ci {0x0637, 0x8904}, 21562306a36Sopenharmony_ci {0x0638, 0xe021}, 21662306a36Sopenharmony_ci {0x0702, 0x0014}, 21762306a36Sopenharmony_ci {0x0704, 0x0000}, 21862306a36Sopenharmony_ci {0x0706, 0x0014}, 21962306a36Sopenharmony_ci {0x0708, 0x0000}, 22062306a36Sopenharmony_ci {0x070a, 0x0000}, 22162306a36Sopenharmony_ci {0x0710, 0x0200}, 22262306a36Sopenharmony_ci {0x0711, 0x0000}, 22362306a36Sopenharmony_ci {0x0712, 0x0200}, 22462306a36Sopenharmony_ci {0x0713, 0x0000}, 22562306a36Sopenharmony_ci {0x0720, 0x0200}, 22662306a36Sopenharmony_ci {0x0721, 0x0000}, 22762306a36Sopenharmony_ci {0x0722, 0x0000}, 22862306a36Sopenharmony_ci {0x0723, 0x0000}, 22962306a36Sopenharmony_ci {0x0724, 0x0000}, 23062306a36Sopenharmony_ci {0x0725, 0x0000}, 23162306a36Sopenharmony_ci {0x0726, 0x0000}, 23262306a36Sopenharmony_ci {0x0727, 0x0000}, 23362306a36Sopenharmony_ci {0x0728, 0x0000}, 23462306a36Sopenharmony_ci {0x0729, 0x0000}, 23562306a36Sopenharmony_ci {0x0730, 0x0200}, 23662306a36Sopenharmony_ci {0x0731, 0x0000}, 23762306a36Sopenharmony_ci {0x0732, 0x0000}, 23862306a36Sopenharmony_ci {0x0733, 0x0000}, 23962306a36Sopenharmony_ci {0x0734, 0x0000}, 24062306a36Sopenharmony_ci {0x0735, 0x0000}, 24162306a36Sopenharmony_ci {0x0736, 0x0000}, 24262306a36Sopenharmony_ci {0x0737, 0x0000}, 24362306a36Sopenharmony_ci {0x0738, 0x0000}, 24462306a36Sopenharmony_ci {0x0739, 0x0000}, 24562306a36Sopenharmony_ci {0x0740, 0x0200}, 24662306a36Sopenharmony_ci {0x0741, 0x0000}, 24762306a36Sopenharmony_ci {0x0742, 0x0000}, 24862306a36Sopenharmony_ci {0x0743, 0x0000}, 24962306a36Sopenharmony_ci {0x0744, 0x0000}, 25062306a36Sopenharmony_ci {0x0745, 0x0000}, 25162306a36Sopenharmony_ci {0x0746, 0x0000}, 25262306a36Sopenharmony_ci {0x0747, 0x0000}, 25362306a36Sopenharmony_ci {0x0748, 0x0000}, 25462306a36Sopenharmony_ci {0x0749, 0x0000}, 25562306a36Sopenharmony_ci {0x0750, 0x0200}, 25662306a36Sopenharmony_ci {0x0751, 0x0000}, 25762306a36Sopenharmony_ci {0x0752, 0x0000}, 25862306a36Sopenharmony_ci {0x0753, 0x0000}, 25962306a36Sopenharmony_ci {0x0754, 0x0000}, 26062306a36Sopenharmony_ci {0x0755, 0x0000}, 26162306a36Sopenharmony_ci {0x0756, 0x0000}, 26262306a36Sopenharmony_ci {0x0757, 0x0000}, 26362306a36Sopenharmony_ci {0x0758, 0x0000}, 26462306a36Sopenharmony_ci {0x0759, 0x0000}, 26562306a36Sopenharmony_ci {0x0760, 0x0200}, 26662306a36Sopenharmony_ci {0x0761, 0x0000}, 26762306a36Sopenharmony_ci {0x0762, 0x0000}, 26862306a36Sopenharmony_ci {0x0763, 0x0000}, 26962306a36Sopenharmony_ci {0x0764, 0x0000}, 27062306a36Sopenharmony_ci {0x0765, 0x0000}, 27162306a36Sopenharmony_ci {0x0766, 0x0000}, 27262306a36Sopenharmony_ci {0x0767, 0x0000}, 27362306a36Sopenharmony_ci {0x0768, 0x0000}, 27462306a36Sopenharmony_ci {0x0769, 0x0000}, 27562306a36Sopenharmony_ci {0x0770, 0x0200}, 27662306a36Sopenharmony_ci {0x0771, 0x0000}, 27762306a36Sopenharmony_ci {0x0772, 0x0000}, 27862306a36Sopenharmony_ci {0x0773, 0x0000}, 27962306a36Sopenharmony_ci {0x0774, 0x0000}, 28062306a36Sopenharmony_ci {0x0775, 0x0000}, 28162306a36Sopenharmony_ci {0x0776, 0x0000}, 28262306a36Sopenharmony_ci {0x0777, 0x0000}, 28362306a36Sopenharmony_ci {0x0778, 0x0000}, 28462306a36Sopenharmony_ci {0x0779, 0x0000}, 28562306a36Sopenharmony_ci {0x0780, 0x0200}, 28662306a36Sopenharmony_ci {0x0781, 0x0000}, 28762306a36Sopenharmony_ci {0x0782, 0x0000}, 28862306a36Sopenharmony_ci {0x0783, 0x0000}, 28962306a36Sopenharmony_ci {0x0784, 0x0000}, 29062306a36Sopenharmony_ci {0x0785, 0x0000}, 29162306a36Sopenharmony_ci {0x0786, 0x0000}, 29262306a36Sopenharmony_ci {0x0787, 0x0000}, 29362306a36Sopenharmony_ci {0x0788, 0x0000}, 29462306a36Sopenharmony_ci {0x0789, 0x0000}, 29562306a36Sopenharmony_ci {0x0790, 0x0200}, 29662306a36Sopenharmony_ci {0x0791, 0x0000}, 29762306a36Sopenharmony_ci {0x0792, 0x0000}, 29862306a36Sopenharmony_ci {0x0793, 0x0000}, 29962306a36Sopenharmony_ci {0x0794, 0x0000}, 30062306a36Sopenharmony_ci {0x0795, 0x0000}, 30162306a36Sopenharmony_ci {0x0796, 0x0000}, 30262306a36Sopenharmony_ci {0x0797, 0x0000}, 30362306a36Sopenharmony_ci {0x0798, 0x0000}, 30462306a36Sopenharmony_ci {0x0799, 0x0000}, 30562306a36Sopenharmony_ci {0x07a0, 0x0200}, 30662306a36Sopenharmony_ci {0x07a1, 0x0000}, 30762306a36Sopenharmony_ci {0x07a2, 0x0000}, 30862306a36Sopenharmony_ci {0x07a3, 0x0000}, 30962306a36Sopenharmony_ci {0x07a4, 0x0000}, 31062306a36Sopenharmony_ci {0x07a5, 0x0000}, 31162306a36Sopenharmony_ci {0x07a6, 0x0000}, 31262306a36Sopenharmony_ci {0x07a7, 0x0000}, 31362306a36Sopenharmony_ci {0x07a8, 0x0000}, 31462306a36Sopenharmony_ci {0x07a9, 0x0000}, 31562306a36Sopenharmony_ci {0x07b0, 0x0200}, 31662306a36Sopenharmony_ci {0x07b1, 0x0000}, 31762306a36Sopenharmony_ci {0x07b2, 0x0000}, 31862306a36Sopenharmony_ci {0x07b3, 0x0000}, 31962306a36Sopenharmony_ci {0x07b4, 0x0000}, 32062306a36Sopenharmony_ci {0x07b5, 0x0000}, 32162306a36Sopenharmony_ci {0x07b6, 0x0000}, 32262306a36Sopenharmony_ci {0x07b7, 0x0000}, 32362306a36Sopenharmony_ci {0x07b8, 0x0000}, 32462306a36Sopenharmony_ci {0x07b9, 0x0000}, 32562306a36Sopenharmony_ci {0x07c0, 0x0200}, 32662306a36Sopenharmony_ci {0x07c1, 0x0000}, 32762306a36Sopenharmony_ci {0x07c2, 0x0000}, 32862306a36Sopenharmony_ci {0x07c3, 0x0000}, 32962306a36Sopenharmony_ci {0x07c4, 0x0000}, 33062306a36Sopenharmony_ci {0x07c5, 0x0000}, 33162306a36Sopenharmony_ci {0x07c6, 0x0000}, 33262306a36Sopenharmony_ci {0x07c7, 0x0000}, 33362306a36Sopenharmony_ci {0x07c8, 0x0000}, 33462306a36Sopenharmony_ci {0x07c9, 0x0000}, 33562306a36Sopenharmony_ci {0x1000, 0x4040}, 33662306a36Sopenharmony_ci {0x1002, 0x6505}, 33762306a36Sopenharmony_ci {0x1004, 0x5405}, 33862306a36Sopenharmony_ci {0x1006, 0x5555}, 33962306a36Sopenharmony_ci {0x1007, 0x003f}, 34062306a36Sopenharmony_ci {0x1008, 0x7fd7}, 34162306a36Sopenharmony_ci {0x1009, 0x770f}, 34262306a36Sopenharmony_ci {0x100a, 0xfffe}, 34362306a36Sopenharmony_ci {0x100b, 0xe000}, 34462306a36Sopenharmony_ci {0x100c, 0x0000}, 34562306a36Sopenharmony_ci {0x100d, 0x0007}, 34662306a36Sopenharmony_ci {0x1010, 0xa433}, 34762306a36Sopenharmony_ci {0x1020, 0x0000}, 34862306a36Sopenharmony_ci {0x1022, 0x0000}, 34962306a36Sopenharmony_ci {0x1024, 0x0000}, 35062306a36Sopenharmony_ci {0x1200, 0x5a01}, 35162306a36Sopenharmony_ci {0x1202, 0x6324}, 35262306a36Sopenharmony_ci {0x1204, 0x0b00}, 35362306a36Sopenharmony_ci {0x1206, 0x0000}, 35462306a36Sopenharmony_ci {0x1208, 0x0000}, 35562306a36Sopenharmony_ci {0x120a, 0x0024}, 35662306a36Sopenharmony_ci {0x120c, 0x0000}, 35762306a36Sopenharmony_ci {0x120e, 0x000e}, 35862306a36Sopenharmony_ci {0x1210, 0x0000}, 35962306a36Sopenharmony_ci {0x1212, 0x0000}, 36062306a36Sopenharmony_ci {0x1300, 0x0701}, 36162306a36Sopenharmony_ci {0x1302, 0x12f9}, 36262306a36Sopenharmony_ci {0x1304, 0x3405}, 36362306a36Sopenharmony_ci {0x1305, 0x0844}, 36462306a36Sopenharmony_ci {0x1306, 0x5611}, 36562306a36Sopenharmony_ci {0x1308, 0x555e}, 36662306a36Sopenharmony_ci {0x130a, 0xa605}, 36762306a36Sopenharmony_ci {0x130c, 0x2000}, 36862306a36Sopenharmony_ci {0x130e, 0x0000}, 36962306a36Sopenharmony_ci {0x130f, 0x0001}, 37062306a36Sopenharmony_ci {0x1310, 0xaa48}, 37162306a36Sopenharmony_ci {0x1312, 0x0285}, 37262306a36Sopenharmony_ci {0x1314, 0xaaaa}, 37362306a36Sopenharmony_ci {0x1316, 0xaaa0}, 37462306a36Sopenharmony_ci {0x1318, 0x2aaa}, 37562306a36Sopenharmony_ci {0x131a, 0xaa07}, 37662306a36Sopenharmony_ci {0x1322, 0x0029}, 37762306a36Sopenharmony_ci {0x1323, 0x4a52}, 37862306a36Sopenharmony_ci {0x1324, 0x002c}, 37962306a36Sopenharmony_ci {0x1325, 0x0b02}, 38062306a36Sopenharmony_ci {0x1326, 0x002d}, 38162306a36Sopenharmony_ci {0x1327, 0x6b5a}, 38262306a36Sopenharmony_ci {0x1328, 0x002e}, 38362306a36Sopenharmony_ci {0x1329, 0xcbb2}, 38462306a36Sopenharmony_ci {0x132a, 0x0030}, 38562306a36Sopenharmony_ci {0x132b, 0x2c0b}, 38662306a36Sopenharmony_ci {0x1330, 0x0031}, 38762306a36Sopenharmony_ci {0x1331, 0x8c63}, 38862306a36Sopenharmony_ci {0x1332, 0x0032}, 38962306a36Sopenharmony_ci {0x1333, 0xecbb}, 39062306a36Sopenharmony_ci {0x1334, 0x0034}, 39162306a36Sopenharmony_ci {0x1335, 0x4d13}, 39262306a36Sopenharmony_ci {0x1336, 0x0037}, 39362306a36Sopenharmony_ci {0x1337, 0x0dc3}, 39462306a36Sopenharmony_ci {0x1338, 0x003d}, 39562306a36Sopenharmony_ci {0x1339, 0xef7b}, 39662306a36Sopenharmony_ci {0x133a, 0x0044}, 39762306a36Sopenharmony_ci {0x133b, 0xd134}, 39862306a36Sopenharmony_ci {0x133c, 0x0047}, 39962306a36Sopenharmony_ci {0x133d, 0x91e4}, 40062306a36Sopenharmony_ci {0x133e, 0x004d}, 40162306a36Sopenharmony_ci {0x133f, 0xc370}, 40262306a36Sopenharmony_ci {0x1340, 0x0053}, 40362306a36Sopenharmony_ci {0x1341, 0xf4fd}, 40462306a36Sopenharmony_ci {0x1342, 0x0060}, 40562306a36Sopenharmony_ci {0x1343, 0x5816}, 40662306a36Sopenharmony_ci {0x1344, 0x006c}, 40762306a36Sopenharmony_ci {0x1345, 0xbb2e}, 40862306a36Sopenharmony_ci {0x1346, 0x0072}, 40962306a36Sopenharmony_ci {0x1347, 0xecbb}, 41062306a36Sopenharmony_ci {0x1348, 0x0076}, 41162306a36Sopenharmony_ci {0x1349, 0x5d97}, 41262306a36Sopenharmony_ci {0x1500, 0x0702}, 41362306a36Sopenharmony_ci {0x1502, 0x002f}, 41462306a36Sopenharmony_ci {0x1504, 0x0000}, 41562306a36Sopenharmony_ci {0x1510, 0x0064}, 41662306a36Sopenharmony_ci {0x1512, 0x0000}, 41762306a36Sopenharmony_ci {0x1514, 0xdf47}, 41862306a36Sopenharmony_ci {0x1516, 0x079c}, 41962306a36Sopenharmony_ci {0x1518, 0xfbf5}, 42062306a36Sopenharmony_ci {0x151a, 0x00bc}, 42162306a36Sopenharmony_ci {0x151c, 0x3b85}, 42262306a36Sopenharmony_ci {0x151e, 0x02b3}, 42362306a36Sopenharmony_ci {0x1520, 0x3333}, 42462306a36Sopenharmony_ci {0x1522, 0x0000}, 42562306a36Sopenharmony_ci {0x1524, 0x4000}, 42662306a36Sopenharmony_ci {0x1528, 0x0064}, 42762306a36Sopenharmony_ci {0x152a, 0x0000}, 42862306a36Sopenharmony_ci {0x152c, 0x0000}, 42962306a36Sopenharmony_ci {0x152e, 0x0000}, 43062306a36Sopenharmony_ci {0x1530, 0x0000}, 43162306a36Sopenharmony_ci {0x1532, 0x0000}, 43262306a36Sopenharmony_ci {0x1534, 0x0000}, 43362306a36Sopenharmony_ci {0x1536, 0x0000}, 43462306a36Sopenharmony_ci {0x1538, 0x0040}, 43562306a36Sopenharmony_ci {0x1539, 0x0000}, 43662306a36Sopenharmony_ci {0x153a, 0x0040}, 43762306a36Sopenharmony_ci {0x153b, 0x0000}, 43862306a36Sopenharmony_ci {0x153c, 0x0064}, 43962306a36Sopenharmony_ci {0x153e, 0x0bf9}, 44062306a36Sopenharmony_ci {0x1540, 0xb2a9}, 44162306a36Sopenharmony_ci {0x1544, 0x0200}, 44262306a36Sopenharmony_ci {0x1546, 0x0000}, 44362306a36Sopenharmony_ci {0x1548, 0x00ca}, 44462306a36Sopenharmony_ci {0x1552, 0x03ff}, 44562306a36Sopenharmony_ci {0x1554, 0x017f}, 44662306a36Sopenharmony_ci {0x1556, 0x017f}, 44762306a36Sopenharmony_ci {0x155a, 0x0000}, 44862306a36Sopenharmony_ci {0x155c, 0x0000}, 44962306a36Sopenharmony_ci {0x1560, 0x0040}, 45062306a36Sopenharmony_ci {0x1562, 0x0000}, 45162306a36Sopenharmony_ci {0x1570, 0x03ff}, 45262306a36Sopenharmony_ci {0x1571, 0xdcff}, 45362306a36Sopenharmony_ci {0x1572, 0x1e00}, 45462306a36Sopenharmony_ci {0x1573, 0x224f}, 45562306a36Sopenharmony_ci {0x1574, 0x0000}, 45662306a36Sopenharmony_ci {0x1575, 0x0000}, 45762306a36Sopenharmony_ci {0x1576, 0x1e00}, 45862306a36Sopenharmony_ci {0x1577, 0x0000}, 45962306a36Sopenharmony_ci {0x1578, 0x0000}, 46062306a36Sopenharmony_ci {0x1579, 0x1128}, 46162306a36Sopenharmony_ci {0x157a, 0x03ff}, 46262306a36Sopenharmony_ci {0x157b, 0xdcff}, 46362306a36Sopenharmony_ci {0x157c, 0x1e00}, 46462306a36Sopenharmony_ci {0x157d, 0x224f}, 46562306a36Sopenharmony_ci {0x157e, 0x0000}, 46662306a36Sopenharmony_ci {0x157f, 0x0000}, 46762306a36Sopenharmony_ci {0x1580, 0x1e00}, 46862306a36Sopenharmony_ci {0x1581, 0x0000}, 46962306a36Sopenharmony_ci {0x1582, 0x0000}, 47062306a36Sopenharmony_ci {0x1583, 0x1128}, 47162306a36Sopenharmony_ci {0x1590, 0x03ff}, 47262306a36Sopenharmony_ci {0x1591, 0xdcff}, 47362306a36Sopenharmony_ci {0x1592, 0x1e00}, 47462306a36Sopenharmony_ci {0x1593, 0x224f}, 47562306a36Sopenharmony_ci {0x1594, 0x0000}, 47662306a36Sopenharmony_ci {0x1595, 0x0000}, 47762306a36Sopenharmony_ci {0x1596, 0x1e00}, 47862306a36Sopenharmony_ci {0x1597, 0x0000}, 47962306a36Sopenharmony_ci {0x1598, 0x0000}, 48062306a36Sopenharmony_ci {0x1599, 0x1128}, 48162306a36Sopenharmony_ci {0x159a, 0x03ff}, 48262306a36Sopenharmony_ci {0x159b, 0xdcff}, 48362306a36Sopenharmony_ci {0x159c, 0x1e00}, 48462306a36Sopenharmony_ci {0x159d, 0x224f}, 48562306a36Sopenharmony_ci {0x159e, 0x0000}, 48662306a36Sopenharmony_ci {0x159f, 0x0000}, 48762306a36Sopenharmony_ci {0x15a0, 0x1e00}, 48862306a36Sopenharmony_ci {0x15a1, 0x0000}, 48962306a36Sopenharmony_ci {0x15a2, 0x0000}, 49062306a36Sopenharmony_ci {0x15a3, 0x1128}, 49162306a36Sopenharmony_ci {0x15b0, 0x007f}, 49262306a36Sopenharmony_ci {0x15b1, 0xffff}, 49362306a36Sopenharmony_ci {0x15b2, 0x007f}, 49462306a36Sopenharmony_ci {0x15b3, 0xffff}, 49562306a36Sopenharmony_ci {0x15b4, 0x007f}, 49662306a36Sopenharmony_ci {0x15b5, 0xffff}, 49762306a36Sopenharmony_ci {0x15b8, 0x007f}, 49862306a36Sopenharmony_ci {0x15b9, 0xffff}, 49962306a36Sopenharmony_ci {0x15bc, 0x0000}, 50062306a36Sopenharmony_ci {0x15bd, 0x0000}, 50162306a36Sopenharmony_ci {0x15be, 0xff00}, 50262306a36Sopenharmony_ci {0x15bf, 0x0000}, 50362306a36Sopenharmony_ci {0x15c0, 0xff00}, 50462306a36Sopenharmony_ci {0x15c1, 0x0000}, 50562306a36Sopenharmony_ci {0x15c3, 0xfc00}, 50662306a36Sopenharmony_ci {0x15c4, 0xbb80}, 50762306a36Sopenharmony_ci {0x15d0, 0x0000}, 50862306a36Sopenharmony_ci {0x15d1, 0x0000}, 50962306a36Sopenharmony_ci {0x15d2, 0x0000}, 51062306a36Sopenharmony_ci {0x15d3, 0x0000}, 51162306a36Sopenharmony_ci {0x15d4, 0x0000}, 51262306a36Sopenharmony_ci {0x15d5, 0x0000}, 51362306a36Sopenharmony_ci {0x15d6, 0x0000}, 51462306a36Sopenharmony_ci {0x15d7, 0x0000}, 51562306a36Sopenharmony_ci {0x15d8, 0x0200}, 51662306a36Sopenharmony_ci {0x15d9, 0x0000}, 51762306a36Sopenharmony_ci {0x15da, 0x0000}, 51862306a36Sopenharmony_ci {0x15db, 0x0000}, 51962306a36Sopenharmony_ci {0x15dc, 0x0000}, 52062306a36Sopenharmony_ci {0x15dd, 0x0000}, 52162306a36Sopenharmony_ci {0x15de, 0x0000}, 52262306a36Sopenharmony_ci {0x15df, 0x0000}, 52362306a36Sopenharmony_ci {0x15e0, 0x0000}, 52462306a36Sopenharmony_ci {0x15e1, 0x0000}, 52562306a36Sopenharmony_ci {0x15e2, 0x0200}, 52662306a36Sopenharmony_ci {0x15e3, 0x0000}, 52762306a36Sopenharmony_ci {0x15e4, 0x0000}, 52862306a36Sopenharmony_ci {0x15e5, 0x0000}, 52962306a36Sopenharmony_ci {0x15e6, 0x0000}, 53062306a36Sopenharmony_ci {0x15e7, 0x0000}, 53162306a36Sopenharmony_ci {0x15e8, 0x0000}, 53262306a36Sopenharmony_ci {0x15e9, 0x0000}, 53362306a36Sopenharmony_ci {0x15ea, 0x0000}, 53462306a36Sopenharmony_ci {0x15eb, 0x0000}, 53562306a36Sopenharmony_ci {0x15ec, 0x0200}, 53662306a36Sopenharmony_ci {0x15ed, 0x0000}, 53762306a36Sopenharmony_ci {0x15ee, 0x0000}, 53862306a36Sopenharmony_ci {0x15ef, 0x0000}, 53962306a36Sopenharmony_ci {0x15f0, 0x0000}, 54062306a36Sopenharmony_ci {0x15f1, 0x0000}, 54162306a36Sopenharmony_ci {0x15f2, 0x0000}, 54262306a36Sopenharmony_ci {0x15f3, 0x0000}, 54362306a36Sopenharmony_ci {0x15f4, 0x0000}, 54462306a36Sopenharmony_ci {0x15f5, 0x0000}, 54562306a36Sopenharmony_ci {0x15f6, 0x0200}, 54662306a36Sopenharmony_ci {0x15f7, 0x0200}, 54762306a36Sopenharmony_ci {0x15f8, 0x8200}, 54862306a36Sopenharmony_ci {0x15f9, 0x0000}, 54962306a36Sopenharmony_ci {0x1600, 0x007d}, 55062306a36Sopenharmony_ci {0x1601, 0xa178}, 55162306a36Sopenharmony_ci {0x1602, 0x00c2}, 55262306a36Sopenharmony_ci {0x1603, 0x5383}, 55362306a36Sopenharmony_ci {0x1604, 0x0000}, 55462306a36Sopenharmony_ci {0x1605, 0x02c1}, 55562306a36Sopenharmony_ci {0x1606, 0x007d}, 55662306a36Sopenharmony_ci {0x1607, 0xa178}, 55762306a36Sopenharmony_ci {0x1608, 0x00c2}, 55862306a36Sopenharmony_ci {0x1609, 0x5383}, 55962306a36Sopenharmony_ci {0x160a, 0x003e}, 56062306a36Sopenharmony_ci {0x160b, 0xd37d}, 56162306a36Sopenharmony_ci {0x1611, 0x3210}, 56262306a36Sopenharmony_ci {0x1612, 0x7418}, 56362306a36Sopenharmony_ci {0x1613, 0xc0ff}, 56462306a36Sopenharmony_ci {0x1614, 0x0000}, 56562306a36Sopenharmony_ci {0x1615, 0x00ff}, 56662306a36Sopenharmony_ci {0x1616, 0x0000}, 56762306a36Sopenharmony_ci {0x1617, 0x0000}, 56862306a36Sopenharmony_ci {0x1621, 0x6210}, 56962306a36Sopenharmony_ci {0x1622, 0x7418}, 57062306a36Sopenharmony_ci {0x1623, 0xc0ff}, 57162306a36Sopenharmony_ci {0x1624, 0x0000}, 57262306a36Sopenharmony_ci {0x1625, 0x00ff}, 57362306a36Sopenharmony_ci {0x1626, 0x0000}, 57462306a36Sopenharmony_ci {0x1627, 0x0000}, 57562306a36Sopenharmony_ci {0x1631, 0x3a14}, 57662306a36Sopenharmony_ci {0x1632, 0x7418}, 57762306a36Sopenharmony_ci {0x1633, 0xc3ff}, 57862306a36Sopenharmony_ci {0x1634, 0x0000}, 57962306a36Sopenharmony_ci {0x1635, 0x00ff}, 58062306a36Sopenharmony_ci {0x1636, 0x0000}, 58162306a36Sopenharmony_ci {0x1637, 0x0000}, 58262306a36Sopenharmony_ci {0x1638, 0x0000}, 58362306a36Sopenharmony_ci {0x163a, 0x0000}, 58462306a36Sopenharmony_ci {0x163c, 0x0000}, 58562306a36Sopenharmony_ci {0x163e, 0x0000}, 58662306a36Sopenharmony_ci {0x1640, 0x0000}, 58762306a36Sopenharmony_ci {0x1642, 0x0000}, 58862306a36Sopenharmony_ci {0x1644, 0x0000}, 58962306a36Sopenharmony_ci {0x1646, 0x0000}, 59062306a36Sopenharmony_ci {0x1648, 0x0000}, 59162306a36Sopenharmony_ci {0x1650, 0x0000}, 59262306a36Sopenharmony_ci {0x1652, 0x0000}, 59362306a36Sopenharmony_ci {0x1654, 0x0000}, 59462306a36Sopenharmony_ci {0x1656, 0x0000}, 59562306a36Sopenharmony_ci {0x1658, 0x0000}, 59662306a36Sopenharmony_ci {0x1660, 0x0000}, 59762306a36Sopenharmony_ci {0x1662, 0x0000}, 59862306a36Sopenharmony_ci {0x1664, 0x0000}, 59962306a36Sopenharmony_ci {0x1666, 0x0000}, 60062306a36Sopenharmony_ci {0x1668, 0x0000}, 60162306a36Sopenharmony_ci {0x1670, 0x0000}, 60262306a36Sopenharmony_ci {0x1672, 0x0000}, 60362306a36Sopenharmony_ci {0x1674, 0x0000}, 60462306a36Sopenharmony_ci {0x1676, 0x0000}, 60562306a36Sopenharmony_ci {0x1678, 0x0000}, 60662306a36Sopenharmony_ci {0x1680, 0x0000}, 60762306a36Sopenharmony_ci {0x1682, 0x0000}, 60862306a36Sopenharmony_ci {0x1684, 0x0000}, 60962306a36Sopenharmony_ci {0x1686, 0x0000}, 61062306a36Sopenharmony_ci {0x1688, 0x0000}, 61162306a36Sopenharmony_ci {0x1690, 0x0000}, 61262306a36Sopenharmony_ci {0x1692, 0x0000}, 61362306a36Sopenharmony_ci {0x1694, 0x0000}, 61462306a36Sopenharmony_ci {0x1696, 0x0000}, 61562306a36Sopenharmony_ci {0x1698, 0x0000}, 61662306a36Sopenharmony_ci {0x1700, 0x0000}, 61762306a36Sopenharmony_ci {0x1702, 0x0000}, 61862306a36Sopenharmony_ci {0x1704, 0x0000}, 61962306a36Sopenharmony_ci {0x1706, 0x0000}, 62062306a36Sopenharmony_ci {0x1708, 0x0000}, 62162306a36Sopenharmony_ci {0x1710, 0x0000}, 62262306a36Sopenharmony_ci {0x1712, 0x0000}, 62362306a36Sopenharmony_ci {0x1714, 0x0000}, 62462306a36Sopenharmony_ci {0x1716, 0x0000}, 62562306a36Sopenharmony_ci {0x1718, 0x0000}, 62662306a36Sopenharmony_ci {0x1720, 0x0000}, 62762306a36Sopenharmony_ci {0x1722, 0x0000}, 62862306a36Sopenharmony_ci {0x1724, 0x0000}, 62962306a36Sopenharmony_ci {0x1726, 0x0000}, 63062306a36Sopenharmony_ci {0x1728, 0x0000}, 63162306a36Sopenharmony_ci {0x1730, 0x0000}, 63262306a36Sopenharmony_ci {0x1732, 0x0000}, 63362306a36Sopenharmony_ci {0x1734, 0x0000}, 63462306a36Sopenharmony_ci {0x1736, 0x0000}, 63562306a36Sopenharmony_ci {0x1738, 0x0000}, 63662306a36Sopenharmony_ci {0x173a, 0x0000}, 63762306a36Sopenharmony_ci {0x173c, 0x0000}, 63862306a36Sopenharmony_ci {0x173e, 0x0000}, 63962306a36Sopenharmony_ci {0x17bb, 0x0500}, 64062306a36Sopenharmony_ci {0x17bd, 0x0004}, 64162306a36Sopenharmony_ci {0x17bf, 0x0004}, 64262306a36Sopenharmony_ci {0x17c1, 0x0004}, 64362306a36Sopenharmony_ci {0x17c2, 0x7fff}, 64462306a36Sopenharmony_ci {0x17c3, 0x0000}, 64562306a36Sopenharmony_ci {0x17c5, 0x0000}, 64662306a36Sopenharmony_ci {0x17c7, 0x0000}, 64762306a36Sopenharmony_ci {0x17c9, 0x0000}, 64862306a36Sopenharmony_ci {0x17cb, 0x2010}, 64962306a36Sopenharmony_ci {0x17cd, 0x0000}, 65062306a36Sopenharmony_ci {0x17cf, 0x0000}, 65162306a36Sopenharmony_ci {0x17d1, 0x0000}, 65262306a36Sopenharmony_ci {0x17d3, 0x0000}, 65362306a36Sopenharmony_ci {0x17d5, 0x0000}, 65462306a36Sopenharmony_ci {0x17d7, 0x0000}, 65562306a36Sopenharmony_ci {0x17d9, 0x0000}, 65662306a36Sopenharmony_ci {0x17db, 0x0000}, 65762306a36Sopenharmony_ci {0x17dd, 0x0000}, 65862306a36Sopenharmony_ci {0x17df, 0x0000}, 65962306a36Sopenharmony_ci {0x17e1, 0x0000}, 66062306a36Sopenharmony_ci {0x17e3, 0x0000}, 66162306a36Sopenharmony_ci {0x17e5, 0x0000}, 66262306a36Sopenharmony_ci {0x17e7, 0x0000}, 66362306a36Sopenharmony_ci {0x17e9, 0x0000}, 66462306a36Sopenharmony_ci {0x17eb, 0x0000}, 66562306a36Sopenharmony_ci {0x17ed, 0x0000}, 66662306a36Sopenharmony_ci {0x17ef, 0x0000}, 66762306a36Sopenharmony_ci {0x17f1, 0x0000}, 66862306a36Sopenharmony_ci {0x17f3, 0x0000}, 66962306a36Sopenharmony_ci {0x17f5, 0x0000}, 67062306a36Sopenharmony_ci {0x17f7, 0x0000}, 67162306a36Sopenharmony_ci {0x17f9, 0x0000}, 67262306a36Sopenharmony_ci {0x17fb, 0x0000}, 67362306a36Sopenharmony_ci {0x17fd, 0x0000}, 67462306a36Sopenharmony_ci {0x17ff, 0x0000}, 67562306a36Sopenharmony_ci {0x1801, 0x0000}, 67662306a36Sopenharmony_ci {0x1803, 0x0000}, 67762306a36Sopenharmony_ci}; 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_cistatic int rt1011_reg_init(struct snd_soc_component *component) 68062306a36Sopenharmony_ci{ 68162306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci regmap_multi_reg_write(rt1011->regmap, 68462306a36Sopenharmony_ci init_list, ARRAY_SIZE(init_list)); 68562306a36Sopenharmony_ci return 0; 68662306a36Sopenharmony_ci} 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_cistatic bool rt1011_volatile_register(struct device *dev, unsigned int reg) 68962306a36Sopenharmony_ci{ 69062306a36Sopenharmony_ci switch (reg) { 69162306a36Sopenharmony_ci case RT1011_RESET: 69262306a36Sopenharmony_ci case RT1011_SRC_2: 69362306a36Sopenharmony_ci case RT1011_CLK_DET: 69462306a36Sopenharmony_ci case RT1011_SIL_DET: 69562306a36Sopenharmony_ci case RT1011_VERSION_ID: 69662306a36Sopenharmony_ci case RT1011_VENDOR_ID: 69762306a36Sopenharmony_ci case RT1011_DEVICE_ID: 69862306a36Sopenharmony_ci case RT1011_DUM_RO: 69962306a36Sopenharmony_ci case RT1011_DAC_SET_3: 70062306a36Sopenharmony_ci case RT1011_PWM_CAL: 70162306a36Sopenharmony_ci case RT1011_SPK_VOL_TEST_OUT: 70262306a36Sopenharmony_ci case RT1011_VBAT_VOL_DET_1: 70362306a36Sopenharmony_ci case RT1011_VBAT_TEST_OUT_1: 70462306a36Sopenharmony_ci case RT1011_VBAT_TEST_OUT_2: 70562306a36Sopenharmony_ci case RT1011_VBAT_PROTECTION: 70662306a36Sopenharmony_ci case RT1011_VBAT_DET: 70762306a36Sopenharmony_ci case RT1011_BOOST_CON_1: 70862306a36Sopenharmony_ci case RT1011_SHORT_CIRCUIT_DET_1: 70962306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_3: 71062306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_6: 71162306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_3: 71262306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_7: 71362306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_8: 71462306a36Sopenharmony_ci case RT1011_SPL_1: 71562306a36Sopenharmony_ci case RT1011_SPL_4: 71662306a36Sopenharmony_ci case RT1011_EXCUR_PROTECT_1: 71762306a36Sopenharmony_ci case RT1011_CROSS_BQ_SET_1: 71862306a36Sopenharmony_ci case RT1011_CROSS_BQ_SET_2: 71962306a36Sopenharmony_ci case RT1011_BQ_SET_0: 72062306a36Sopenharmony_ci case RT1011_BQ_SET_1: 72162306a36Sopenharmony_ci case RT1011_BQ_SET_2: 72262306a36Sopenharmony_ci case RT1011_TEST_PAD_STATUS: 72362306a36Sopenharmony_ci case RT1011_DC_CALIB_CLASSD_1: 72462306a36Sopenharmony_ci case RT1011_DC_CALIB_CLASSD_5: 72562306a36Sopenharmony_ci case RT1011_DC_CALIB_CLASSD_6: 72662306a36Sopenharmony_ci case RT1011_DC_CALIB_CLASSD_7: 72762306a36Sopenharmony_ci case RT1011_DC_CALIB_CLASSD_8: 72862306a36Sopenharmony_ci case RT1011_SINE_GEN_REG_2: 72962306a36Sopenharmony_ci case RT1011_STP_CALIB_RS_TEMP: 73062306a36Sopenharmony_ci case RT1011_SPK_RESISTANCE_1: 73162306a36Sopenharmony_ci case RT1011_SPK_RESISTANCE_2: 73262306a36Sopenharmony_ci case RT1011_SPK_THERMAL: 73362306a36Sopenharmony_ci case RT1011_ALC_BK_GAIN_O: 73462306a36Sopenharmony_ci case RT1011_ALC_BK_GAIN_O_PRE: 73562306a36Sopenharmony_ci case RT1011_SPK_DC_O_23_16: 73662306a36Sopenharmony_ci case RT1011_SPK_DC_O_15_0: 73762306a36Sopenharmony_ci case RT1011_INIT_RECIPROCAL_SYN_24_16: 73862306a36Sopenharmony_ci case RT1011_INIT_RECIPROCAL_SYN_15_0: 73962306a36Sopenharmony_ci case RT1011_SPK_EXCURSION_23_16: 74062306a36Sopenharmony_ci case RT1011_SPK_EXCURSION_15_0: 74162306a36Sopenharmony_ci case RT1011_SEP_MAIN_OUT_23_16: 74262306a36Sopenharmony_ci case RT1011_SEP_MAIN_OUT_15_0: 74362306a36Sopenharmony_ci case RT1011_ALC_DRC_HB_INTERNAL_5: 74462306a36Sopenharmony_ci case RT1011_ALC_DRC_HB_INTERNAL_6: 74562306a36Sopenharmony_ci case RT1011_ALC_DRC_HB_INTERNAL_7: 74662306a36Sopenharmony_ci case RT1011_ALC_DRC_BB_INTERNAL_5: 74762306a36Sopenharmony_ci case RT1011_ALC_DRC_BB_INTERNAL_6: 74862306a36Sopenharmony_ci case RT1011_ALC_DRC_BB_INTERNAL_7: 74962306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_5: 75062306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_6: 75162306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_7: 75262306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_8: 75362306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_9: 75462306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_10: 75562306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_11: 75662306a36Sopenharmony_ci case RT1011_IRQ_1: 75762306a36Sopenharmony_ci case RT1011_EFUSE_CONTROL_1: 75862306a36Sopenharmony_ci case RT1011_EFUSE_CONTROL_2: 75962306a36Sopenharmony_ci case RT1011_EFUSE_MATCH_DONE ... RT1011_EFUSE_READ_R0_3_15_0: 76062306a36Sopenharmony_ci return true; 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci default: 76362306a36Sopenharmony_ci return false; 76462306a36Sopenharmony_ci } 76562306a36Sopenharmony_ci} 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_cistatic bool rt1011_readable_register(struct device *dev, unsigned int reg) 76862306a36Sopenharmony_ci{ 76962306a36Sopenharmony_ci switch (reg) { 77062306a36Sopenharmony_ci case RT1011_RESET: 77162306a36Sopenharmony_ci case RT1011_CLK_1: 77262306a36Sopenharmony_ci case RT1011_CLK_2: 77362306a36Sopenharmony_ci case RT1011_CLK_3: 77462306a36Sopenharmony_ci case RT1011_CLK_4: 77562306a36Sopenharmony_ci case RT1011_PLL_1: 77662306a36Sopenharmony_ci case RT1011_PLL_2: 77762306a36Sopenharmony_ci case RT1011_SRC_1: 77862306a36Sopenharmony_ci case RT1011_SRC_2: 77962306a36Sopenharmony_ci case RT1011_SRC_3: 78062306a36Sopenharmony_ci case RT1011_CLK_DET: 78162306a36Sopenharmony_ci case RT1011_SIL_DET: 78262306a36Sopenharmony_ci case RT1011_PRIV_INDEX: 78362306a36Sopenharmony_ci case RT1011_PRIV_DATA: 78462306a36Sopenharmony_ci case RT1011_CUSTOMER_ID: 78562306a36Sopenharmony_ci case RT1011_FM_VER: 78662306a36Sopenharmony_ci case RT1011_VERSION_ID: 78762306a36Sopenharmony_ci case RT1011_VENDOR_ID: 78862306a36Sopenharmony_ci case RT1011_DEVICE_ID: 78962306a36Sopenharmony_ci case RT1011_DUM_RW_0: 79062306a36Sopenharmony_ci case RT1011_DUM_YUN: 79162306a36Sopenharmony_ci case RT1011_DUM_RW_1: 79262306a36Sopenharmony_ci case RT1011_DUM_RO: 79362306a36Sopenharmony_ci case RT1011_MAN_I2C_DEV: 79462306a36Sopenharmony_ci case RT1011_DAC_SET_1: 79562306a36Sopenharmony_ci case RT1011_DAC_SET_2: 79662306a36Sopenharmony_ci case RT1011_DAC_SET_3: 79762306a36Sopenharmony_ci case RT1011_ADC_SET: 79862306a36Sopenharmony_ci case RT1011_ADC_SET_1: 79962306a36Sopenharmony_ci case RT1011_ADC_SET_2: 80062306a36Sopenharmony_ci case RT1011_ADC_SET_3: 80162306a36Sopenharmony_ci case RT1011_ADC_SET_4: 80262306a36Sopenharmony_ci case RT1011_ADC_SET_5: 80362306a36Sopenharmony_ci case RT1011_TDM_TOTAL_SET: 80462306a36Sopenharmony_ci case RT1011_TDM1_SET_TCON: 80562306a36Sopenharmony_ci case RT1011_TDM1_SET_1: 80662306a36Sopenharmony_ci case RT1011_TDM1_SET_2: 80762306a36Sopenharmony_ci case RT1011_TDM1_SET_3: 80862306a36Sopenharmony_ci case RT1011_TDM1_SET_4: 80962306a36Sopenharmony_ci case RT1011_TDM1_SET_5: 81062306a36Sopenharmony_ci case RT1011_TDM2_SET_1: 81162306a36Sopenharmony_ci case RT1011_TDM2_SET_2: 81262306a36Sopenharmony_ci case RT1011_TDM2_SET_3: 81362306a36Sopenharmony_ci case RT1011_TDM2_SET_4: 81462306a36Sopenharmony_ci case RT1011_TDM2_SET_5: 81562306a36Sopenharmony_ci case RT1011_PWM_CAL: 81662306a36Sopenharmony_ci case RT1011_MIXER_1: 81762306a36Sopenharmony_ci case RT1011_MIXER_2: 81862306a36Sopenharmony_ci case RT1011_ADRC_LIMIT: 81962306a36Sopenharmony_ci case RT1011_A_PRO: 82062306a36Sopenharmony_ci case RT1011_A_TIMING_1: 82162306a36Sopenharmony_ci case RT1011_A_TIMING_2: 82262306a36Sopenharmony_ci case RT1011_A_TEMP_SEN: 82362306a36Sopenharmony_ci case RT1011_SPK_VOL_DET_1: 82462306a36Sopenharmony_ci case RT1011_SPK_VOL_DET_2: 82562306a36Sopenharmony_ci case RT1011_SPK_VOL_TEST_OUT: 82662306a36Sopenharmony_ci case RT1011_VBAT_VOL_DET_1: 82762306a36Sopenharmony_ci case RT1011_VBAT_VOL_DET_2: 82862306a36Sopenharmony_ci case RT1011_VBAT_TEST_OUT_1: 82962306a36Sopenharmony_ci case RT1011_VBAT_TEST_OUT_2: 83062306a36Sopenharmony_ci case RT1011_VBAT_PROTECTION: 83162306a36Sopenharmony_ci case RT1011_VBAT_DET: 83262306a36Sopenharmony_ci case RT1011_POWER_1: 83362306a36Sopenharmony_ci case RT1011_POWER_2: 83462306a36Sopenharmony_ci case RT1011_POWER_3: 83562306a36Sopenharmony_ci case RT1011_POWER_4: 83662306a36Sopenharmony_ci case RT1011_POWER_5: 83762306a36Sopenharmony_ci case RT1011_POWER_6: 83862306a36Sopenharmony_ci case RT1011_POWER_7: 83962306a36Sopenharmony_ci case RT1011_POWER_8: 84062306a36Sopenharmony_ci case RT1011_POWER_9: 84162306a36Sopenharmony_ci case RT1011_CLASS_D_POS: 84262306a36Sopenharmony_ci case RT1011_BOOST_CON_1: 84362306a36Sopenharmony_ci case RT1011_BOOST_CON_2: 84462306a36Sopenharmony_ci case RT1011_ANALOG_CTRL: 84562306a36Sopenharmony_ci case RT1011_POWER_SEQ: 84662306a36Sopenharmony_ci case RT1011_SHORT_CIRCUIT_DET_1: 84762306a36Sopenharmony_ci case RT1011_SHORT_CIRCUIT_DET_2: 84862306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_0: 84962306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_1: 85062306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_2: 85162306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_3: 85262306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_4: 85362306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_5: 85462306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_6: 85562306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_7: 85662306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_8: 85762306a36Sopenharmony_ci case RT1011_SPK_TEMP_PROTECT_9: 85862306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_1: 85962306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_2: 86062306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_3: 86162306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_4: 86262306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_5: 86362306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_6: 86462306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_7: 86562306a36Sopenharmony_ci case RT1011_SPK_PRO_DC_DET_8: 86662306a36Sopenharmony_ci case RT1011_SPL_1: 86762306a36Sopenharmony_ci case RT1011_SPL_2: 86862306a36Sopenharmony_ci case RT1011_SPL_3: 86962306a36Sopenharmony_ci case RT1011_SPL_4: 87062306a36Sopenharmony_ci case RT1011_THER_FOLD_BACK_1: 87162306a36Sopenharmony_ci case RT1011_THER_FOLD_BACK_2: 87262306a36Sopenharmony_ci case RT1011_EXCUR_PROTECT_1: 87362306a36Sopenharmony_ci case RT1011_EXCUR_PROTECT_2: 87462306a36Sopenharmony_ci case RT1011_EXCUR_PROTECT_3: 87562306a36Sopenharmony_ci case RT1011_EXCUR_PROTECT_4: 87662306a36Sopenharmony_ci case RT1011_BAT_GAIN_1: 87762306a36Sopenharmony_ci case RT1011_BAT_GAIN_2: 87862306a36Sopenharmony_ci case RT1011_BAT_GAIN_3: 87962306a36Sopenharmony_ci case RT1011_BAT_GAIN_4: 88062306a36Sopenharmony_ci case RT1011_BAT_GAIN_5: 88162306a36Sopenharmony_ci case RT1011_BAT_GAIN_6: 88262306a36Sopenharmony_ci case RT1011_BAT_GAIN_7: 88362306a36Sopenharmony_ci case RT1011_BAT_GAIN_8: 88462306a36Sopenharmony_ci case RT1011_BAT_GAIN_9: 88562306a36Sopenharmony_ci case RT1011_BAT_GAIN_10: 88662306a36Sopenharmony_ci case RT1011_BAT_GAIN_11: 88762306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_1: 88862306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_2: 88962306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_3: 89062306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_4: 89162306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_5: 89262306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_6: 89362306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_7: 89462306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_8: 89562306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_9: 89662306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_10: 89762306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_11: 89862306a36Sopenharmony_ci case RT1011_BAT_RT_THMAX_12: 89962306a36Sopenharmony_ci case RT1011_SPREAD_SPECTURM: 90062306a36Sopenharmony_ci case RT1011_PRO_GAIN_MODE: 90162306a36Sopenharmony_ci case RT1011_RT_DRC_CROSS: 90262306a36Sopenharmony_ci case RT1011_RT_DRC_HB_1: 90362306a36Sopenharmony_ci case RT1011_RT_DRC_HB_2: 90462306a36Sopenharmony_ci case RT1011_RT_DRC_HB_3: 90562306a36Sopenharmony_ci case RT1011_RT_DRC_HB_4: 90662306a36Sopenharmony_ci case RT1011_RT_DRC_HB_5: 90762306a36Sopenharmony_ci case RT1011_RT_DRC_HB_6: 90862306a36Sopenharmony_ci case RT1011_RT_DRC_HB_7: 90962306a36Sopenharmony_ci case RT1011_RT_DRC_HB_8: 91062306a36Sopenharmony_ci case RT1011_RT_DRC_BB_1: 91162306a36Sopenharmony_ci case RT1011_RT_DRC_BB_2: 91262306a36Sopenharmony_ci case RT1011_RT_DRC_BB_3: 91362306a36Sopenharmony_ci case RT1011_RT_DRC_BB_4: 91462306a36Sopenharmony_ci case RT1011_RT_DRC_BB_5: 91562306a36Sopenharmony_ci case RT1011_RT_DRC_BB_6: 91662306a36Sopenharmony_ci case RT1011_RT_DRC_BB_7: 91762306a36Sopenharmony_ci case RT1011_RT_DRC_BB_8: 91862306a36Sopenharmony_ci case RT1011_RT_DRC_POS_1: 91962306a36Sopenharmony_ci case RT1011_RT_DRC_POS_2: 92062306a36Sopenharmony_ci case RT1011_RT_DRC_POS_3: 92162306a36Sopenharmony_ci case RT1011_RT_DRC_POS_4: 92262306a36Sopenharmony_ci case RT1011_RT_DRC_POS_5: 92362306a36Sopenharmony_ci case RT1011_RT_DRC_POS_6: 92462306a36Sopenharmony_ci case RT1011_RT_DRC_POS_7: 92562306a36Sopenharmony_ci case RT1011_RT_DRC_POS_8: 92662306a36Sopenharmony_ci case RT1011_CROSS_BQ_SET_1: 92762306a36Sopenharmony_ci case RT1011_CROSS_BQ_SET_2: 92862306a36Sopenharmony_ci case RT1011_BQ_SET_0: 92962306a36Sopenharmony_ci case RT1011_BQ_SET_1: 93062306a36Sopenharmony_ci case RT1011_BQ_SET_2: 93162306a36Sopenharmony_ci case RT1011_BQ_PRE_GAIN_28_16: 93262306a36Sopenharmony_ci case RT1011_BQ_PRE_GAIN_15_0: 93362306a36Sopenharmony_ci case RT1011_BQ_POST_GAIN_28_16: 93462306a36Sopenharmony_ci case RT1011_BQ_POST_GAIN_15_0: 93562306a36Sopenharmony_ci case RT1011_BQ_H0_28_16 ... RT1011_BQ_A2_15_0: 93662306a36Sopenharmony_ci case RT1011_BQ_1_H0_28_16 ... RT1011_BQ_1_A2_15_0: 93762306a36Sopenharmony_ci case RT1011_BQ_2_H0_28_16 ... RT1011_BQ_2_A2_15_0: 93862306a36Sopenharmony_ci case RT1011_BQ_3_H0_28_16 ... RT1011_BQ_3_A2_15_0: 93962306a36Sopenharmony_ci case RT1011_BQ_4_H0_28_16 ... RT1011_BQ_4_A2_15_0: 94062306a36Sopenharmony_ci case RT1011_BQ_5_H0_28_16 ... RT1011_BQ_5_A2_15_0: 94162306a36Sopenharmony_ci case RT1011_BQ_6_H0_28_16 ... RT1011_BQ_6_A2_15_0: 94262306a36Sopenharmony_ci case RT1011_BQ_7_H0_28_16 ... RT1011_BQ_7_A2_15_0: 94362306a36Sopenharmony_ci case RT1011_BQ_8_H0_28_16 ... RT1011_BQ_8_A2_15_0: 94462306a36Sopenharmony_ci case RT1011_BQ_9_H0_28_16 ... RT1011_BQ_9_A2_15_0: 94562306a36Sopenharmony_ci case RT1011_BQ_10_H0_28_16 ... RT1011_BQ_10_A2_15_0: 94662306a36Sopenharmony_ci case RT1011_TEST_PAD_STATUS ... RT1011_PLL_INTERNAL_SET: 94762306a36Sopenharmony_ci case RT1011_TEST_OUT_1 ... RT1011_TEST_OUT_3: 94862306a36Sopenharmony_ci case RT1011_DC_CALIB_CLASSD_1 ... RT1011_DC_CALIB_CLASSD_10: 94962306a36Sopenharmony_ci case RT1011_CLASSD_INTERNAL_SET_1 ... RT1011_VREF_LV_1: 95062306a36Sopenharmony_ci case RT1011_SMART_BOOST_TIMING_1 ... RT1011_SMART_BOOST_TIMING_36: 95162306a36Sopenharmony_ci case RT1011_SINE_GEN_REG_1 ... RT1011_SINE_GEN_REG_3: 95262306a36Sopenharmony_ci case RT1011_STP_INITIAL_RS_TEMP ... RT1011_SPK_THERMAL: 95362306a36Sopenharmony_ci case RT1011_STP_OTP_TH ... RT1011_INIT_RECIPROCAL_SYN_15_0: 95462306a36Sopenharmony_ci case RT1011_STP_BQ_1_A1_L_28_16 ... RT1011_STP_BQ_1_H0_R_15_0: 95562306a36Sopenharmony_ci case RT1011_STP_BQ_2_A1_L_28_16 ... RT1011_SEP_RE_REG_15_0: 95662306a36Sopenharmony_ci case RT1011_DRC_CF_PARAMS_1 ... RT1011_DRC_CF_PARAMS_12: 95762306a36Sopenharmony_ci case RT1011_ALC_DRC_HB_INTERNAL_1 ... RT1011_ALC_DRC_HB_INTERNAL_7: 95862306a36Sopenharmony_ci case RT1011_ALC_DRC_BB_INTERNAL_1 ... RT1011_ALC_DRC_BB_INTERNAL_7: 95962306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_1 ... RT1011_ALC_DRC_POS_INTERNAL_8: 96062306a36Sopenharmony_ci case RT1011_ALC_DRC_POS_INTERNAL_9 ... RT1011_BQ_1_PARAMS_CHECK_5: 96162306a36Sopenharmony_ci case RT1011_BQ_2_PARAMS_CHECK_1 ... RT1011_BQ_2_PARAMS_CHECK_5: 96262306a36Sopenharmony_ci case RT1011_BQ_3_PARAMS_CHECK_1 ... RT1011_BQ_3_PARAMS_CHECK_5: 96362306a36Sopenharmony_ci case RT1011_BQ_4_PARAMS_CHECK_1 ... RT1011_BQ_4_PARAMS_CHECK_5: 96462306a36Sopenharmony_ci case RT1011_BQ_5_PARAMS_CHECK_1 ... RT1011_BQ_5_PARAMS_CHECK_5: 96562306a36Sopenharmony_ci case RT1011_BQ_6_PARAMS_CHECK_1 ... RT1011_BQ_6_PARAMS_CHECK_5: 96662306a36Sopenharmony_ci case RT1011_BQ_7_PARAMS_CHECK_1 ... RT1011_BQ_7_PARAMS_CHECK_5: 96762306a36Sopenharmony_ci case RT1011_BQ_8_PARAMS_CHECK_1 ... RT1011_BQ_8_PARAMS_CHECK_5: 96862306a36Sopenharmony_ci case RT1011_BQ_9_PARAMS_CHECK_1 ... RT1011_BQ_9_PARAMS_CHECK_5: 96962306a36Sopenharmony_ci case RT1011_BQ_10_PARAMS_CHECK_1 ... RT1011_BQ_10_PARAMS_CHECK_5: 97062306a36Sopenharmony_ci case RT1011_IRQ_1 ... RT1011_PART_NUMBER_EFUSE: 97162306a36Sopenharmony_ci case RT1011_EFUSE_CONTROL_1 ... RT1011_EFUSE_READ_R0_3_15_0: 97262306a36Sopenharmony_ci return true; 97362306a36Sopenharmony_ci default: 97462306a36Sopenharmony_ci return false; 97562306a36Sopenharmony_ci } 97662306a36Sopenharmony_ci} 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_cistatic const char * const rt1011_din_source_select[] = { 97962306a36Sopenharmony_ci "Left", 98062306a36Sopenharmony_ci "Right", 98162306a36Sopenharmony_ci "Left + Right average", 98262306a36Sopenharmony_ci}; 98362306a36Sopenharmony_ci 98462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_din_source_enum, RT1011_CROSS_BQ_SET_1, 5, 98562306a36Sopenharmony_ci rt1011_din_source_select); 98662306a36Sopenharmony_ci 98762306a36Sopenharmony_cistatic const char * const rt1011_tdm_data_out_select[] = { 98862306a36Sopenharmony_ci "TDM_O_LR", "BQ1", "DVOL", "BQ10", "ALC", "DMIX", "ADC_SRC_LR", 98962306a36Sopenharmony_ci "ADC_O_LR", "ADC_MONO", "RSPK_BPF_LR", "DMIX_ADD", "ENVELOPE_FS", 99062306a36Sopenharmony_ci "SEP_O_GAIN", "ALC_BK_GAIN", "STP_V_C", "DMIX_ABST" 99162306a36Sopenharmony_ci}; 99262306a36Sopenharmony_ci 99362306a36Sopenharmony_cistatic const char * const rt1011_tdm_l_ch_data_select[] = { 99462306a36Sopenharmony_ci "Slot0", "Slot1", "Slot2", "Slot3", "Slot4", "Slot5", "Slot6", "Slot7" 99562306a36Sopenharmony_ci}; 99662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm1_l_dac1_enum, RT1011_TDM1_SET_4, 12, 99762306a36Sopenharmony_ci rt1011_tdm_l_ch_data_select); 99862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm2_l_dac1_enum, RT1011_TDM2_SET_4, 12, 99962306a36Sopenharmony_ci rt1011_tdm_l_ch_data_select); 100062306a36Sopenharmony_ci 100162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm1_adc1_dat_enum, 100262306a36Sopenharmony_ci RT1011_ADCDAT_OUT_SOURCE, 0, rt1011_tdm_data_out_select); 100362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm1_adc1_loc_enum, RT1011_TDM1_SET_2, 0, 100462306a36Sopenharmony_ci rt1011_tdm_l_ch_data_select); 100562306a36Sopenharmony_ci 100662306a36Sopenharmony_cistatic const char * const rt1011_adc_data_mode_select[] = { 100762306a36Sopenharmony_ci "Stereo", "Mono" 100862306a36Sopenharmony_ci}; 100962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_adc_dout_mode_enum, RT1011_TDM1_SET_1, 12, 101062306a36Sopenharmony_ci rt1011_adc_data_mode_select); 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_cistatic const char * const rt1011_tdm_adc_data_len_control[] = { 101362306a36Sopenharmony_ci "1CH", "2CH", "3CH", "4CH", "5CH", "6CH", "7CH", "8CH" 101462306a36Sopenharmony_ci}; 101562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm1_dout_len_enum, RT1011_TDM1_SET_2, 13, 101662306a36Sopenharmony_ci rt1011_tdm_adc_data_len_control); 101762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm2_dout_len_enum, RT1011_TDM2_SET_2, 13, 101862306a36Sopenharmony_ci rt1011_tdm_adc_data_len_control); 101962306a36Sopenharmony_ci 102062306a36Sopenharmony_cistatic const char * const rt1011_tdm_adc_swap_select[] = { 102162306a36Sopenharmony_ci "L/R", "R/L", "L/L", "R/R" 102262306a36Sopenharmony_ci}; 102362306a36Sopenharmony_ci 102462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm_adc1_1_enum, RT1011_TDM1_SET_3, 6, 102562306a36Sopenharmony_ci rt1011_tdm_adc_swap_select); 102662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_tdm_adc2_1_enum, RT1011_TDM1_SET_3, 4, 102762306a36Sopenharmony_ci rt1011_tdm_adc_swap_select); 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_cistatic void rt1011_reset(struct regmap *regmap) 103062306a36Sopenharmony_ci{ 103162306a36Sopenharmony_ci regmap_write(regmap, RT1011_RESET, 0); 103262306a36Sopenharmony_ci} 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_cistatic int rt1011_recv_spk_mode_get(struct snd_kcontrol *kcontrol, 103562306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 103662306a36Sopenharmony_ci{ 103762306a36Sopenharmony_ci struct snd_soc_component *component = 103862306a36Sopenharmony_ci snd_soc_kcontrol_component(kcontrol); 103962306a36Sopenharmony_ci struct rt1011_priv *rt1011 = 104062306a36Sopenharmony_ci snd_soc_component_get_drvdata(component); 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_ci ucontrol->value.integer.value[0] = rt1011->recv_spk_mode; 104362306a36Sopenharmony_ci 104462306a36Sopenharmony_ci return 0; 104562306a36Sopenharmony_ci} 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_cistatic int rt1011_recv_spk_mode_put(struct snd_kcontrol *kcontrol, 104862306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 104962306a36Sopenharmony_ci{ 105062306a36Sopenharmony_ci struct snd_soc_component *component = 105162306a36Sopenharmony_ci snd_soc_kcontrol_component(kcontrol); 105262306a36Sopenharmony_ci struct rt1011_priv *rt1011 = 105362306a36Sopenharmony_ci snd_soc_component_get_drvdata(component); 105462306a36Sopenharmony_ci 105562306a36Sopenharmony_ci if (ucontrol->value.integer.value[0] == rt1011->recv_spk_mode) 105662306a36Sopenharmony_ci return 0; 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { 105962306a36Sopenharmony_ci rt1011->recv_spk_mode = ucontrol->value.integer.value[0]; 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_ci if (rt1011->recv_spk_mode) { 106262306a36Sopenharmony_ci 106362306a36Sopenharmony_ci /* 1: recevier mode on */ 106462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 106562306a36Sopenharmony_ci RT1011_CLASSD_INTERNAL_SET_3, 106662306a36Sopenharmony_ci RT1011_REG_GAIN_CLASSD_RI_SPK_MASK, 106762306a36Sopenharmony_ci RT1011_REG_GAIN_CLASSD_RI_410K); 106862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 106962306a36Sopenharmony_ci RT1011_CLASSD_INTERNAL_SET_1, 107062306a36Sopenharmony_ci RT1011_RECV_MODE_SPK_MASK, 107162306a36Sopenharmony_ci RT1011_RECV_MODE); 107262306a36Sopenharmony_ci } else { 107362306a36Sopenharmony_ci /* 0: speaker mode on */ 107462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 107562306a36Sopenharmony_ci RT1011_CLASSD_INTERNAL_SET_3, 107662306a36Sopenharmony_ci RT1011_REG_GAIN_CLASSD_RI_SPK_MASK, 107762306a36Sopenharmony_ci RT1011_REG_GAIN_CLASSD_RI_72P5K); 107862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 107962306a36Sopenharmony_ci RT1011_CLASSD_INTERNAL_SET_1, 108062306a36Sopenharmony_ci RT1011_RECV_MODE_SPK_MASK, 108162306a36Sopenharmony_ci RT1011_SPK_MODE); 108262306a36Sopenharmony_ci } 108362306a36Sopenharmony_ci } 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_ci return 0; 108662306a36Sopenharmony_ci} 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_cistatic bool rt1011_validate_bq_drc_coeff(unsigned short reg) 108962306a36Sopenharmony_ci{ 109062306a36Sopenharmony_ci if ((reg == RT1011_DAC_SET_1) || 109162306a36Sopenharmony_ci (reg >= RT1011_ADC_SET && reg <= RT1011_ADC_SET_1) || 109262306a36Sopenharmony_ci (reg == RT1011_ADC_SET_4) || (reg == RT1011_ADC_SET_5) || 109362306a36Sopenharmony_ci (reg == RT1011_MIXER_1) || 109462306a36Sopenharmony_ci (reg == RT1011_A_TIMING_1) || 109562306a36Sopenharmony_ci (reg >= RT1011_POWER_7 && reg <= RT1011_POWER_8) || 109662306a36Sopenharmony_ci (reg == RT1011_CLASS_D_POS) || (reg == RT1011_ANALOG_CTRL) || 109762306a36Sopenharmony_ci (reg >= RT1011_SPK_TEMP_PROTECT_0 && reg <= RT1011_SPK_TEMP_PROTECT_6) || 109862306a36Sopenharmony_ci (reg >= RT1011_SPK_PRO_DC_DET_5 && reg <= RT1011_BAT_GAIN_1) || 109962306a36Sopenharmony_ci (reg >= RT1011_RT_DRC_CROSS && reg <= RT1011_RT_DRC_POS_8) || 110062306a36Sopenharmony_ci (reg >= RT1011_CROSS_BQ_SET_1 && reg <= RT1011_BQ_10_A2_15_0) || 110162306a36Sopenharmony_ci (reg >= RT1011_SMART_BOOST_TIMING_1 && reg <= RT1011_SMART_BOOST_TIMING_36) || 110262306a36Sopenharmony_ci (reg == RT1011_SINE_GEN_REG_1) || 110362306a36Sopenharmony_ci (reg >= RT1011_STP_ALPHA_RECIPROCAL_MSB && reg <= RT1011_BQ_6_PARAMS_CHECK_5) || 110462306a36Sopenharmony_ci (reg >= RT1011_BQ_7_PARAMS_CHECK_1 && reg <= RT1011_BQ_10_PARAMS_CHECK_5)) 110562306a36Sopenharmony_ci return true; 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_ci return false; 110862306a36Sopenharmony_ci} 110962306a36Sopenharmony_ci 111062306a36Sopenharmony_cistatic int rt1011_bq_drc_coeff_get(struct snd_kcontrol *kcontrol, 111162306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 111262306a36Sopenharmony_ci{ 111362306a36Sopenharmony_ci struct snd_soc_component *component = 111462306a36Sopenharmony_ci snd_soc_kcontrol_component(kcontrol); 111562306a36Sopenharmony_ci struct rt1011_priv *rt1011 = 111662306a36Sopenharmony_ci snd_soc_component_get_drvdata(component); 111762306a36Sopenharmony_ci struct rt1011_bq_drc_params *bq_drc_info; 111862306a36Sopenharmony_ci struct rt1011_bq_drc_params *params = 111962306a36Sopenharmony_ci (struct rt1011_bq_drc_params *)ucontrol->value.integer.value; 112062306a36Sopenharmony_ci unsigned int i, mode_idx = 0; 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_ci if (strstr(ucontrol->id.name, "AdvanceMode Initial Set")) 112362306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_INITIAL_SET; 112462306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode SEP BQ Coeff")) 112562306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_SEP_BQ_COEFF; 112662306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode EQ BQ Coeff")) 112762306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_EQ_BQ_COEFF; 112862306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode BQ UI Coeff")) 112962306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_BQ_UI_COEFF; 113062306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode SmartBoost Coeff")) 113162306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_SMARTBOOST_COEFF; 113262306a36Sopenharmony_ci else 113362306a36Sopenharmony_ci return -EINVAL; 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ci pr_info("%s, id.name=%s, mode_idx=%d\n", __func__, 113662306a36Sopenharmony_ci ucontrol->id.name, mode_idx); 113762306a36Sopenharmony_ci bq_drc_info = rt1011->bq_drc_params[mode_idx]; 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci for (i = 0; i < RT1011_BQ_DRC_NUM; i++) { 114062306a36Sopenharmony_ci params[i].reg = bq_drc_info[i].reg; 114162306a36Sopenharmony_ci params[i].val = bq_drc_info[i].val; 114262306a36Sopenharmony_ci } 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_ci return 0; 114562306a36Sopenharmony_ci} 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_cistatic int rt1011_bq_drc_coeff_put(struct snd_kcontrol *kcontrol, 114862306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 114962306a36Sopenharmony_ci{ 115062306a36Sopenharmony_ci struct snd_soc_component *component = 115162306a36Sopenharmony_ci snd_soc_kcontrol_component(kcontrol); 115262306a36Sopenharmony_ci struct rt1011_priv *rt1011 = 115362306a36Sopenharmony_ci snd_soc_component_get_drvdata(component); 115462306a36Sopenharmony_ci struct rt1011_bq_drc_params *bq_drc_info; 115562306a36Sopenharmony_ci struct rt1011_bq_drc_params *params = 115662306a36Sopenharmony_ci (struct rt1011_bq_drc_params *)ucontrol->value.integer.value; 115762306a36Sopenharmony_ci unsigned int i, mode_idx = 0; 115862306a36Sopenharmony_ci 115962306a36Sopenharmony_ci if (strstr(ucontrol->id.name, "AdvanceMode Initial Set")) 116062306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_INITIAL_SET; 116162306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode SEP BQ Coeff")) 116262306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_SEP_BQ_COEFF; 116362306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode EQ BQ Coeff")) 116462306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_EQ_BQ_COEFF; 116562306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode BQ UI Coeff")) 116662306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_BQ_UI_COEFF; 116762306a36Sopenharmony_ci else if (strstr(ucontrol->id.name, "AdvanceMode SmartBoost Coeff")) 116862306a36Sopenharmony_ci mode_idx = RT1011_ADVMODE_SMARTBOOST_COEFF; 116962306a36Sopenharmony_ci else 117062306a36Sopenharmony_ci return -EINVAL; 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci bq_drc_info = rt1011->bq_drc_params[mode_idx]; 117362306a36Sopenharmony_ci memset(bq_drc_info, 0, 117462306a36Sopenharmony_ci sizeof(struct rt1011_bq_drc_params) * RT1011_BQ_DRC_NUM); 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci pr_info("%s, id.name=%s, mode_idx=%d\n", __func__, 117762306a36Sopenharmony_ci ucontrol->id.name, mode_idx); 117862306a36Sopenharmony_ci for (i = 0; i < RT1011_BQ_DRC_NUM; i++) { 117962306a36Sopenharmony_ci bq_drc_info[i].reg = params[i].reg; 118062306a36Sopenharmony_ci bq_drc_info[i].val = params[i].val; 118162306a36Sopenharmony_ci } 118262306a36Sopenharmony_ci 118362306a36Sopenharmony_ci for (i = 0; i < RT1011_BQ_DRC_NUM; i++) { 118462306a36Sopenharmony_ci if (bq_drc_info[i].reg == 0) 118562306a36Sopenharmony_ci break; 118662306a36Sopenharmony_ci else if (rt1011_validate_bq_drc_coeff(bq_drc_info[i].reg)) { 118762306a36Sopenharmony_ci snd_soc_component_write(component, bq_drc_info[i].reg, 118862306a36Sopenharmony_ci bq_drc_info[i].val); 118962306a36Sopenharmony_ci } 119062306a36Sopenharmony_ci } 119162306a36Sopenharmony_ci 119262306a36Sopenharmony_ci return 0; 119362306a36Sopenharmony_ci} 119462306a36Sopenharmony_ci 119562306a36Sopenharmony_cistatic int rt1011_bq_drc_info(struct snd_kcontrol *kcontrol, 119662306a36Sopenharmony_ci struct snd_ctl_elem_info *uinfo) 119762306a36Sopenharmony_ci{ 119862306a36Sopenharmony_ci uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 119962306a36Sopenharmony_ci uinfo->count = 128; 120062306a36Sopenharmony_ci uinfo->value.integer.max = 0x17ffffff; 120162306a36Sopenharmony_ci 120262306a36Sopenharmony_ci return 0; 120362306a36Sopenharmony_ci} 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_ci#define RT1011_BQ_DRC(xname) \ 120662306a36Sopenharmony_ci{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 120762306a36Sopenharmony_ci .info = rt1011_bq_drc_info, \ 120862306a36Sopenharmony_ci .get = rt1011_bq_drc_coeff_get, \ 120962306a36Sopenharmony_ci .put = rt1011_bq_drc_coeff_put \ 121062306a36Sopenharmony_ci} 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_cistatic int rt1011_r0_cali_get(struct snd_kcontrol *kcontrol, 121362306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 121462306a36Sopenharmony_ci{ 121562306a36Sopenharmony_ci struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 121662306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 121762306a36Sopenharmony_ci 121862306a36Sopenharmony_ci ucontrol->value.integer.value[0] = rt1011->cali_done; 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci return 0; 122162306a36Sopenharmony_ci} 122262306a36Sopenharmony_ci 122362306a36Sopenharmony_cistatic int rt1011_r0_cali_put(struct snd_kcontrol *kcontrol, 122462306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 122562306a36Sopenharmony_ci{ 122662306a36Sopenharmony_ci struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 122762306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 122862306a36Sopenharmony_ci 122962306a36Sopenharmony_ci rt1011->cali_done = 0; 123062306a36Sopenharmony_ci if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF && 123162306a36Sopenharmony_ci ucontrol->value.integer.value[0]) 123262306a36Sopenharmony_ci rt1011_calibrate(rt1011, 1); 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci return 0; 123562306a36Sopenharmony_ci} 123662306a36Sopenharmony_ci 123762306a36Sopenharmony_cistatic int rt1011_r0_load(struct rt1011_priv *rt1011) 123862306a36Sopenharmony_ci{ 123962306a36Sopenharmony_ci if (!rt1011->r0_reg) 124062306a36Sopenharmony_ci return -EINVAL; 124162306a36Sopenharmony_ci 124262306a36Sopenharmony_ci /* write R0 to register */ 124362306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_INIT_RECIPROCAL_REG_24_16, 124462306a36Sopenharmony_ci ((rt1011->r0_reg>>16) & 0x1ff)); 124562306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_INIT_RECIPROCAL_REG_15_0, 124662306a36Sopenharmony_ci (rt1011->r0_reg & 0xffff)); 124762306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_4, 0x4080); 124862306a36Sopenharmony_ci 124962306a36Sopenharmony_ci return 0; 125062306a36Sopenharmony_ci} 125162306a36Sopenharmony_ci 125262306a36Sopenharmony_cistatic int rt1011_r0_load_mode_get(struct snd_kcontrol *kcontrol, 125362306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 125462306a36Sopenharmony_ci{ 125562306a36Sopenharmony_ci struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 125662306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 125762306a36Sopenharmony_ci 125862306a36Sopenharmony_ci ucontrol->value.integer.value[0] = rt1011->r0_reg; 125962306a36Sopenharmony_ci 126062306a36Sopenharmony_ci return 0; 126162306a36Sopenharmony_ci} 126262306a36Sopenharmony_ci 126362306a36Sopenharmony_cistatic int rt1011_r0_load_mode_put(struct snd_kcontrol *kcontrol, 126462306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 126562306a36Sopenharmony_ci{ 126662306a36Sopenharmony_ci struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); 126762306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 126862306a36Sopenharmony_ci struct device *dev; 126962306a36Sopenharmony_ci unsigned int r0_integer, r0_factor, format; 127062306a36Sopenharmony_ci 127162306a36Sopenharmony_ci if (ucontrol->value.integer.value[0] == rt1011->r0_reg) 127262306a36Sopenharmony_ci return 0; 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_ci if (ucontrol->value.integer.value[0] == 0) 127562306a36Sopenharmony_ci return -EINVAL; 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_ci dev = regmap_get_device(rt1011->regmap); 127862306a36Sopenharmony_ci if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) { 127962306a36Sopenharmony_ci rt1011->r0_reg = ucontrol->value.integer.value[0]; 128062306a36Sopenharmony_ci 128162306a36Sopenharmony_ci format = 2147483648U; /* 2^24 * 128 */ 128262306a36Sopenharmony_ci r0_integer = format / rt1011->r0_reg / 128; 128362306a36Sopenharmony_ci r0_factor = ((format / rt1011->r0_reg * 100) / 128) 128462306a36Sopenharmony_ci - (r0_integer * 100); 128562306a36Sopenharmony_ci dev_info(dev, "New r0 resistance about %d.%02d ohm, reg=0x%X\n", 128662306a36Sopenharmony_ci r0_integer, r0_factor, rt1011->r0_reg); 128762306a36Sopenharmony_ci 128862306a36Sopenharmony_ci if (rt1011->r0_reg) 128962306a36Sopenharmony_ci rt1011_r0_load(rt1011); 129062306a36Sopenharmony_ci } 129162306a36Sopenharmony_ci 129262306a36Sopenharmony_ci return 0; 129362306a36Sopenharmony_ci} 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_cistatic int rt1011_r0_load_info(struct snd_kcontrol *kcontrol, 129662306a36Sopenharmony_ci struct snd_ctl_elem_info *uinfo) 129762306a36Sopenharmony_ci{ 129862306a36Sopenharmony_ci uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 129962306a36Sopenharmony_ci uinfo->count = 1; 130062306a36Sopenharmony_ci uinfo->value.integer.max = 0x1ffffff; 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_ci return 0; 130362306a36Sopenharmony_ci} 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_ci#define RT1011_R0_LOAD(xname) \ 130662306a36Sopenharmony_ci{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 130762306a36Sopenharmony_ci .info = rt1011_r0_load_info, \ 130862306a36Sopenharmony_ci .get = rt1011_r0_load_mode_get, \ 130962306a36Sopenharmony_ci .put = rt1011_r0_load_mode_put \ 131062306a36Sopenharmony_ci} 131162306a36Sopenharmony_ci 131262306a36Sopenharmony_cistatic const char * const rt1011_i2s_ref[] = { 131362306a36Sopenharmony_ci "None", "Left Channel", "Right Channel" 131462306a36Sopenharmony_ci}; 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt1011_i2s_ref_enum, 0, 0, 131762306a36Sopenharmony_ci rt1011_i2s_ref); 131862306a36Sopenharmony_ci 131962306a36Sopenharmony_cistatic int rt1011_i2s_ref_put(struct snd_kcontrol *kcontrol, 132062306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 132162306a36Sopenharmony_ci{ 132262306a36Sopenharmony_ci struct snd_soc_component *component = 132362306a36Sopenharmony_ci snd_soc_kcontrol_component(kcontrol); 132462306a36Sopenharmony_ci struct rt1011_priv *rt1011 = 132562306a36Sopenharmony_ci snd_soc_component_get_drvdata(component); 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci rt1011->i2s_ref = ucontrol->value.enumerated.item[0]; 132862306a36Sopenharmony_ci switch (rt1011->i2s_ref) { 132962306a36Sopenharmony_ci case RT1011_I2S_REF_LEFT_CH: 133062306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_TDM_TOTAL_SET, 0x0240); 133162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_TDM1_SET_2, 0x8); 133262306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_TDM1_SET_1, 0x1022); 133362306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_ADCDAT_OUT_SOURCE, 0x4); 133462306a36Sopenharmony_ci break; 133562306a36Sopenharmony_ci case RT1011_I2S_REF_RIGHT_CH: 133662306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_TDM_TOTAL_SET, 0x0240); 133762306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_TDM1_SET_2, 0x8); 133862306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_TDM1_SET_1, 0x10a2); 133962306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_ADCDAT_OUT_SOURCE, 0x4); 134062306a36Sopenharmony_ci break; 134162306a36Sopenharmony_ci default: 134262306a36Sopenharmony_ci dev_info(component->dev, "I2S Reference: Do nothing\n"); 134362306a36Sopenharmony_ci } 134462306a36Sopenharmony_ci 134562306a36Sopenharmony_ci return 0; 134662306a36Sopenharmony_ci} 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_cistatic int rt1011_i2s_ref_get(struct snd_kcontrol *kcontrol, 134962306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 135062306a36Sopenharmony_ci{ 135162306a36Sopenharmony_ci struct snd_soc_component *component = 135262306a36Sopenharmony_ci snd_soc_kcontrol_component(kcontrol); 135362306a36Sopenharmony_ci struct rt1011_priv *rt1011 = 135462306a36Sopenharmony_ci snd_soc_component_get_drvdata(component); 135562306a36Sopenharmony_ci 135662306a36Sopenharmony_ci ucontrol->value.enumerated.item[0] = rt1011->i2s_ref; 135762306a36Sopenharmony_ci 135862306a36Sopenharmony_ci return 0; 135962306a36Sopenharmony_ci} 136062306a36Sopenharmony_ci 136162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt1011_snd_controls[] = { 136262306a36Sopenharmony_ci /* I2S Data In Selection */ 136362306a36Sopenharmony_ci SOC_ENUM("DIN Source", rt1011_din_source_enum), 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci /* TDM Data In Selection */ 136662306a36Sopenharmony_ci SOC_ENUM("TDM1 DIN Source", rt1011_tdm1_l_dac1_enum), 136762306a36Sopenharmony_ci SOC_ENUM("TDM2 DIN Source", rt1011_tdm2_l_dac1_enum), 136862306a36Sopenharmony_ci 136962306a36Sopenharmony_ci /* TDM1 Data Out Selection */ 137062306a36Sopenharmony_ci SOC_ENUM("TDM1 DOUT Source", rt1011_tdm1_adc1_dat_enum), 137162306a36Sopenharmony_ci SOC_ENUM("TDM1 DOUT Location", rt1011_tdm1_adc1_loc_enum), 137262306a36Sopenharmony_ci SOC_ENUM("TDM1 ADC1DAT Swap Select", rt1011_tdm_adc1_1_enum), 137362306a36Sopenharmony_ci SOC_ENUM("TDM1 ADC2DAT Swap Select", rt1011_tdm_adc2_1_enum), 137462306a36Sopenharmony_ci 137562306a36Sopenharmony_ci /* Data Out Mode */ 137662306a36Sopenharmony_ci SOC_ENUM("I2S ADC DOUT Mode", rt1011_adc_dout_mode_enum), 137762306a36Sopenharmony_ci SOC_ENUM("TDM1 DOUT Length", rt1011_tdm1_dout_len_enum), 137862306a36Sopenharmony_ci SOC_ENUM("TDM2 DOUT Length", rt1011_tdm2_dout_len_enum), 137962306a36Sopenharmony_ci 138062306a36Sopenharmony_ci /* Speaker/Receiver Mode */ 138162306a36Sopenharmony_ci SOC_SINGLE_EXT("RECV SPK Mode", SND_SOC_NOPM, 0, 1, 0, 138262306a36Sopenharmony_ci rt1011_recv_spk_mode_get, rt1011_recv_spk_mode_put), 138362306a36Sopenharmony_ci 138462306a36Sopenharmony_ci /* BiQuad/DRC/SmartBoost Settings */ 138562306a36Sopenharmony_ci RT1011_BQ_DRC("AdvanceMode Initial Set"), 138662306a36Sopenharmony_ci RT1011_BQ_DRC("AdvanceMode SEP BQ Coeff"), 138762306a36Sopenharmony_ci RT1011_BQ_DRC("AdvanceMode EQ BQ Coeff"), 138862306a36Sopenharmony_ci RT1011_BQ_DRC("AdvanceMode BQ UI Coeff"), 138962306a36Sopenharmony_ci RT1011_BQ_DRC("AdvanceMode SmartBoost Coeff"), 139062306a36Sopenharmony_ci 139162306a36Sopenharmony_ci /* R0 */ 139262306a36Sopenharmony_ci SOC_SINGLE_EXT("R0 Calibration", SND_SOC_NOPM, 0, 1, 0, 139362306a36Sopenharmony_ci rt1011_r0_cali_get, rt1011_r0_cali_put), 139462306a36Sopenharmony_ci RT1011_R0_LOAD("R0 Load Mode"), 139562306a36Sopenharmony_ci 139662306a36Sopenharmony_ci /* R0 temperature */ 139762306a36Sopenharmony_ci SOC_SINGLE("R0 Temperature", RT1011_STP_INITIAL_RESISTANCE_TEMP, 139862306a36Sopenharmony_ci 2, 255, 0), 139962306a36Sopenharmony_ci /* I2S Reference */ 140062306a36Sopenharmony_ci SOC_ENUM_EXT("I2S Reference", rt1011_i2s_ref_enum, 140162306a36Sopenharmony_ci rt1011_i2s_ref_get, rt1011_i2s_ref_put), 140262306a36Sopenharmony_ci}; 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_cistatic int rt1011_is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, 140562306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 140662306a36Sopenharmony_ci{ 140762306a36Sopenharmony_ci struct snd_soc_component *component = 140862306a36Sopenharmony_ci snd_soc_dapm_to_component(source->dapm); 140962306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 141062306a36Sopenharmony_ci 141162306a36Sopenharmony_ci if (rt1011->sysclk_src == RT1011_FS_SYS_PRE_S_PLL1) 141262306a36Sopenharmony_ci return 1; 141362306a36Sopenharmony_ci else 141462306a36Sopenharmony_ci return 0; 141562306a36Sopenharmony_ci} 141662306a36Sopenharmony_ci 141762306a36Sopenharmony_cistatic int rt1011_dac_event(struct snd_soc_dapm_widget *w, 141862306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 141962306a36Sopenharmony_ci{ 142062306a36Sopenharmony_ci struct snd_soc_component *component = 142162306a36Sopenharmony_ci snd_soc_dapm_to_component(w->dapm); 142262306a36Sopenharmony_ci 142362306a36Sopenharmony_ci switch (event) { 142462306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 142562306a36Sopenharmony_ci snd_soc_component_update_bits(component, 142662306a36Sopenharmony_ci RT1011_SPK_TEMP_PROTECT_0, 142762306a36Sopenharmony_ci RT1011_STP_EN_MASK | RT1011_STP_RS_CLB_EN_MASK, 142862306a36Sopenharmony_ci RT1011_STP_EN | RT1011_STP_RS_CLB_EN); 142962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_POWER_9, 143062306a36Sopenharmony_ci RT1011_POW_MNL_SDB_MASK, RT1011_POW_MNL_SDB); 143162306a36Sopenharmony_ci msleep(50); 143262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 143362306a36Sopenharmony_ci RT1011_CLASSD_INTERNAL_SET_1, 143462306a36Sopenharmony_ci RT1011_DRIVER_READY_SPK, RT1011_DRIVER_READY_SPK); 143562306a36Sopenharmony_ci break; 143662306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 143762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_POWER_9, 143862306a36Sopenharmony_ci RT1011_POW_MNL_SDB_MASK, 0); 143962306a36Sopenharmony_ci snd_soc_component_update_bits(component, 144062306a36Sopenharmony_ci RT1011_SPK_TEMP_PROTECT_0, 144162306a36Sopenharmony_ci RT1011_STP_EN_MASK | RT1011_STP_RS_CLB_EN_MASK, 0); 144262306a36Sopenharmony_ci msleep(200); 144362306a36Sopenharmony_ci snd_soc_component_update_bits(component, 144462306a36Sopenharmony_ci RT1011_CLASSD_INTERNAL_SET_1, 144562306a36Sopenharmony_ci RT1011_DRIVER_READY_SPK, 0); 144662306a36Sopenharmony_ci break; 144762306a36Sopenharmony_ci 144862306a36Sopenharmony_ci default: 144962306a36Sopenharmony_ci return 0; 145062306a36Sopenharmony_ci } 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_ci return 0; 145362306a36Sopenharmony_ci} 145462306a36Sopenharmony_ci 145562306a36Sopenharmony_ci 145662306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt1011_dapm_widgets[] = { 145762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("LDO2", RT1011_POWER_1, 145862306a36Sopenharmony_ci RT1011_POW_LDO2_BIT, 0, NULL, 0), 145962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ISENSE SPK", RT1011_POWER_1, 146062306a36Sopenharmony_ci RT1011_POW_ISENSE_SPK_BIT, 0, NULL, 0), 146162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("VSENSE SPK", RT1011_POWER_1, 146262306a36Sopenharmony_ci RT1011_POW_VSENSE_SPK_BIT, 0, NULL, 0), 146362306a36Sopenharmony_ci 146462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL", RT1011_POWER_2, 146562306a36Sopenharmony_ci RT1011_PLLEN_BIT, 0, NULL, 0), 146662306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("BG", RT1011_POWER_2, 146762306a36Sopenharmony_ci RT1011_POW_BG_BIT, 0, NULL, 0), 146862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("BG MBIAS", RT1011_POWER_2, 146962306a36Sopenharmony_ci RT1011_POW_BG_MBIAS_LV_BIT, 0, NULL, 0), 147062306a36Sopenharmony_ci 147162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DET VBAT", RT1011_POWER_3, 147262306a36Sopenharmony_ci RT1011_POW_DET_VBAT_BIT, 0, NULL, 0), 147362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MBIAS", RT1011_POWER_3, 147462306a36Sopenharmony_ci RT1011_POW_MBIAS_LV_BIT, 0, NULL, 0), 147562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC I", RT1011_POWER_3, 147662306a36Sopenharmony_ci RT1011_POW_ADC_I_BIT, 0, NULL, 0), 147762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC V", RT1011_POWER_3, 147862306a36Sopenharmony_ci RT1011_POW_ADC_V_BIT, 0, NULL, 0), 147962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC T", RT1011_POWER_3, 148062306a36Sopenharmony_ci RT1011_POW_ADC_T_BIT, 0, NULL, 0), 148162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DITHER ADC T", RT1011_POWER_3, 148262306a36Sopenharmony_ci RT1011_POWD_ADC_T_BIT, 0, NULL, 0), 148362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MIX I", RT1011_POWER_3, 148462306a36Sopenharmony_ci RT1011_POW_MIX_I_BIT, 0, NULL, 0), 148562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MIX V", RT1011_POWER_3, 148662306a36Sopenharmony_ci RT1011_POW_MIX_V_BIT, 0, NULL, 0), 148762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("SUM I", RT1011_POWER_3, 148862306a36Sopenharmony_ci RT1011_POW_SUM_I_BIT, 0, NULL, 0), 148962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("SUM V", RT1011_POWER_3, 149062306a36Sopenharmony_ci RT1011_POW_SUM_V_BIT, 0, NULL, 0), 149162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MIX T", RT1011_POWER_3, 149262306a36Sopenharmony_ci RT1011_POW_MIX_T_BIT, 0, NULL, 0), 149362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("VREF", RT1011_POWER_3, 149462306a36Sopenharmony_ci RT1011_POW_VREF_LV_BIT, 0, NULL, 0), 149562306a36Sopenharmony_ci 149662306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("BOOST SWR", RT1011_POWER_4, 149762306a36Sopenharmony_ci RT1011_POW_EN_SWR_BIT, 0, NULL, 0), 149862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("BGOK SWR", RT1011_POWER_4, 149962306a36Sopenharmony_ci RT1011_POW_EN_PASS_BGOK_SWR_BIT, 0, NULL, 0), 150062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("VPOK SWR", RT1011_POWER_4, 150162306a36Sopenharmony_ci RT1011_POW_EN_PASS_VPOK_SWR_BIT, 0, NULL, 0), 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("TEMP REG", RT1011_A_TEMP_SEN, 150462306a36Sopenharmony_ci RT1011_POW_TEMP_REG_BIT, 0, NULL, 0), 150562306a36Sopenharmony_ci 150662306a36Sopenharmony_ci /* Audio Interface */ 150762306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), 150862306a36Sopenharmony_ci /* Digital Interface */ 150962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC Power", RT1011_POWER_1, 151062306a36Sopenharmony_ci RT1011_POW_DAC_BIT, 0, NULL, 0), 151162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CLK12M", RT1011_POWER_1, 151262306a36Sopenharmony_ci RT1011_POW_CLK12M_BIT, 0, NULL, 0), 151362306a36Sopenharmony_ci SND_SOC_DAPM_DAC_E("DAC", NULL, RT1011_DAC_SET_3, 151462306a36Sopenharmony_ci RT1011_DA_MUTE_EN_SFT, 1, rt1011_dac_event, 151562306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 151662306a36Sopenharmony_ci 151762306a36Sopenharmony_ci /* Output Lines */ 151862306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("SPO"), 151962306a36Sopenharmony_ci}; 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt1011_dapm_routes[] = { 152262306a36Sopenharmony_ci 152362306a36Sopenharmony_ci { "DAC", NULL, "AIF1RX" }, 152462306a36Sopenharmony_ci { "DAC", NULL, "DAC Power" }, 152562306a36Sopenharmony_ci { "DAC", NULL, "LDO2" }, 152662306a36Sopenharmony_ci { "DAC", NULL, "ISENSE SPK" }, 152762306a36Sopenharmony_ci { "DAC", NULL, "VSENSE SPK" }, 152862306a36Sopenharmony_ci { "DAC", NULL, "CLK12M" }, 152962306a36Sopenharmony_ci 153062306a36Sopenharmony_ci { "DAC", NULL, "PLL", rt1011_is_sys_clk_from_pll }, 153162306a36Sopenharmony_ci { "DAC", NULL, "BG" }, 153262306a36Sopenharmony_ci { "DAC", NULL, "BG MBIAS" }, 153362306a36Sopenharmony_ci 153462306a36Sopenharmony_ci { "DAC", NULL, "BOOST SWR" }, 153562306a36Sopenharmony_ci { "DAC", NULL, "BGOK SWR" }, 153662306a36Sopenharmony_ci { "DAC", NULL, "VPOK SWR" }, 153762306a36Sopenharmony_ci 153862306a36Sopenharmony_ci { "DAC", NULL, "DET VBAT" }, 153962306a36Sopenharmony_ci { "DAC", NULL, "MBIAS" }, 154062306a36Sopenharmony_ci { "DAC", NULL, "VREF" }, 154162306a36Sopenharmony_ci { "DAC", NULL, "ADC I" }, 154262306a36Sopenharmony_ci { "DAC", NULL, "ADC V" }, 154362306a36Sopenharmony_ci { "DAC", NULL, "ADC T" }, 154462306a36Sopenharmony_ci { "DAC", NULL, "DITHER ADC T" }, 154562306a36Sopenharmony_ci { "DAC", NULL, "MIX I" }, 154662306a36Sopenharmony_ci { "DAC", NULL, "MIX V" }, 154762306a36Sopenharmony_ci { "DAC", NULL, "SUM I" }, 154862306a36Sopenharmony_ci { "DAC", NULL, "SUM V" }, 154962306a36Sopenharmony_ci { "DAC", NULL, "MIX T" }, 155062306a36Sopenharmony_ci 155162306a36Sopenharmony_ci { "DAC", NULL, "TEMP REG" }, 155262306a36Sopenharmony_ci 155362306a36Sopenharmony_ci { "SPO", NULL, "DAC" }, 155462306a36Sopenharmony_ci}; 155562306a36Sopenharmony_ci 155662306a36Sopenharmony_cistatic int rt1011_get_clk_info(int sclk, int rate) 155762306a36Sopenharmony_ci{ 155862306a36Sopenharmony_ci int i; 155962306a36Sopenharmony_ci static const int pd[] = {1, 2, 3, 4, 6, 8, 12, 16}; 156062306a36Sopenharmony_ci 156162306a36Sopenharmony_ci if (sclk <= 0 || rate <= 0) 156262306a36Sopenharmony_ci return -EINVAL; 156362306a36Sopenharmony_ci 156462306a36Sopenharmony_ci rate = rate << 8; 156562306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(pd); i++) 156662306a36Sopenharmony_ci if (sclk == rate * pd[i]) 156762306a36Sopenharmony_ci return i; 156862306a36Sopenharmony_ci 156962306a36Sopenharmony_ci return -EINVAL; 157062306a36Sopenharmony_ci} 157162306a36Sopenharmony_ci 157262306a36Sopenharmony_cistatic int rt1011_hw_params(struct snd_pcm_substream *substream, 157362306a36Sopenharmony_ci struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 157462306a36Sopenharmony_ci{ 157562306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 157662306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 157762306a36Sopenharmony_ci unsigned int val_len = 0, ch_len = 0, val_clk, mask_clk; 157862306a36Sopenharmony_ci int pre_div, bclk_ms, frame_size; 157962306a36Sopenharmony_ci 158062306a36Sopenharmony_ci rt1011->lrck = params_rate(params); 158162306a36Sopenharmony_ci pre_div = rt1011_get_clk_info(rt1011->sysclk, rt1011->lrck); 158262306a36Sopenharmony_ci if (pre_div < 0) { 158362306a36Sopenharmony_ci dev_warn(component->dev, "Force using PLL "); 158462306a36Sopenharmony_ci snd_soc_dai_set_pll(dai, 0, RT1011_PLL1_S_BCLK, 158562306a36Sopenharmony_ci rt1011->lrck * 64, rt1011->lrck * 256); 158662306a36Sopenharmony_ci snd_soc_dai_set_sysclk(dai, RT1011_FS_SYS_PRE_S_PLL1, 158762306a36Sopenharmony_ci rt1011->lrck * 256, SND_SOC_CLOCK_IN); 158862306a36Sopenharmony_ci pre_div = 0; 158962306a36Sopenharmony_ci } 159062306a36Sopenharmony_ci frame_size = snd_soc_params_to_frame_size(params); 159162306a36Sopenharmony_ci if (frame_size < 0) { 159262306a36Sopenharmony_ci dev_err(component->dev, "Unsupported frame size: %d\n", 159362306a36Sopenharmony_ci frame_size); 159462306a36Sopenharmony_ci return -EINVAL; 159562306a36Sopenharmony_ci } 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_ci bclk_ms = frame_size > 32; 159862306a36Sopenharmony_ci rt1011->bclk = rt1011->lrck * (32 << bclk_ms); 159962306a36Sopenharmony_ci 160062306a36Sopenharmony_ci dev_dbg(component->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", 160162306a36Sopenharmony_ci bclk_ms, pre_div, dai->id); 160262306a36Sopenharmony_ci 160362306a36Sopenharmony_ci dev_dbg(component->dev, "lrck is %dHz and pre_div is %d for iis %d\n", 160462306a36Sopenharmony_ci rt1011->lrck, pre_div, dai->id); 160562306a36Sopenharmony_ci 160662306a36Sopenharmony_ci switch (params_width(params)) { 160762306a36Sopenharmony_ci case 16: 160862306a36Sopenharmony_ci val_len |= RT1011_I2S_TX_DL_16B; 160962306a36Sopenharmony_ci val_len |= RT1011_I2S_RX_DL_16B; 161062306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_TX_LEN_16B; 161162306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_RX_LEN_16B; 161262306a36Sopenharmony_ci break; 161362306a36Sopenharmony_ci case 20: 161462306a36Sopenharmony_ci val_len |= RT1011_I2S_TX_DL_20B; 161562306a36Sopenharmony_ci val_len |= RT1011_I2S_RX_DL_20B; 161662306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_TX_LEN_20B; 161762306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_RX_LEN_20B; 161862306a36Sopenharmony_ci break; 161962306a36Sopenharmony_ci case 24: 162062306a36Sopenharmony_ci val_len |= RT1011_I2S_TX_DL_24B; 162162306a36Sopenharmony_ci val_len |= RT1011_I2S_RX_DL_24B; 162262306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_TX_LEN_24B; 162362306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_RX_LEN_24B; 162462306a36Sopenharmony_ci break; 162562306a36Sopenharmony_ci case 32: 162662306a36Sopenharmony_ci val_len |= RT1011_I2S_TX_DL_32B; 162762306a36Sopenharmony_ci val_len |= RT1011_I2S_RX_DL_32B; 162862306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_TX_LEN_32B; 162962306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_RX_LEN_32B; 163062306a36Sopenharmony_ci break; 163162306a36Sopenharmony_ci case 8: 163262306a36Sopenharmony_ci val_len |= RT1011_I2S_TX_DL_8B; 163362306a36Sopenharmony_ci val_len |= RT1011_I2S_RX_DL_8B; 163462306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_TX_LEN_8B; 163562306a36Sopenharmony_ci ch_len |= RT1011_I2S_CH_RX_LEN_8B; 163662306a36Sopenharmony_ci break; 163762306a36Sopenharmony_ci default: 163862306a36Sopenharmony_ci return -EINVAL; 163962306a36Sopenharmony_ci } 164062306a36Sopenharmony_ci 164162306a36Sopenharmony_ci switch (dai->id) { 164262306a36Sopenharmony_ci case RT1011_AIF1: 164362306a36Sopenharmony_ci mask_clk = RT1011_FS_SYS_DIV_MASK; 164462306a36Sopenharmony_ci val_clk = pre_div << RT1011_FS_SYS_DIV_SFT; 164562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM_TOTAL_SET, 164662306a36Sopenharmony_ci RT1011_I2S_TX_DL_MASK | RT1011_I2S_RX_DL_MASK, 164762306a36Sopenharmony_ci val_len); 164862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM1_SET_1, 164962306a36Sopenharmony_ci RT1011_I2S_CH_TX_LEN_MASK | 165062306a36Sopenharmony_ci RT1011_I2S_CH_RX_LEN_MASK, 165162306a36Sopenharmony_ci ch_len); 165262306a36Sopenharmony_ci break; 165362306a36Sopenharmony_ci default: 165462306a36Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 165562306a36Sopenharmony_ci return -EINVAL; 165662306a36Sopenharmony_ci } 165762306a36Sopenharmony_ci 165862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 165962306a36Sopenharmony_ci RT1011_CLK_2, mask_clk, val_clk); 166062306a36Sopenharmony_ci 166162306a36Sopenharmony_ci return 0; 166262306a36Sopenharmony_ci} 166362306a36Sopenharmony_ci 166462306a36Sopenharmony_cistatic int rt1011_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) 166562306a36Sopenharmony_ci{ 166662306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 166762306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = 166862306a36Sopenharmony_ci snd_soc_component_get_dapm(component); 166962306a36Sopenharmony_ci unsigned int reg_val = 0, reg_bclk_inv = 0; 167062306a36Sopenharmony_ci int ret = 0; 167162306a36Sopenharmony_ci 167262306a36Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 167362306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 167462306a36Sopenharmony_ci case SND_SOC_DAIFMT_CBS_CFS: 167562306a36Sopenharmony_ci reg_val |= RT1011_I2S_TDM_MS_S; 167662306a36Sopenharmony_ci break; 167762306a36Sopenharmony_ci default: 167862306a36Sopenharmony_ci ret = -EINVAL; 167962306a36Sopenharmony_ci goto _set_fmt_err_; 168062306a36Sopenharmony_ci } 168162306a36Sopenharmony_ci 168262306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 168362306a36Sopenharmony_ci case SND_SOC_DAIFMT_NB_NF: 168462306a36Sopenharmony_ci break; 168562306a36Sopenharmony_ci case SND_SOC_DAIFMT_IB_NF: 168662306a36Sopenharmony_ci reg_bclk_inv |= RT1011_TDM_INV_BCLK; 168762306a36Sopenharmony_ci break; 168862306a36Sopenharmony_ci default: 168962306a36Sopenharmony_ci ret = -EINVAL; 169062306a36Sopenharmony_ci goto _set_fmt_err_; 169162306a36Sopenharmony_ci } 169262306a36Sopenharmony_ci 169362306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 169462306a36Sopenharmony_ci case SND_SOC_DAIFMT_I2S: 169562306a36Sopenharmony_ci break; 169662306a36Sopenharmony_ci case SND_SOC_DAIFMT_LEFT_J: 169762306a36Sopenharmony_ci reg_val |= RT1011_I2S_TDM_DF_LEFT; 169862306a36Sopenharmony_ci break; 169962306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_A: 170062306a36Sopenharmony_ci reg_val |= RT1011_I2S_TDM_DF_PCM_A; 170162306a36Sopenharmony_ci break; 170262306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_B: 170362306a36Sopenharmony_ci reg_val |= RT1011_I2S_TDM_DF_PCM_B; 170462306a36Sopenharmony_ci break; 170562306a36Sopenharmony_ci default: 170662306a36Sopenharmony_ci ret = -EINVAL; 170762306a36Sopenharmony_ci goto _set_fmt_err_; 170862306a36Sopenharmony_ci } 170962306a36Sopenharmony_ci 171062306a36Sopenharmony_ci switch (dai->id) { 171162306a36Sopenharmony_ci case RT1011_AIF1: 171262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM_TOTAL_SET, 171362306a36Sopenharmony_ci RT1011_I2S_TDM_MS_MASK | RT1011_I2S_TDM_DF_MASK, 171462306a36Sopenharmony_ci reg_val); 171562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM1_SET_1, 171662306a36Sopenharmony_ci RT1011_TDM_INV_BCLK_MASK, reg_bclk_inv); 171762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM2_SET_1, 171862306a36Sopenharmony_ci RT1011_TDM_INV_BCLK_MASK, reg_bclk_inv); 171962306a36Sopenharmony_ci break; 172062306a36Sopenharmony_ci default: 172162306a36Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 172262306a36Sopenharmony_ci ret = -EINVAL; 172362306a36Sopenharmony_ci } 172462306a36Sopenharmony_ci 172562306a36Sopenharmony_ci_set_fmt_err_: 172662306a36Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 172762306a36Sopenharmony_ci return ret; 172862306a36Sopenharmony_ci} 172962306a36Sopenharmony_ci 173062306a36Sopenharmony_cistatic int rt1011_set_component_sysclk(struct snd_soc_component *component, 173162306a36Sopenharmony_ci int clk_id, int source, unsigned int freq, int dir) 173262306a36Sopenharmony_ci{ 173362306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 173462306a36Sopenharmony_ci unsigned int reg_val = 0; 173562306a36Sopenharmony_ci 173662306a36Sopenharmony_ci if (freq == rt1011->sysclk && clk_id == rt1011->sysclk_src) 173762306a36Sopenharmony_ci return 0; 173862306a36Sopenharmony_ci 173962306a36Sopenharmony_ci /* disable MCLK detect in default */ 174062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_DET, 174162306a36Sopenharmony_ci RT1011_EN_MCLK_DET_MASK, 0); 174262306a36Sopenharmony_ci 174362306a36Sopenharmony_ci switch (clk_id) { 174462306a36Sopenharmony_ci case RT1011_FS_SYS_PRE_S_MCLK: 174562306a36Sopenharmony_ci reg_val |= RT1011_FS_SYS_PRE_MCLK; 174662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_DET, 174762306a36Sopenharmony_ci RT1011_EN_MCLK_DET_MASK, RT1011_EN_MCLK_DET); 174862306a36Sopenharmony_ci break; 174962306a36Sopenharmony_ci case RT1011_FS_SYS_PRE_S_BCLK: 175062306a36Sopenharmony_ci reg_val |= RT1011_FS_SYS_PRE_BCLK; 175162306a36Sopenharmony_ci break; 175262306a36Sopenharmony_ci case RT1011_FS_SYS_PRE_S_PLL1: 175362306a36Sopenharmony_ci reg_val |= RT1011_FS_SYS_PRE_PLL1; 175462306a36Sopenharmony_ci break; 175562306a36Sopenharmony_ci case RT1011_FS_SYS_PRE_S_RCCLK: 175662306a36Sopenharmony_ci reg_val |= RT1011_FS_SYS_PRE_RCCLK; 175762306a36Sopenharmony_ci break; 175862306a36Sopenharmony_ci default: 175962306a36Sopenharmony_ci dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); 176062306a36Sopenharmony_ci return -EINVAL; 176162306a36Sopenharmony_ci } 176262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_2, 176362306a36Sopenharmony_ci RT1011_FS_SYS_PRE_MASK, reg_val); 176462306a36Sopenharmony_ci rt1011->sysclk = freq; 176562306a36Sopenharmony_ci rt1011->sysclk_src = clk_id; 176662306a36Sopenharmony_ci 176762306a36Sopenharmony_ci dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", 176862306a36Sopenharmony_ci freq, clk_id); 176962306a36Sopenharmony_ci 177062306a36Sopenharmony_ci return 0; 177162306a36Sopenharmony_ci} 177262306a36Sopenharmony_ci 177362306a36Sopenharmony_cistatic int rt1011_set_component_pll(struct snd_soc_component *component, 177462306a36Sopenharmony_ci int pll_id, int source, unsigned int freq_in, 177562306a36Sopenharmony_ci unsigned int freq_out) 177662306a36Sopenharmony_ci{ 177762306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 177862306a36Sopenharmony_ci struct rl6231_pll_code pll_code; 177962306a36Sopenharmony_ci int ret; 178062306a36Sopenharmony_ci 178162306a36Sopenharmony_ci if (source == rt1011->pll_src && freq_in == rt1011->pll_in && 178262306a36Sopenharmony_ci freq_out == rt1011->pll_out) 178362306a36Sopenharmony_ci return 0; 178462306a36Sopenharmony_ci 178562306a36Sopenharmony_ci if (!freq_in || !freq_out) { 178662306a36Sopenharmony_ci dev_dbg(component->dev, "PLL disabled\n"); 178762306a36Sopenharmony_ci 178862306a36Sopenharmony_ci rt1011->pll_in = 0; 178962306a36Sopenharmony_ci rt1011->pll_out = 0; 179062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_2, 179162306a36Sopenharmony_ci RT1011_FS_SYS_PRE_MASK, RT1011_FS_SYS_PRE_BCLK); 179262306a36Sopenharmony_ci return 0; 179362306a36Sopenharmony_ci } 179462306a36Sopenharmony_ci 179562306a36Sopenharmony_ci switch (source) { 179662306a36Sopenharmony_ci case RT1011_PLL2_S_MCLK: 179762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_2, 179862306a36Sopenharmony_ci RT1011_PLL2_SRC_MASK, RT1011_PLL2_SRC_MCLK); 179962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_2, 180062306a36Sopenharmony_ci RT1011_PLL1_SRC_MASK, RT1011_PLL1_SRC_PLL2); 180162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_DET, 180262306a36Sopenharmony_ci RT1011_EN_MCLK_DET_MASK, RT1011_EN_MCLK_DET); 180362306a36Sopenharmony_ci break; 180462306a36Sopenharmony_ci case RT1011_PLL1_S_BCLK: 180562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_2, 180662306a36Sopenharmony_ci RT1011_PLL1_SRC_MASK, RT1011_PLL1_SRC_BCLK); 180762306a36Sopenharmony_ci break; 180862306a36Sopenharmony_ci case RT1011_PLL2_S_RCCLK: 180962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_2, 181062306a36Sopenharmony_ci RT1011_PLL2_SRC_MASK, RT1011_PLL2_SRC_RCCLK); 181162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_CLK_2, 181262306a36Sopenharmony_ci RT1011_PLL1_SRC_MASK, RT1011_PLL1_SRC_PLL2); 181362306a36Sopenharmony_ci break; 181462306a36Sopenharmony_ci default: 181562306a36Sopenharmony_ci dev_err(component->dev, "Unknown PLL Source %d\n", source); 181662306a36Sopenharmony_ci return -EINVAL; 181762306a36Sopenharmony_ci } 181862306a36Sopenharmony_ci 181962306a36Sopenharmony_ci ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); 182062306a36Sopenharmony_ci if (ret < 0) { 182162306a36Sopenharmony_ci dev_err(component->dev, "Unsupported input clock %d\n", 182262306a36Sopenharmony_ci freq_in); 182362306a36Sopenharmony_ci return ret; 182462306a36Sopenharmony_ci } 182562306a36Sopenharmony_ci 182662306a36Sopenharmony_ci dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", 182762306a36Sopenharmony_ci pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), 182862306a36Sopenharmony_ci pll_code.n_code, pll_code.k_code); 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_ci snd_soc_component_write(component, RT1011_PLL_1, 183162306a36Sopenharmony_ci ((pll_code.m_bp ? 0 : pll_code.m_code) << RT1011_PLL1_QM_SFT) | 183262306a36Sopenharmony_ci (pll_code.m_bp << RT1011_PLL1_BPM_SFT) | 183362306a36Sopenharmony_ci pll_code.n_code); 183462306a36Sopenharmony_ci snd_soc_component_write(component, RT1011_PLL_2, 183562306a36Sopenharmony_ci pll_code.k_code); 183662306a36Sopenharmony_ci 183762306a36Sopenharmony_ci rt1011->pll_in = freq_in; 183862306a36Sopenharmony_ci rt1011->pll_out = freq_out; 183962306a36Sopenharmony_ci rt1011->pll_src = source; 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci return 0; 184262306a36Sopenharmony_ci} 184362306a36Sopenharmony_ci 184462306a36Sopenharmony_cistatic int rt1011_set_tdm_slot(struct snd_soc_dai *dai, 184562306a36Sopenharmony_ci unsigned int tx_mask, unsigned int rx_mask, int slots, int slot_width) 184662306a36Sopenharmony_ci{ 184762306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 184862306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = 184962306a36Sopenharmony_ci snd_soc_component_get_dapm(component); 185062306a36Sopenharmony_ci unsigned int val = 0, tdm_en = 0, rx_slotnum, tx_slotnum; 185162306a36Sopenharmony_ci int ret = 0, first_bit, last_bit; 185262306a36Sopenharmony_ci 185362306a36Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 185462306a36Sopenharmony_ci if (rx_mask || tx_mask) 185562306a36Sopenharmony_ci tdm_en = RT1011_TDM_I2S_DOCK_EN_1; 185662306a36Sopenharmony_ci 185762306a36Sopenharmony_ci switch (slots) { 185862306a36Sopenharmony_ci case 4: 185962306a36Sopenharmony_ci val |= RT1011_I2S_TX_4CH; 186062306a36Sopenharmony_ci val |= RT1011_I2S_RX_4CH; 186162306a36Sopenharmony_ci break; 186262306a36Sopenharmony_ci case 6: 186362306a36Sopenharmony_ci val |= RT1011_I2S_TX_6CH; 186462306a36Sopenharmony_ci val |= RT1011_I2S_RX_6CH; 186562306a36Sopenharmony_ci break; 186662306a36Sopenharmony_ci case 8: 186762306a36Sopenharmony_ci val |= RT1011_I2S_TX_8CH; 186862306a36Sopenharmony_ci val |= RT1011_I2S_RX_8CH; 186962306a36Sopenharmony_ci break; 187062306a36Sopenharmony_ci case 2: 187162306a36Sopenharmony_ci break; 187262306a36Sopenharmony_ci default: 187362306a36Sopenharmony_ci ret = -EINVAL; 187462306a36Sopenharmony_ci goto _set_tdm_err_; 187562306a36Sopenharmony_ci } 187662306a36Sopenharmony_ci 187762306a36Sopenharmony_ci switch (slot_width) { 187862306a36Sopenharmony_ci case 20: 187962306a36Sopenharmony_ci val |= RT1011_I2S_CH_TX_LEN_20B; 188062306a36Sopenharmony_ci val |= RT1011_I2S_CH_RX_LEN_20B; 188162306a36Sopenharmony_ci break; 188262306a36Sopenharmony_ci case 24: 188362306a36Sopenharmony_ci val |= RT1011_I2S_CH_TX_LEN_24B; 188462306a36Sopenharmony_ci val |= RT1011_I2S_CH_RX_LEN_24B; 188562306a36Sopenharmony_ci break; 188662306a36Sopenharmony_ci case 32: 188762306a36Sopenharmony_ci val |= RT1011_I2S_CH_TX_LEN_32B; 188862306a36Sopenharmony_ci val |= RT1011_I2S_CH_RX_LEN_32B; 188962306a36Sopenharmony_ci break; 189062306a36Sopenharmony_ci case 16: 189162306a36Sopenharmony_ci break; 189262306a36Sopenharmony_ci default: 189362306a36Sopenharmony_ci ret = -EINVAL; 189462306a36Sopenharmony_ci goto _set_tdm_err_; 189562306a36Sopenharmony_ci } 189662306a36Sopenharmony_ci 189762306a36Sopenharmony_ci /* Rx slot configuration */ 189862306a36Sopenharmony_ci rx_slotnum = hweight_long(rx_mask); 189962306a36Sopenharmony_ci if (rx_slotnum > 1 || !rx_slotnum) { 190062306a36Sopenharmony_ci ret = -EINVAL; 190162306a36Sopenharmony_ci dev_err(component->dev, "too many rx slots or zero slot\n"); 190262306a36Sopenharmony_ci goto _set_tdm_err_; 190362306a36Sopenharmony_ci } 190462306a36Sopenharmony_ci 190562306a36Sopenharmony_ci first_bit = __ffs(rx_mask); 190662306a36Sopenharmony_ci switch (first_bit) { 190762306a36Sopenharmony_ci case 0: 190862306a36Sopenharmony_ci case 2: 190962306a36Sopenharmony_ci case 4: 191062306a36Sopenharmony_ci case 6: 191162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 191262306a36Sopenharmony_ci RT1011_CROSS_BQ_SET_1, RT1011_MONO_LR_SEL_MASK, 191362306a36Sopenharmony_ci RT1011_MONO_L_CHANNEL); 191462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 191562306a36Sopenharmony_ci RT1011_TDM1_SET_4, 191662306a36Sopenharmony_ci RT1011_TDM_I2S_TX_L_DAC1_1_MASK | 191762306a36Sopenharmony_ci RT1011_TDM_I2S_TX_R_DAC1_1_MASK, 191862306a36Sopenharmony_ci (first_bit << RT1011_TDM_I2S_TX_L_DAC1_1_SFT) | 191962306a36Sopenharmony_ci ((first_bit+1) << RT1011_TDM_I2S_TX_R_DAC1_1_SFT)); 192062306a36Sopenharmony_ci break; 192162306a36Sopenharmony_ci case 1: 192262306a36Sopenharmony_ci case 3: 192362306a36Sopenharmony_ci case 5: 192462306a36Sopenharmony_ci case 7: 192562306a36Sopenharmony_ci snd_soc_component_update_bits(component, 192662306a36Sopenharmony_ci RT1011_CROSS_BQ_SET_1, RT1011_MONO_LR_SEL_MASK, 192762306a36Sopenharmony_ci RT1011_MONO_R_CHANNEL); 192862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 192962306a36Sopenharmony_ci RT1011_TDM1_SET_4, 193062306a36Sopenharmony_ci RT1011_TDM_I2S_TX_L_DAC1_1_MASK | 193162306a36Sopenharmony_ci RT1011_TDM_I2S_TX_R_DAC1_1_MASK, 193262306a36Sopenharmony_ci ((first_bit-1) << RT1011_TDM_I2S_TX_L_DAC1_1_SFT) | 193362306a36Sopenharmony_ci (first_bit << RT1011_TDM_I2S_TX_R_DAC1_1_SFT)); 193462306a36Sopenharmony_ci break; 193562306a36Sopenharmony_ci default: 193662306a36Sopenharmony_ci ret = -EINVAL; 193762306a36Sopenharmony_ci goto _set_tdm_err_; 193862306a36Sopenharmony_ci } 193962306a36Sopenharmony_ci 194062306a36Sopenharmony_ci /* Tx slot configuration */ 194162306a36Sopenharmony_ci tx_slotnum = hweight_long(tx_mask); 194262306a36Sopenharmony_ci if (tx_slotnum > 2 || !tx_slotnum) { 194362306a36Sopenharmony_ci ret = -EINVAL; 194462306a36Sopenharmony_ci dev_err(component->dev, "too many tx slots or zero slot\n"); 194562306a36Sopenharmony_ci goto _set_tdm_err_; 194662306a36Sopenharmony_ci } 194762306a36Sopenharmony_ci 194862306a36Sopenharmony_ci first_bit = __ffs(tx_mask); 194962306a36Sopenharmony_ci last_bit = __fls(tx_mask); 195062306a36Sopenharmony_ci if (last_bit - first_bit > 1) { 195162306a36Sopenharmony_ci ret = -EINVAL; 195262306a36Sopenharmony_ci dev_err(component->dev, "tx slot location error\n"); 195362306a36Sopenharmony_ci goto _set_tdm_err_; 195462306a36Sopenharmony_ci } 195562306a36Sopenharmony_ci 195662306a36Sopenharmony_ci if (tx_slotnum == 1) { 195762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM1_SET_2, 195862306a36Sopenharmony_ci RT1011_TDM_I2S_DOCK_ADCDAT_LEN_1_MASK | 195962306a36Sopenharmony_ci RT1011_TDM_ADCDAT1_DATA_LOCATION, first_bit); 196062306a36Sopenharmony_ci switch (first_bit) { 196162306a36Sopenharmony_ci case 1: 196262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 196362306a36Sopenharmony_ci RT1011_TDM1_SET_3, 196462306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC1_1_MASK, 196562306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC1_1_LL); 196662306a36Sopenharmony_ci break; 196762306a36Sopenharmony_ci case 3: 196862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 196962306a36Sopenharmony_ci RT1011_TDM1_SET_3, 197062306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC2_1_MASK, 197162306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC2_1_LL); 197262306a36Sopenharmony_ci break; 197362306a36Sopenharmony_ci case 5: 197462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 197562306a36Sopenharmony_ci RT1011_TDM1_SET_3, 197662306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC3_1_MASK, 197762306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC3_1_LL); 197862306a36Sopenharmony_ci break; 197962306a36Sopenharmony_ci case 7: 198062306a36Sopenharmony_ci snd_soc_component_update_bits(component, 198162306a36Sopenharmony_ci RT1011_TDM1_SET_3, 198262306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC4_1_MASK, 198362306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC4_1_LL); 198462306a36Sopenharmony_ci break; 198562306a36Sopenharmony_ci case 0: 198662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 198762306a36Sopenharmony_ci RT1011_TDM1_SET_3, 198862306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC1_1_MASK, 0); 198962306a36Sopenharmony_ci break; 199062306a36Sopenharmony_ci case 2: 199162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 199262306a36Sopenharmony_ci RT1011_TDM1_SET_3, 199362306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC2_1_MASK, 0); 199462306a36Sopenharmony_ci break; 199562306a36Sopenharmony_ci case 4: 199662306a36Sopenharmony_ci snd_soc_component_update_bits(component, 199762306a36Sopenharmony_ci RT1011_TDM1_SET_3, 199862306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC3_1_MASK, 0); 199962306a36Sopenharmony_ci break; 200062306a36Sopenharmony_ci case 6: 200162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 200262306a36Sopenharmony_ci RT1011_TDM1_SET_3, 200362306a36Sopenharmony_ci RT1011_TDM_I2S_RX_ADC4_1_MASK, 0); 200462306a36Sopenharmony_ci break; 200562306a36Sopenharmony_ci default: 200662306a36Sopenharmony_ci ret = -EINVAL; 200762306a36Sopenharmony_ci dev_dbg(component->dev, 200862306a36Sopenharmony_ci "tx slot location error\n"); 200962306a36Sopenharmony_ci goto _set_tdm_err_; 201062306a36Sopenharmony_ci } 201162306a36Sopenharmony_ci } else if (tx_slotnum == 2) { 201262306a36Sopenharmony_ci switch (first_bit) { 201362306a36Sopenharmony_ci case 0: 201462306a36Sopenharmony_ci case 2: 201562306a36Sopenharmony_ci case 4: 201662306a36Sopenharmony_ci case 6: 201762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 201862306a36Sopenharmony_ci RT1011_TDM1_SET_2, 201962306a36Sopenharmony_ci RT1011_TDM_I2S_DOCK_ADCDAT_LEN_1_MASK | 202062306a36Sopenharmony_ci RT1011_TDM_ADCDAT1_DATA_LOCATION, 202162306a36Sopenharmony_ci RT1011_TDM_I2S_DOCK_ADCDAT_2CH | first_bit); 202262306a36Sopenharmony_ci break; 202362306a36Sopenharmony_ci default: 202462306a36Sopenharmony_ci ret = -EINVAL; 202562306a36Sopenharmony_ci dev_dbg(component->dev, 202662306a36Sopenharmony_ci "tx slot location should be paired and start from slot0/2/4/6\n"); 202762306a36Sopenharmony_ci goto _set_tdm_err_; 202862306a36Sopenharmony_ci } 202962306a36Sopenharmony_ci } 203062306a36Sopenharmony_ci 203162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM1_SET_1, 203262306a36Sopenharmony_ci RT1011_I2S_CH_TX_MASK | RT1011_I2S_CH_RX_MASK | 203362306a36Sopenharmony_ci RT1011_I2S_CH_TX_LEN_MASK | RT1011_I2S_CH_RX_LEN_MASK, val); 203462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM2_SET_1, 203562306a36Sopenharmony_ci RT1011_I2S_CH_TX_MASK | RT1011_I2S_CH_RX_MASK | 203662306a36Sopenharmony_ci RT1011_I2S_CH_TX_LEN_MASK | RT1011_I2S_CH_RX_LEN_MASK, val); 203762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM1_SET_2, 203862306a36Sopenharmony_ci RT1011_TDM_I2S_DOCK_EN_1_MASK, tdm_en); 203962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM2_SET_2, 204062306a36Sopenharmony_ci RT1011_TDM_I2S_DOCK_EN_2_MASK, tdm_en); 204162306a36Sopenharmony_ci 204262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT1011_TDM_TOTAL_SET, 204362306a36Sopenharmony_ci RT1011_ADCDAT1_PIN_CONFIG | RT1011_ADCDAT2_PIN_CONFIG, 204462306a36Sopenharmony_ci RT1011_ADCDAT1_OUTPUT | RT1011_ADCDAT2_OUTPUT); 204562306a36Sopenharmony_ci 204662306a36Sopenharmony_ci_set_tdm_err_: 204762306a36Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 204862306a36Sopenharmony_ci return ret; 204962306a36Sopenharmony_ci} 205062306a36Sopenharmony_ci 205162306a36Sopenharmony_cistatic int rt1011_probe(struct snd_soc_component *component) 205262306a36Sopenharmony_ci{ 205362306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 205462306a36Sopenharmony_ci int i; 205562306a36Sopenharmony_ci 205662306a36Sopenharmony_ci rt1011->component = component; 205762306a36Sopenharmony_ci 205862306a36Sopenharmony_ci schedule_work(&rt1011->cali_work); 205962306a36Sopenharmony_ci 206062306a36Sopenharmony_ci rt1011->i2s_ref = 0; 206162306a36Sopenharmony_ci rt1011->bq_drc_params = devm_kcalloc(component->dev, 206262306a36Sopenharmony_ci RT1011_ADVMODE_NUM, sizeof(struct rt1011_bq_drc_params *), 206362306a36Sopenharmony_ci GFP_KERNEL); 206462306a36Sopenharmony_ci if (!rt1011->bq_drc_params) 206562306a36Sopenharmony_ci return -ENOMEM; 206662306a36Sopenharmony_ci 206762306a36Sopenharmony_ci for (i = 0; i < RT1011_ADVMODE_NUM; i++) { 206862306a36Sopenharmony_ci rt1011->bq_drc_params[i] = devm_kcalloc(component->dev, 206962306a36Sopenharmony_ci RT1011_BQ_DRC_NUM, sizeof(struct rt1011_bq_drc_params), 207062306a36Sopenharmony_ci GFP_KERNEL); 207162306a36Sopenharmony_ci if (!rt1011->bq_drc_params[i]) 207262306a36Sopenharmony_ci return -ENOMEM; 207362306a36Sopenharmony_ci } 207462306a36Sopenharmony_ci 207562306a36Sopenharmony_ci return 0; 207662306a36Sopenharmony_ci} 207762306a36Sopenharmony_ci 207862306a36Sopenharmony_cistatic void rt1011_remove(struct snd_soc_component *component) 207962306a36Sopenharmony_ci{ 208062306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 208162306a36Sopenharmony_ci 208262306a36Sopenharmony_ci cancel_work_sync(&rt1011->cali_work); 208362306a36Sopenharmony_ci rt1011_reset(rt1011->regmap); 208462306a36Sopenharmony_ci} 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_ci#ifdef CONFIG_PM 208762306a36Sopenharmony_cistatic int rt1011_suspend(struct snd_soc_component *component) 208862306a36Sopenharmony_ci{ 208962306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 209062306a36Sopenharmony_ci 209162306a36Sopenharmony_ci regcache_cache_only(rt1011->regmap, true); 209262306a36Sopenharmony_ci regcache_mark_dirty(rt1011->regmap); 209362306a36Sopenharmony_ci 209462306a36Sopenharmony_ci return 0; 209562306a36Sopenharmony_ci} 209662306a36Sopenharmony_ci 209762306a36Sopenharmony_cistatic int rt1011_resume(struct snd_soc_component *component) 209862306a36Sopenharmony_ci{ 209962306a36Sopenharmony_ci struct rt1011_priv *rt1011 = snd_soc_component_get_drvdata(component); 210062306a36Sopenharmony_ci 210162306a36Sopenharmony_ci regcache_cache_only(rt1011->regmap, false); 210262306a36Sopenharmony_ci regcache_sync(rt1011->regmap); 210362306a36Sopenharmony_ci 210462306a36Sopenharmony_ci return 0; 210562306a36Sopenharmony_ci} 210662306a36Sopenharmony_ci#else 210762306a36Sopenharmony_ci#define rt1011_suspend NULL 210862306a36Sopenharmony_ci#define rt1011_resume NULL 210962306a36Sopenharmony_ci#endif 211062306a36Sopenharmony_ci 211162306a36Sopenharmony_cistatic int rt1011_set_bias_level(struct snd_soc_component *component, 211262306a36Sopenharmony_ci enum snd_soc_bias_level level) 211362306a36Sopenharmony_ci{ 211462306a36Sopenharmony_ci switch (level) { 211562306a36Sopenharmony_ci case SND_SOC_BIAS_OFF: 211662306a36Sopenharmony_ci snd_soc_component_write(component, 211762306a36Sopenharmony_ci RT1011_SYSTEM_RESET_1, 0x0000); 211862306a36Sopenharmony_ci snd_soc_component_write(component, 211962306a36Sopenharmony_ci RT1011_SYSTEM_RESET_2, 0x0000); 212062306a36Sopenharmony_ci snd_soc_component_write(component, 212162306a36Sopenharmony_ci RT1011_SYSTEM_RESET_3, 0x0001); 212262306a36Sopenharmony_ci snd_soc_component_write(component, 212362306a36Sopenharmony_ci RT1011_SYSTEM_RESET_1, 0x003f); 212462306a36Sopenharmony_ci snd_soc_component_write(component, 212562306a36Sopenharmony_ci RT1011_SYSTEM_RESET_2, 0x7fd7); 212662306a36Sopenharmony_ci snd_soc_component_write(component, 212762306a36Sopenharmony_ci RT1011_SYSTEM_RESET_3, 0x770f); 212862306a36Sopenharmony_ci break; 212962306a36Sopenharmony_ci default: 213062306a36Sopenharmony_ci break; 213162306a36Sopenharmony_ci } 213262306a36Sopenharmony_ci 213362306a36Sopenharmony_ci return 0; 213462306a36Sopenharmony_ci} 213562306a36Sopenharmony_ci 213662306a36Sopenharmony_ci#define RT1011_STEREO_RATES SNDRV_PCM_RATE_8000_192000 213762306a36Sopenharmony_ci#define RT1011_FORMATS (SNDRV_PCM_FMTBIT_S8 | \ 213862306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S16_LE | \ 213962306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 214062306a36Sopenharmony_ci 214162306a36Sopenharmony_cistatic const struct snd_soc_dai_ops rt1011_aif_dai_ops = { 214262306a36Sopenharmony_ci .hw_params = rt1011_hw_params, 214362306a36Sopenharmony_ci .set_fmt = rt1011_set_dai_fmt, 214462306a36Sopenharmony_ci .set_tdm_slot = rt1011_set_tdm_slot, 214562306a36Sopenharmony_ci}; 214662306a36Sopenharmony_ci 214762306a36Sopenharmony_cistatic struct snd_soc_dai_driver rt1011_dai[] = { 214862306a36Sopenharmony_ci { 214962306a36Sopenharmony_ci .name = "rt1011-aif", 215062306a36Sopenharmony_ci .playback = { 215162306a36Sopenharmony_ci .stream_name = "AIF1 Playback", 215262306a36Sopenharmony_ci .channels_min = 1, 215362306a36Sopenharmony_ci .channels_max = 2, 215462306a36Sopenharmony_ci .rates = RT1011_STEREO_RATES, 215562306a36Sopenharmony_ci .formats = RT1011_FORMATS, 215662306a36Sopenharmony_ci }, 215762306a36Sopenharmony_ci .ops = &rt1011_aif_dai_ops, 215862306a36Sopenharmony_ci }, 215962306a36Sopenharmony_ci}; 216062306a36Sopenharmony_ci 216162306a36Sopenharmony_cistatic const struct snd_soc_component_driver soc_component_dev_rt1011 = { 216262306a36Sopenharmony_ci .probe = rt1011_probe, 216362306a36Sopenharmony_ci .remove = rt1011_remove, 216462306a36Sopenharmony_ci .suspend = rt1011_suspend, 216562306a36Sopenharmony_ci .resume = rt1011_resume, 216662306a36Sopenharmony_ci .set_bias_level = rt1011_set_bias_level, 216762306a36Sopenharmony_ci .controls = rt1011_snd_controls, 216862306a36Sopenharmony_ci .num_controls = ARRAY_SIZE(rt1011_snd_controls), 216962306a36Sopenharmony_ci .dapm_widgets = rt1011_dapm_widgets, 217062306a36Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(rt1011_dapm_widgets), 217162306a36Sopenharmony_ci .dapm_routes = rt1011_dapm_routes, 217262306a36Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(rt1011_dapm_routes), 217362306a36Sopenharmony_ci .set_sysclk = rt1011_set_component_sysclk, 217462306a36Sopenharmony_ci .set_pll = rt1011_set_component_pll, 217562306a36Sopenharmony_ci .use_pmdown_time = 1, 217662306a36Sopenharmony_ci .endianness = 1, 217762306a36Sopenharmony_ci}; 217862306a36Sopenharmony_ci 217962306a36Sopenharmony_cistatic const struct regmap_config rt1011_regmap = { 218062306a36Sopenharmony_ci .reg_bits = 16, 218162306a36Sopenharmony_ci .val_bits = 16, 218262306a36Sopenharmony_ci .max_register = RT1011_MAX_REG + 1, 218362306a36Sopenharmony_ci .volatile_reg = rt1011_volatile_register, 218462306a36Sopenharmony_ci .readable_reg = rt1011_readable_register, 218562306a36Sopenharmony_ci .cache_type = REGCACHE_MAPLE, 218662306a36Sopenharmony_ci .reg_defaults = rt1011_reg, 218762306a36Sopenharmony_ci .num_reg_defaults = ARRAY_SIZE(rt1011_reg), 218862306a36Sopenharmony_ci .use_single_read = true, 218962306a36Sopenharmony_ci .use_single_write = true, 219062306a36Sopenharmony_ci}; 219162306a36Sopenharmony_ci 219262306a36Sopenharmony_ci#if defined(CONFIG_OF) 219362306a36Sopenharmony_cistatic const struct of_device_id rt1011_of_match[] = { 219462306a36Sopenharmony_ci { .compatible = "realtek,rt1011", }, 219562306a36Sopenharmony_ci {}, 219662306a36Sopenharmony_ci}; 219762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, rt1011_of_match); 219862306a36Sopenharmony_ci#endif 219962306a36Sopenharmony_ci 220062306a36Sopenharmony_ci#ifdef CONFIG_ACPI 220162306a36Sopenharmony_cistatic const struct acpi_device_id rt1011_acpi_match[] = { 220262306a36Sopenharmony_ci {"10EC1011", 0,}, 220362306a36Sopenharmony_ci {}, 220462306a36Sopenharmony_ci}; 220562306a36Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, rt1011_acpi_match); 220662306a36Sopenharmony_ci#endif 220762306a36Sopenharmony_ci 220862306a36Sopenharmony_cistatic const struct i2c_device_id rt1011_i2c_id[] = { 220962306a36Sopenharmony_ci { "rt1011", 0 }, 221062306a36Sopenharmony_ci { } 221162306a36Sopenharmony_ci}; 221262306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, rt1011_i2c_id); 221362306a36Sopenharmony_ci 221462306a36Sopenharmony_cistatic int rt1011_calibrate(struct rt1011_priv *rt1011, unsigned char cali_flag) 221562306a36Sopenharmony_ci{ 221662306a36Sopenharmony_ci unsigned int value, count = 0, r0[3]; 221762306a36Sopenharmony_ci unsigned int chk_cnt = 50; /* DONT change this */ 221862306a36Sopenharmony_ci unsigned int dc_offset; 221962306a36Sopenharmony_ci unsigned int r0_integer, r0_factor, format; 222062306a36Sopenharmony_ci struct device *dev = regmap_get_device(rt1011->regmap); 222162306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = 222262306a36Sopenharmony_ci snd_soc_component_get_dapm(rt1011->component); 222362306a36Sopenharmony_ci int ret = 0; 222462306a36Sopenharmony_ci 222562306a36Sopenharmony_ci snd_soc_dapm_mutex_lock(dapm); 222662306a36Sopenharmony_ci regcache_cache_bypass(rt1011->regmap, true); 222762306a36Sopenharmony_ci 222862306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_RESET, 0x0000); 222962306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SYSTEM_RESET_3, 0x740f); 223062306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SYSTEM_RESET_3, 0x770f); 223162306a36Sopenharmony_ci 223262306a36Sopenharmony_ci /* RC clock */ 223362306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_CLK_2, 0x9400); 223462306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_PLL_1, 0x0800); 223562306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_PLL_2, 0x0020); 223662306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_CLK_DET, 0x0800); 223762306a36Sopenharmony_ci 223862306a36Sopenharmony_ci /* ADC/DAC setting */ 223962306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_ADC_SET_5, 0x0a20); 224062306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_DAC_SET_2, 0xe232); 224162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_ADC_SET_4, 0xc000); 224262306a36Sopenharmony_ci 224362306a36Sopenharmony_ci /* DC detection */ 224462306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_PRO_DC_DET_1, 0xb00c); 224562306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_PRO_DC_DET_2, 0xcccc); 224662306a36Sopenharmony_ci 224762306a36Sopenharmony_ci /* Power */ 224862306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_1, 0xe0e0); 224962306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_3, 0x5003); 225062306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_9, 0xa860); 225162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_DAC_SET_2, 0xa032); 225262306a36Sopenharmony_ci 225362306a36Sopenharmony_ci /* POW_PLL / POW_BG / POW_BG_MBIAS_LV / POW_V/I */ 225462306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_2, 0x0007); 225562306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_3, 0x5ff7); 225662306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_A_TEMP_SEN, 0x7f44); 225762306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_A_TIMING_1, 0x4054); 225862306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_BAT_GAIN_1, 0x309c); 225962306a36Sopenharmony_ci 226062306a36Sopenharmony_ci /* DC offset from EFUSE */ 226162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_DC_CALIB_CLASSD_3, 0xcb00); 226262306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_BOOST_CON_1, 0xe080); 226362306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_4, 0x16f2); 226462306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_6, 0x36ad); 226562306a36Sopenharmony_ci 226662306a36Sopenharmony_ci /* mixer */ 226762306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_MIXER_1, 0x3f1d); 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci /* EFUSE read */ 227062306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_EFUSE_CONTROL_1, 0x0d0a); 227162306a36Sopenharmony_ci msleep(30); 227262306a36Sopenharmony_ci 227362306a36Sopenharmony_ci regmap_read(rt1011->regmap, RT1011_EFUSE_ADC_OFFSET_18_16, &value); 227462306a36Sopenharmony_ci dc_offset = value << 16; 227562306a36Sopenharmony_ci regmap_read(rt1011->regmap, RT1011_EFUSE_ADC_OFFSET_15_0, &value); 227662306a36Sopenharmony_ci dc_offset |= (value & 0xffff); 227762306a36Sopenharmony_ci dev_info(dev, "ADC offset=0x%x\n", dc_offset); 227862306a36Sopenharmony_ci regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G0_20_16, &value); 227962306a36Sopenharmony_ci dc_offset = value << 16; 228062306a36Sopenharmony_ci regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G0_15_0, &value); 228162306a36Sopenharmony_ci dc_offset |= (value & 0xffff); 228262306a36Sopenharmony_ci dev_info(dev, "Gain0 offset=0x%x\n", dc_offset); 228362306a36Sopenharmony_ci regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G1_20_16, &value); 228462306a36Sopenharmony_ci dc_offset = value << 16; 228562306a36Sopenharmony_ci regmap_read(rt1011->regmap, RT1011_EFUSE_DAC_OFFSET_G1_15_0, &value); 228662306a36Sopenharmony_ci dc_offset |= (value & 0xffff); 228762306a36Sopenharmony_ci dev_info(dev, "Gain1 offset=0x%x\n", dc_offset); 228862306a36Sopenharmony_ci 228962306a36Sopenharmony_ci if (cali_flag) { 229062306a36Sopenharmony_ci 229162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_ADC_SET_1, 0x2925); 229262306a36Sopenharmony_ci /* Class D on */ 229362306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_CLASS_D_POS, 0x010e); 229462306a36Sopenharmony_ci regmap_write(rt1011->regmap, 229562306a36Sopenharmony_ci RT1011_CLASSD_INTERNAL_SET_1, 0x1701); 229662306a36Sopenharmony_ci 229762306a36Sopenharmony_ci /* STP enable */ 229862306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_0, 0x8000); 229962306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_7, 0xf000); 230062306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_4, 0x4040); 230162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_0, 0xc000); 230262306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_6, 0x07c2); 230362306a36Sopenharmony_ci 230462306a36Sopenharmony_ci r0[0] = r0[1] = r0[2] = count = 0; 230562306a36Sopenharmony_ci while (count < chk_cnt) { 230662306a36Sopenharmony_ci msleep(100); 230762306a36Sopenharmony_ci regmap_read(rt1011->regmap, 230862306a36Sopenharmony_ci RT1011_INIT_RECIPROCAL_SYN_24_16, &value); 230962306a36Sopenharmony_ci r0[count%3] = value << 16; 231062306a36Sopenharmony_ci regmap_read(rt1011->regmap, 231162306a36Sopenharmony_ci RT1011_INIT_RECIPROCAL_SYN_15_0, &value); 231262306a36Sopenharmony_ci r0[count%3] |= value; 231362306a36Sopenharmony_ci 231462306a36Sopenharmony_ci if (r0[count%3] == 0) 231562306a36Sopenharmony_ci continue; 231662306a36Sopenharmony_ci 231762306a36Sopenharmony_ci count++; 231862306a36Sopenharmony_ci 231962306a36Sopenharmony_ci if (r0[0] == r0[1] && r0[1] == r0[2]) 232062306a36Sopenharmony_ci break; 232162306a36Sopenharmony_ci } 232262306a36Sopenharmony_ci if (count > chk_cnt) { 232362306a36Sopenharmony_ci dev_err(dev, "Calibrate R0 Failure\n"); 232462306a36Sopenharmony_ci ret = -EAGAIN; 232562306a36Sopenharmony_ci } else { 232662306a36Sopenharmony_ci format = 2147483648U; /* 2^24 * 128 */ 232762306a36Sopenharmony_ci r0_integer = format / r0[0] / 128; 232862306a36Sopenharmony_ci r0_factor = ((format / r0[0] * 100) / 128) 232962306a36Sopenharmony_ci - (r0_integer * 100); 233062306a36Sopenharmony_ci rt1011->r0_reg = r0[0]; 233162306a36Sopenharmony_ci rt1011->cali_done = 1; 233262306a36Sopenharmony_ci dev_info(dev, "r0 resistance about %d.%02d ohm, reg=0x%X\n", 233362306a36Sopenharmony_ci r0_integer, r0_factor, r0[0]); 233462306a36Sopenharmony_ci } 233562306a36Sopenharmony_ci } 233662306a36Sopenharmony_ci 233762306a36Sopenharmony_ci /* depop */ 233862306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_0, 0x0000); 233962306a36Sopenharmony_ci msleep(400); 234062306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_9, 0xa840); 234162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_SPK_TEMP_PROTECT_6, 0x0702); 234262306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_MIXER_1, 0xffdd); 234362306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_CLASSD_INTERNAL_SET_1, 0x0701); 234462306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_DAC_SET_3, 0xe004); 234562306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_A_TEMP_SEN, 0x7f40); 234662306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_1, 0x0000); 234762306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_2, 0x0000); 234862306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_3, 0x0002); 234962306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_POWER_4, 0x00f2); 235062306a36Sopenharmony_ci 235162306a36Sopenharmony_ci regmap_write(rt1011->regmap, RT1011_RESET, 0x0000); 235262306a36Sopenharmony_ci 235362306a36Sopenharmony_ci if (cali_flag) { 235462306a36Sopenharmony_ci if (count <= chk_cnt) { 235562306a36Sopenharmony_ci regmap_write(rt1011->regmap, 235662306a36Sopenharmony_ci RT1011_INIT_RECIPROCAL_REG_24_16, 235762306a36Sopenharmony_ci ((r0[0]>>16) & 0x1ff)); 235862306a36Sopenharmony_ci regmap_write(rt1011->regmap, 235962306a36Sopenharmony_ci RT1011_INIT_RECIPROCAL_REG_15_0, 236062306a36Sopenharmony_ci (r0[0] & 0xffff)); 236162306a36Sopenharmony_ci regmap_write(rt1011->regmap, 236262306a36Sopenharmony_ci RT1011_SPK_TEMP_PROTECT_4, 0x4080); 236362306a36Sopenharmony_ci } 236462306a36Sopenharmony_ci } 236562306a36Sopenharmony_ci 236662306a36Sopenharmony_ci regcache_cache_bypass(rt1011->regmap, false); 236762306a36Sopenharmony_ci regcache_mark_dirty(rt1011->regmap); 236862306a36Sopenharmony_ci regcache_sync(rt1011->regmap); 236962306a36Sopenharmony_ci snd_soc_dapm_mutex_unlock(dapm); 237062306a36Sopenharmony_ci 237162306a36Sopenharmony_ci return ret; 237262306a36Sopenharmony_ci} 237362306a36Sopenharmony_ci 237462306a36Sopenharmony_cistatic void rt1011_calibration_work(struct work_struct *work) 237562306a36Sopenharmony_ci{ 237662306a36Sopenharmony_ci struct rt1011_priv *rt1011 = 237762306a36Sopenharmony_ci container_of(work, struct rt1011_priv, cali_work); 237862306a36Sopenharmony_ci struct snd_soc_component *component = rt1011->component; 237962306a36Sopenharmony_ci unsigned int r0_integer, r0_factor, format; 238062306a36Sopenharmony_ci 238162306a36Sopenharmony_ci if (rt1011->r0_calib) 238262306a36Sopenharmony_ci rt1011_calibrate(rt1011, 0); 238362306a36Sopenharmony_ci else 238462306a36Sopenharmony_ci rt1011_calibrate(rt1011, 1); 238562306a36Sopenharmony_ci 238662306a36Sopenharmony_ci /* 238762306a36Sopenharmony_ci * This flag should reset after booting. 238862306a36Sopenharmony_ci * The factory test will do calibration again and use this flag to check 238962306a36Sopenharmony_ci * whether the calibration completed 239062306a36Sopenharmony_ci */ 239162306a36Sopenharmony_ci rt1011->cali_done = 0; 239262306a36Sopenharmony_ci 239362306a36Sopenharmony_ci /* initial */ 239462306a36Sopenharmony_ci rt1011_reg_init(component); 239562306a36Sopenharmony_ci 239662306a36Sopenharmony_ci /* Apply temperature and calibration data from device property */ 239762306a36Sopenharmony_ci if (rt1011->temperature_calib <= 0xff && 239862306a36Sopenharmony_ci rt1011->temperature_calib > 0) { 239962306a36Sopenharmony_ci snd_soc_component_update_bits(component, 240062306a36Sopenharmony_ci RT1011_STP_INITIAL_RESISTANCE_TEMP, 0x3ff, 240162306a36Sopenharmony_ci (rt1011->temperature_calib << 2)); 240262306a36Sopenharmony_ci } 240362306a36Sopenharmony_ci 240462306a36Sopenharmony_ci if (rt1011->r0_calib) { 240562306a36Sopenharmony_ci rt1011->r0_reg = rt1011->r0_calib; 240662306a36Sopenharmony_ci 240762306a36Sopenharmony_ci format = 2147483648U; /* 2^24 * 128 */ 240862306a36Sopenharmony_ci r0_integer = format / rt1011->r0_reg / 128; 240962306a36Sopenharmony_ci r0_factor = ((format / rt1011->r0_reg * 100) / 128) 241062306a36Sopenharmony_ci - (r0_integer * 100); 241162306a36Sopenharmony_ci dev_info(component->dev, "DP r0 resistance about %d.%02d ohm, reg=0x%X\n", 241262306a36Sopenharmony_ci r0_integer, r0_factor, rt1011->r0_reg); 241362306a36Sopenharmony_ci 241462306a36Sopenharmony_ci rt1011_r0_load(rt1011); 241562306a36Sopenharmony_ci } 241662306a36Sopenharmony_ci 241762306a36Sopenharmony_ci snd_soc_component_write(component, RT1011_ADC_SET_1, 0x2925); 241862306a36Sopenharmony_ci} 241962306a36Sopenharmony_ci 242062306a36Sopenharmony_cistatic int rt1011_parse_dp(struct rt1011_priv *rt1011, struct device *dev) 242162306a36Sopenharmony_ci{ 242262306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,temperature_calib", 242362306a36Sopenharmony_ci &rt1011->temperature_calib); 242462306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,r0_calib", 242562306a36Sopenharmony_ci &rt1011->r0_calib); 242662306a36Sopenharmony_ci 242762306a36Sopenharmony_ci dev_dbg(dev, "%s: r0_calib: 0x%x, temperature_calib: 0x%x", 242862306a36Sopenharmony_ci __func__, rt1011->r0_calib, rt1011->temperature_calib); 242962306a36Sopenharmony_ci 243062306a36Sopenharmony_ci return 0; 243162306a36Sopenharmony_ci} 243262306a36Sopenharmony_ci 243362306a36Sopenharmony_cistatic int rt1011_i2c_probe(struct i2c_client *i2c) 243462306a36Sopenharmony_ci{ 243562306a36Sopenharmony_ci struct rt1011_priv *rt1011; 243662306a36Sopenharmony_ci int ret; 243762306a36Sopenharmony_ci unsigned int val; 243862306a36Sopenharmony_ci 243962306a36Sopenharmony_ci rt1011 = devm_kzalloc(&i2c->dev, sizeof(struct rt1011_priv), 244062306a36Sopenharmony_ci GFP_KERNEL); 244162306a36Sopenharmony_ci if (!rt1011) 244262306a36Sopenharmony_ci return -ENOMEM; 244362306a36Sopenharmony_ci 244462306a36Sopenharmony_ci i2c_set_clientdata(i2c, rt1011); 244562306a36Sopenharmony_ci 244662306a36Sopenharmony_ci rt1011_parse_dp(rt1011, &i2c->dev); 244762306a36Sopenharmony_ci 244862306a36Sopenharmony_ci rt1011->regmap = devm_regmap_init_i2c(i2c, &rt1011_regmap); 244962306a36Sopenharmony_ci if (IS_ERR(rt1011->regmap)) { 245062306a36Sopenharmony_ci ret = PTR_ERR(rt1011->regmap); 245162306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to allocate register map: %d\n", 245262306a36Sopenharmony_ci ret); 245362306a36Sopenharmony_ci return ret; 245462306a36Sopenharmony_ci } 245562306a36Sopenharmony_ci 245662306a36Sopenharmony_ci regmap_read(rt1011->regmap, RT1011_DEVICE_ID, &val); 245762306a36Sopenharmony_ci if (val != RT1011_DEVICE_ID_NUM) { 245862306a36Sopenharmony_ci dev_err(&i2c->dev, 245962306a36Sopenharmony_ci "Device with ID register %x is not rt1011\n", val); 246062306a36Sopenharmony_ci return -ENODEV; 246162306a36Sopenharmony_ci } 246262306a36Sopenharmony_ci 246362306a36Sopenharmony_ci INIT_WORK(&rt1011->cali_work, rt1011_calibration_work); 246462306a36Sopenharmony_ci 246562306a36Sopenharmony_ci return devm_snd_soc_register_component(&i2c->dev, 246662306a36Sopenharmony_ci &soc_component_dev_rt1011, 246762306a36Sopenharmony_ci rt1011_dai, ARRAY_SIZE(rt1011_dai)); 246862306a36Sopenharmony_ci 246962306a36Sopenharmony_ci} 247062306a36Sopenharmony_ci 247162306a36Sopenharmony_cistatic void rt1011_i2c_shutdown(struct i2c_client *client) 247262306a36Sopenharmony_ci{ 247362306a36Sopenharmony_ci struct rt1011_priv *rt1011 = i2c_get_clientdata(client); 247462306a36Sopenharmony_ci 247562306a36Sopenharmony_ci rt1011_reset(rt1011->regmap); 247662306a36Sopenharmony_ci} 247762306a36Sopenharmony_ci 247862306a36Sopenharmony_cistatic struct i2c_driver rt1011_i2c_driver = { 247962306a36Sopenharmony_ci .driver = { 248062306a36Sopenharmony_ci .name = "rt1011", 248162306a36Sopenharmony_ci .of_match_table = of_match_ptr(rt1011_of_match), 248262306a36Sopenharmony_ci .acpi_match_table = ACPI_PTR(rt1011_acpi_match) 248362306a36Sopenharmony_ci }, 248462306a36Sopenharmony_ci .probe = rt1011_i2c_probe, 248562306a36Sopenharmony_ci .shutdown = rt1011_i2c_shutdown, 248662306a36Sopenharmony_ci .id_table = rt1011_i2c_id, 248762306a36Sopenharmony_ci}; 248862306a36Sopenharmony_cimodule_i2c_driver(rt1011_i2c_driver); 248962306a36Sopenharmony_ci 249062306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT1011 amplifier driver"); 249162306a36Sopenharmony_ciMODULE_AUTHOR("Shuming Fan <shumingf@realtek.com>"); 249262306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 2493