162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * rt5670.c -- RT5670 ALSA SoC audio codec driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2014 Realtek Semiconductor Corp. 662306a36Sopenharmony_ci * Author: Bard Liao <bardliao@realtek.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/module.h> 1062306a36Sopenharmony_ci#include <linux/moduleparam.h> 1162306a36Sopenharmony_ci#include <linux/init.h> 1262306a36Sopenharmony_ci#include <linux/delay.h> 1362306a36Sopenharmony_ci#include <linux/pm.h> 1462306a36Sopenharmony_ci#include <linux/pm_runtime.h> 1562306a36Sopenharmony_ci#include <linux/i2c.h> 1662306a36Sopenharmony_ci#include <linux/platform_device.h> 1762306a36Sopenharmony_ci#include <linux/acpi.h> 1862306a36Sopenharmony_ci#include <linux/spi/spi.h> 1962306a36Sopenharmony_ci#include <linux/dmi.h> 2062306a36Sopenharmony_ci#include <sound/core.h> 2162306a36Sopenharmony_ci#include <sound/pcm.h> 2262306a36Sopenharmony_ci#include <sound/pcm_params.h> 2362306a36Sopenharmony_ci#include <sound/jack.h> 2462306a36Sopenharmony_ci#include <sound/soc.h> 2562306a36Sopenharmony_ci#include <sound/soc-dapm.h> 2662306a36Sopenharmony_ci#include <sound/initval.h> 2762306a36Sopenharmony_ci#include <sound/tlv.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include "rl6231.h" 3062306a36Sopenharmony_ci#include "rt5670.h" 3162306a36Sopenharmony_ci#include "rt5670-dsp.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define RT5670_GPIO1_IS_IRQ BIT(0) 3462306a36Sopenharmony_ci#define RT5670_IN2_DIFF BIT(1) 3562306a36Sopenharmony_ci#define RT5670_DMIC_EN BIT(2) 3662306a36Sopenharmony_ci#define RT5670_DMIC1_IN2P BIT(3) 3762306a36Sopenharmony_ci#define RT5670_DMIC1_GPIO6 BIT(4) 3862306a36Sopenharmony_ci#define RT5670_DMIC1_GPIO7 BIT(5) 3962306a36Sopenharmony_ci#define RT5670_DMIC2_INR BIT(6) 4062306a36Sopenharmony_ci#define RT5670_DMIC2_GPIO8 BIT(7) 4162306a36Sopenharmony_ci#define RT5670_DMIC3_GPIO5 BIT(8) 4262306a36Sopenharmony_ci#define RT5670_JD_MODE1 BIT(9) 4362306a36Sopenharmony_ci#define RT5670_JD_MODE2 BIT(10) 4462306a36Sopenharmony_ci#define RT5670_JD_MODE3 BIT(11) 4562306a36Sopenharmony_ci#define RT5670_GPIO1_IS_EXT_SPK_EN BIT(12) 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic unsigned long rt5670_quirk; 4862306a36Sopenharmony_cistatic unsigned int quirk_override; 4962306a36Sopenharmony_cimodule_param_named(quirk, quirk_override, uint, 0444); 5062306a36Sopenharmony_ciMODULE_PARM_DESC(quirk, "Board-specific quirk override"); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define RT5670_DEVICE_ID 0x6271 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#define RT5670_PR_RANGE_BASE (0xff + 1) 5562306a36Sopenharmony_ci#define RT5670_PR_SPACING 0x100 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define RT5670_PR_BASE (RT5670_PR_RANGE_BASE + (0 * RT5670_PR_SPACING)) 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistatic const struct regmap_range_cfg rt5670_ranges[] = { 6062306a36Sopenharmony_ci { .name = "PR", .range_min = RT5670_PR_BASE, 6162306a36Sopenharmony_ci .range_max = RT5670_PR_BASE + 0xf8, 6262306a36Sopenharmony_ci .selector_reg = RT5670_PRIV_INDEX, 6362306a36Sopenharmony_ci .selector_mask = 0xff, 6462306a36Sopenharmony_ci .selector_shift = 0x0, 6562306a36Sopenharmony_ci .window_start = RT5670_PRIV_DATA, 6662306a36Sopenharmony_ci .window_len = 0x1, }, 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic const struct reg_sequence init_list[] = { 7062306a36Sopenharmony_ci { RT5670_PR_BASE + 0x14, 0x9a8a }, 7162306a36Sopenharmony_ci { RT5670_PR_BASE + 0x38, 0x1fe1 }, 7262306a36Sopenharmony_ci { RT5670_PR_BASE + 0x3d, 0x3640 }, 7362306a36Sopenharmony_ci { 0x8a, 0x0123 }, 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic const struct reg_default rt5670_reg[] = { 7762306a36Sopenharmony_ci { 0x00, 0x0000 }, 7862306a36Sopenharmony_ci { 0x02, 0x8888 }, 7962306a36Sopenharmony_ci { 0x03, 0x8888 }, 8062306a36Sopenharmony_ci { 0x0a, 0x0001 }, 8162306a36Sopenharmony_ci { 0x0b, 0x0827 }, 8262306a36Sopenharmony_ci { 0x0c, 0x0000 }, 8362306a36Sopenharmony_ci { 0x0d, 0x0008 }, 8462306a36Sopenharmony_ci { 0x0e, 0x0000 }, 8562306a36Sopenharmony_ci { 0x0f, 0x0808 }, 8662306a36Sopenharmony_ci { 0x19, 0xafaf }, 8762306a36Sopenharmony_ci { 0x1a, 0xafaf }, 8862306a36Sopenharmony_ci { 0x1b, 0x0011 }, 8962306a36Sopenharmony_ci { 0x1c, 0x2f2f }, 9062306a36Sopenharmony_ci { 0x1d, 0x2f2f }, 9162306a36Sopenharmony_ci { 0x1e, 0x0000 }, 9262306a36Sopenharmony_ci { 0x1f, 0x2f2f }, 9362306a36Sopenharmony_ci { 0x20, 0x0000 }, 9462306a36Sopenharmony_ci { 0x26, 0x7860 }, 9562306a36Sopenharmony_ci { 0x27, 0x7860 }, 9662306a36Sopenharmony_ci { 0x28, 0x7871 }, 9762306a36Sopenharmony_ci { 0x29, 0x8080 }, 9862306a36Sopenharmony_ci { 0x2a, 0x5656 }, 9962306a36Sopenharmony_ci { 0x2b, 0x5454 }, 10062306a36Sopenharmony_ci { 0x2c, 0xaaa0 }, 10162306a36Sopenharmony_ci { 0x2d, 0x0000 }, 10262306a36Sopenharmony_ci { 0x2e, 0x2f2f }, 10362306a36Sopenharmony_ci { 0x2f, 0x1002 }, 10462306a36Sopenharmony_ci { 0x30, 0x0000 }, 10562306a36Sopenharmony_ci { 0x31, 0x5f00 }, 10662306a36Sopenharmony_ci { 0x32, 0x0000 }, 10762306a36Sopenharmony_ci { 0x33, 0x0000 }, 10862306a36Sopenharmony_ci { 0x34, 0x0000 }, 10962306a36Sopenharmony_ci { 0x35, 0x0000 }, 11062306a36Sopenharmony_ci { 0x36, 0x0000 }, 11162306a36Sopenharmony_ci { 0x37, 0x0000 }, 11262306a36Sopenharmony_ci { 0x38, 0x0000 }, 11362306a36Sopenharmony_ci { 0x3b, 0x0000 }, 11462306a36Sopenharmony_ci { 0x3c, 0x007f }, 11562306a36Sopenharmony_ci { 0x3d, 0x0000 }, 11662306a36Sopenharmony_ci { 0x3e, 0x007f }, 11762306a36Sopenharmony_ci { 0x45, 0xe00f }, 11862306a36Sopenharmony_ci { 0x4c, 0x5380 }, 11962306a36Sopenharmony_ci { 0x4f, 0x0073 }, 12062306a36Sopenharmony_ci { 0x52, 0x00d3 }, 12162306a36Sopenharmony_ci { 0x53, 0xf000 }, 12262306a36Sopenharmony_ci { 0x61, 0x0000 }, 12362306a36Sopenharmony_ci { 0x62, 0x0001 }, 12462306a36Sopenharmony_ci { 0x63, 0x00c3 }, 12562306a36Sopenharmony_ci { 0x64, 0x0000 }, 12662306a36Sopenharmony_ci { 0x65, 0x0001 }, 12762306a36Sopenharmony_ci { 0x66, 0x0000 }, 12862306a36Sopenharmony_ci { 0x6f, 0x8000 }, 12962306a36Sopenharmony_ci { 0x70, 0x8000 }, 13062306a36Sopenharmony_ci { 0x71, 0x8000 }, 13162306a36Sopenharmony_ci { 0x72, 0x8000 }, 13262306a36Sopenharmony_ci { 0x73, 0x7770 }, 13362306a36Sopenharmony_ci { 0x74, 0x0e00 }, 13462306a36Sopenharmony_ci { 0x75, 0x1505 }, 13562306a36Sopenharmony_ci { 0x76, 0x0015 }, 13662306a36Sopenharmony_ci { 0x77, 0x0c00 }, 13762306a36Sopenharmony_ci { 0x78, 0x4000 }, 13862306a36Sopenharmony_ci { 0x79, 0x0123 }, 13962306a36Sopenharmony_ci { 0x7f, 0x1100 }, 14062306a36Sopenharmony_ci { 0x80, 0x0000 }, 14162306a36Sopenharmony_ci { 0x81, 0x0000 }, 14262306a36Sopenharmony_ci { 0x82, 0x0000 }, 14362306a36Sopenharmony_ci { 0x83, 0x0000 }, 14462306a36Sopenharmony_ci { 0x84, 0x0000 }, 14562306a36Sopenharmony_ci { 0x85, 0x0000 }, 14662306a36Sopenharmony_ci { 0x86, 0x0004 }, 14762306a36Sopenharmony_ci { 0x87, 0x0000 }, 14862306a36Sopenharmony_ci { 0x88, 0x0000 }, 14962306a36Sopenharmony_ci { 0x89, 0x0000 }, 15062306a36Sopenharmony_ci { 0x8a, 0x0123 }, 15162306a36Sopenharmony_ci { 0x8b, 0x0000 }, 15262306a36Sopenharmony_ci { 0x8c, 0x0003 }, 15362306a36Sopenharmony_ci { 0x8d, 0x0000 }, 15462306a36Sopenharmony_ci { 0x8e, 0x0004 }, 15562306a36Sopenharmony_ci { 0x8f, 0x1100 }, 15662306a36Sopenharmony_ci { 0x90, 0x0646 }, 15762306a36Sopenharmony_ci { 0x91, 0x0c06 }, 15862306a36Sopenharmony_ci { 0x93, 0x0000 }, 15962306a36Sopenharmony_ci { 0x94, 0x1270 }, 16062306a36Sopenharmony_ci { 0x95, 0x1000 }, 16162306a36Sopenharmony_ci { 0x97, 0x0000 }, 16262306a36Sopenharmony_ci { 0x98, 0x0000 }, 16362306a36Sopenharmony_ci { 0x99, 0x0000 }, 16462306a36Sopenharmony_ci { 0x9a, 0x2184 }, 16562306a36Sopenharmony_ci { 0x9b, 0x010a }, 16662306a36Sopenharmony_ci { 0x9c, 0x0aea }, 16762306a36Sopenharmony_ci { 0x9d, 0x000c }, 16862306a36Sopenharmony_ci { 0x9e, 0x0400 }, 16962306a36Sopenharmony_ci { 0xae, 0x7000 }, 17062306a36Sopenharmony_ci { 0xaf, 0x0000 }, 17162306a36Sopenharmony_ci { 0xb0, 0x7000 }, 17262306a36Sopenharmony_ci { 0xb1, 0x0000 }, 17362306a36Sopenharmony_ci { 0xb2, 0x0000 }, 17462306a36Sopenharmony_ci { 0xb3, 0x001f }, 17562306a36Sopenharmony_ci { 0xb4, 0x220c }, 17662306a36Sopenharmony_ci { 0xb5, 0x1f00 }, 17762306a36Sopenharmony_ci { 0xb6, 0x0000 }, 17862306a36Sopenharmony_ci { 0xb7, 0x0000 }, 17962306a36Sopenharmony_ci { 0xbb, 0x0000 }, 18062306a36Sopenharmony_ci { 0xbc, 0x0000 }, 18162306a36Sopenharmony_ci { 0xbd, 0x0000 }, 18262306a36Sopenharmony_ci { 0xbe, 0x0000 }, 18362306a36Sopenharmony_ci { 0xbf, 0x0000 }, 18462306a36Sopenharmony_ci { 0xc0, 0x0000 }, 18562306a36Sopenharmony_ci { 0xc1, 0x0000 }, 18662306a36Sopenharmony_ci { 0xc2, 0x0000 }, 18762306a36Sopenharmony_ci { 0xcd, 0x0000 }, 18862306a36Sopenharmony_ci { 0xce, 0x0000 }, 18962306a36Sopenharmony_ci { 0xcf, 0x1813 }, 19062306a36Sopenharmony_ci { 0xd0, 0x0690 }, 19162306a36Sopenharmony_ci { 0xd1, 0x1c17 }, 19262306a36Sopenharmony_ci { 0xd3, 0xa220 }, 19362306a36Sopenharmony_ci { 0xd4, 0x0000 }, 19462306a36Sopenharmony_ci { 0xd6, 0x0400 }, 19562306a36Sopenharmony_ci { 0xd9, 0x0809 }, 19662306a36Sopenharmony_ci { 0xda, 0x0000 }, 19762306a36Sopenharmony_ci { 0xdb, 0x0001 }, 19862306a36Sopenharmony_ci { 0xdc, 0x0049 }, 19962306a36Sopenharmony_ci { 0xdd, 0x0024 }, 20062306a36Sopenharmony_ci { 0xe6, 0x8000 }, 20162306a36Sopenharmony_ci { 0xe7, 0x0000 }, 20262306a36Sopenharmony_ci { 0xec, 0xa200 }, 20362306a36Sopenharmony_ci { 0xed, 0x0000 }, 20462306a36Sopenharmony_ci { 0xee, 0xa200 }, 20562306a36Sopenharmony_ci { 0xef, 0x0000 }, 20662306a36Sopenharmony_ci { 0xf8, 0x0000 }, 20762306a36Sopenharmony_ci { 0xf9, 0x0000 }, 20862306a36Sopenharmony_ci { 0xfa, 0x8010 }, 20962306a36Sopenharmony_ci { 0xfb, 0x0033 }, 21062306a36Sopenharmony_ci { 0xfc, 0x0100 }, 21162306a36Sopenharmony_ci}; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_cistatic bool rt5670_volatile_register(struct device *dev, unsigned int reg) 21462306a36Sopenharmony_ci{ 21562306a36Sopenharmony_ci int i; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rt5670_ranges); i++) { 21862306a36Sopenharmony_ci if ((reg >= rt5670_ranges[i].window_start && 21962306a36Sopenharmony_ci reg <= rt5670_ranges[i].window_start + 22062306a36Sopenharmony_ci rt5670_ranges[i].window_len) || 22162306a36Sopenharmony_ci (reg >= rt5670_ranges[i].range_min && 22262306a36Sopenharmony_ci reg <= rt5670_ranges[i].range_max)) { 22362306a36Sopenharmony_ci return true; 22462306a36Sopenharmony_ci } 22562306a36Sopenharmony_ci } 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci switch (reg) { 22862306a36Sopenharmony_ci case RT5670_RESET: 22962306a36Sopenharmony_ci case RT5670_PDM_DATA_CTRL1: 23062306a36Sopenharmony_ci case RT5670_PDM1_DATA_CTRL4: 23162306a36Sopenharmony_ci case RT5670_PDM2_DATA_CTRL4: 23262306a36Sopenharmony_ci case RT5670_PRIV_DATA: 23362306a36Sopenharmony_ci case RT5670_ASRC_5: 23462306a36Sopenharmony_ci case RT5670_CJ_CTRL1: 23562306a36Sopenharmony_ci case RT5670_CJ_CTRL2: 23662306a36Sopenharmony_ci case RT5670_CJ_CTRL3: 23762306a36Sopenharmony_ci case RT5670_A_JD_CTRL1: 23862306a36Sopenharmony_ci case RT5670_A_JD_CTRL2: 23962306a36Sopenharmony_ci case RT5670_VAD_CTRL5: 24062306a36Sopenharmony_ci case RT5670_ADC_EQ_CTRL1: 24162306a36Sopenharmony_ci case RT5670_EQ_CTRL1: 24262306a36Sopenharmony_ci case RT5670_ALC_CTRL_1: 24362306a36Sopenharmony_ci case RT5670_IRQ_CTRL2: 24462306a36Sopenharmony_ci case RT5670_INT_IRQ_ST: 24562306a36Sopenharmony_ci case RT5670_IL_CMD: 24662306a36Sopenharmony_ci case RT5670_DSP_CTRL1: 24762306a36Sopenharmony_ci case RT5670_DSP_CTRL2: 24862306a36Sopenharmony_ci case RT5670_DSP_CTRL3: 24962306a36Sopenharmony_ci case RT5670_DSP_CTRL4: 25062306a36Sopenharmony_ci case RT5670_DSP_CTRL5: 25162306a36Sopenharmony_ci case RT5670_VENDOR_ID: 25262306a36Sopenharmony_ci case RT5670_VENDOR_ID1: 25362306a36Sopenharmony_ci case RT5670_VENDOR_ID2: 25462306a36Sopenharmony_ci return true; 25562306a36Sopenharmony_ci default: 25662306a36Sopenharmony_ci return false; 25762306a36Sopenharmony_ci } 25862306a36Sopenharmony_ci} 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_cistatic bool rt5670_readable_register(struct device *dev, unsigned int reg) 26162306a36Sopenharmony_ci{ 26262306a36Sopenharmony_ci int i; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rt5670_ranges); i++) { 26562306a36Sopenharmony_ci if ((reg >= rt5670_ranges[i].window_start && 26662306a36Sopenharmony_ci reg <= rt5670_ranges[i].window_start + 26762306a36Sopenharmony_ci rt5670_ranges[i].window_len) || 26862306a36Sopenharmony_ci (reg >= rt5670_ranges[i].range_min && 26962306a36Sopenharmony_ci reg <= rt5670_ranges[i].range_max)) { 27062306a36Sopenharmony_ci return true; 27162306a36Sopenharmony_ci } 27262306a36Sopenharmony_ci } 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci switch (reg) { 27562306a36Sopenharmony_ci case RT5670_RESET: 27662306a36Sopenharmony_ci case RT5670_HP_VOL: 27762306a36Sopenharmony_ci case RT5670_LOUT1: 27862306a36Sopenharmony_ci case RT5670_CJ_CTRL1: 27962306a36Sopenharmony_ci case RT5670_CJ_CTRL2: 28062306a36Sopenharmony_ci case RT5670_CJ_CTRL3: 28162306a36Sopenharmony_ci case RT5670_IN2: 28262306a36Sopenharmony_ci case RT5670_INL1_INR1_VOL: 28362306a36Sopenharmony_ci case RT5670_DAC1_DIG_VOL: 28462306a36Sopenharmony_ci case RT5670_DAC2_DIG_VOL: 28562306a36Sopenharmony_ci case RT5670_DAC_CTRL: 28662306a36Sopenharmony_ci case RT5670_STO1_ADC_DIG_VOL: 28762306a36Sopenharmony_ci case RT5670_MONO_ADC_DIG_VOL: 28862306a36Sopenharmony_ci case RT5670_STO2_ADC_DIG_VOL: 28962306a36Sopenharmony_ci case RT5670_ADC_BST_VOL1: 29062306a36Sopenharmony_ci case RT5670_ADC_BST_VOL2: 29162306a36Sopenharmony_ci case RT5670_STO2_ADC_MIXER: 29262306a36Sopenharmony_ci case RT5670_STO1_ADC_MIXER: 29362306a36Sopenharmony_ci case RT5670_MONO_ADC_MIXER: 29462306a36Sopenharmony_ci case RT5670_AD_DA_MIXER: 29562306a36Sopenharmony_ci case RT5670_STO_DAC_MIXER: 29662306a36Sopenharmony_ci case RT5670_DD_MIXER: 29762306a36Sopenharmony_ci case RT5670_DIG_MIXER: 29862306a36Sopenharmony_ci case RT5670_DSP_PATH1: 29962306a36Sopenharmony_ci case RT5670_DSP_PATH2: 30062306a36Sopenharmony_ci case RT5670_DIG_INF1_DATA: 30162306a36Sopenharmony_ci case RT5670_DIG_INF2_DATA: 30262306a36Sopenharmony_ci case RT5670_PDM_OUT_CTRL: 30362306a36Sopenharmony_ci case RT5670_PDM_DATA_CTRL1: 30462306a36Sopenharmony_ci case RT5670_PDM1_DATA_CTRL2: 30562306a36Sopenharmony_ci case RT5670_PDM1_DATA_CTRL3: 30662306a36Sopenharmony_ci case RT5670_PDM1_DATA_CTRL4: 30762306a36Sopenharmony_ci case RT5670_PDM2_DATA_CTRL2: 30862306a36Sopenharmony_ci case RT5670_PDM2_DATA_CTRL3: 30962306a36Sopenharmony_ci case RT5670_PDM2_DATA_CTRL4: 31062306a36Sopenharmony_ci case RT5670_REC_L1_MIXER: 31162306a36Sopenharmony_ci case RT5670_REC_L2_MIXER: 31262306a36Sopenharmony_ci case RT5670_REC_R1_MIXER: 31362306a36Sopenharmony_ci case RT5670_REC_R2_MIXER: 31462306a36Sopenharmony_ci case RT5670_HPO_MIXER: 31562306a36Sopenharmony_ci case RT5670_MONO_MIXER: 31662306a36Sopenharmony_ci case RT5670_OUT_L1_MIXER: 31762306a36Sopenharmony_ci case RT5670_OUT_R1_MIXER: 31862306a36Sopenharmony_ci case RT5670_LOUT_MIXER: 31962306a36Sopenharmony_ci case RT5670_PWR_DIG1: 32062306a36Sopenharmony_ci case RT5670_PWR_DIG2: 32162306a36Sopenharmony_ci case RT5670_PWR_ANLG1: 32262306a36Sopenharmony_ci case RT5670_PWR_ANLG2: 32362306a36Sopenharmony_ci case RT5670_PWR_MIXER: 32462306a36Sopenharmony_ci case RT5670_PWR_VOL: 32562306a36Sopenharmony_ci case RT5670_PRIV_INDEX: 32662306a36Sopenharmony_ci case RT5670_PRIV_DATA: 32762306a36Sopenharmony_ci case RT5670_I2S4_SDP: 32862306a36Sopenharmony_ci case RT5670_I2S1_SDP: 32962306a36Sopenharmony_ci case RT5670_I2S2_SDP: 33062306a36Sopenharmony_ci case RT5670_I2S3_SDP: 33162306a36Sopenharmony_ci case RT5670_ADDA_CLK1: 33262306a36Sopenharmony_ci case RT5670_ADDA_CLK2: 33362306a36Sopenharmony_ci case RT5670_DMIC_CTRL1: 33462306a36Sopenharmony_ci case RT5670_DMIC_CTRL2: 33562306a36Sopenharmony_ci case RT5670_TDM_CTRL_1: 33662306a36Sopenharmony_ci case RT5670_TDM_CTRL_2: 33762306a36Sopenharmony_ci case RT5670_TDM_CTRL_3: 33862306a36Sopenharmony_ci case RT5670_DSP_CLK: 33962306a36Sopenharmony_ci case RT5670_GLB_CLK: 34062306a36Sopenharmony_ci case RT5670_PLL_CTRL1: 34162306a36Sopenharmony_ci case RT5670_PLL_CTRL2: 34262306a36Sopenharmony_ci case RT5670_ASRC_1: 34362306a36Sopenharmony_ci case RT5670_ASRC_2: 34462306a36Sopenharmony_ci case RT5670_ASRC_3: 34562306a36Sopenharmony_ci case RT5670_ASRC_4: 34662306a36Sopenharmony_ci case RT5670_ASRC_5: 34762306a36Sopenharmony_ci case RT5670_ASRC_7: 34862306a36Sopenharmony_ci case RT5670_ASRC_8: 34962306a36Sopenharmony_ci case RT5670_ASRC_9: 35062306a36Sopenharmony_ci case RT5670_ASRC_10: 35162306a36Sopenharmony_ci case RT5670_ASRC_11: 35262306a36Sopenharmony_ci case RT5670_ASRC_12: 35362306a36Sopenharmony_ci case RT5670_ASRC_13: 35462306a36Sopenharmony_ci case RT5670_ASRC_14: 35562306a36Sopenharmony_ci case RT5670_DEPOP_M1: 35662306a36Sopenharmony_ci case RT5670_DEPOP_M2: 35762306a36Sopenharmony_ci case RT5670_DEPOP_M3: 35862306a36Sopenharmony_ci case RT5670_CHARGE_PUMP: 35962306a36Sopenharmony_ci case RT5670_MICBIAS: 36062306a36Sopenharmony_ci case RT5670_A_JD_CTRL1: 36162306a36Sopenharmony_ci case RT5670_A_JD_CTRL2: 36262306a36Sopenharmony_ci case RT5670_VAD_CTRL1: 36362306a36Sopenharmony_ci case RT5670_VAD_CTRL2: 36462306a36Sopenharmony_ci case RT5670_VAD_CTRL3: 36562306a36Sopenharmony_ci case RT5670_VAD_CTRL4: 36662306a36Sopenharmony_ci case RT5670_VAD_CTRL5: 36762306a36Sopenharmony_ci case RT5670_ADC_EQ_CTRL1: 36862306a36Sopenharmony_ci case RT5670_ADC_EQ_CTRL2: 36962306a36Sopenharmony_ci case RT5670_EQ_CTRL1: 37062306a36Sopenharmony_ci case RT5670_EQ_CTRL2: 37162306a36Sopenharmony_ci case RT5670_ALC_DRC_CTRL1: 37262306a36Sopenharmony_ci case RT5670_ALC_DRC_CTRL2: 37362306a36Sopenharmony_ci case RT5670_ALC_CTRL_1: 37462306a36Sopenharmony_ci case RT5670_ALC_CTRL_2: 37562306a36Sopenharmony_ci case RT5670_ALC_CTRL_3: 37662306a36Sopenharmony_ci case RT5670_JD_CTRL: 37762306a36Sopenharmony_ci case RT5670_IRQ_CTRL1: 37862306a36Sopenharmony_ci case RT5670_IRQ_CTRL2: 37962306a36Sopenharmony_ci case RT5670_INT_IRQ_ST: 38062306a36Sopenharmony_ci case RT5670_GPIO_CTRL1: 38162306a36Sopenharmony_ci case RT5670_GPIO_CTRL2: 38262306a36Sopenharmony_ci case RT5670_GPIO_CTRL3: 38362306a36Sopenharmony_ci case RT5670_SCRABBLE_FUN: 38462306a36Sopenharmony_ci case RT5670_SCRABBLE_CTRL: 38562306a36Sopenharmony_ci case RT5670_BASE_BACK: 38662306a36Sopenharmony_ci case RT5670_MP3_PLUS1: 38762306a36Sopenharmony_ci case RT5670_MP3_PLUS2: 38862306a36Sopenharmony_ci case RT5670_ADJ_HPF1: 38962306a36Sopenharmony_ci case RT5670_ADJ_HPF2: 39062306a36Sopenharmony_ci case RT5670_HP_CALIB_AMP_DET: 39162306a36Sopenharmony_ci case RT5670_SV_ZCD1: 39262306a36Sopenharmony_ci case RT5670_SV_ZCD2: 39362306a36Sopenharmony_ci case RT5670_IL_CMD: 39462306a36Sopenharmony_ci case RT5670_IL_CMD2: 39562306a36Sopenharmony_ci case RT5670_IL_CMD3: 39662306a36Sopenharmony_ci case RT5670_DRC_HL_CTRL1: 39762306a36Sopenharmony_ci case RT5670_DRC_HL_CTRL2: 39862306a36Sopenharmony_ci case RT5670_ADC_MONO_HP_CTRL1: 39962306a36Sopenharmony_ci case RT5670_ADC_MONO_HP_CTRL2: 40062306a36Sopenharmony_ci case RT5670_ADC_STO2_HP_CTRL1: 40162306a36Sopenharmony_ci case RT5670_ADC_STO2_HP_CTRL2: 40262306a36Sopenharmony_ci case RT5670_JD_CTRL3: 40362306a36Sopenharmony_ci case RT5670_JD_CTRL4: 40462306a36Sopenharmony_ci case RT5670_DIG_MISC: 40562306a36Sopenharmony_ci case RT5670_DSP_CTRL1: 40662306a36Sopenharmony_ci case RT5670_DSP_CTRL2: 40762306a36Sopenharmony_ci case RT5670_DSP_CTRL3: 40862306a36Sopenharmony_ci case RT5670_DSP_CTRL4: 40962306a36Sopenharmony_ci case RT5670_DSP_CTRL5: 41062306a36Sopenharmony_ci case RT5670_GEN_CTRL2: 41162306a36Sopenharmony_ci case RT5670_GEN_CTRL3: 41262306a36Sopenharmony_ci case RT5670_VENDOR_ID: 41362306a36Sopenharmony_ci case RT5670_VENDOR_ID1: 41462306a36Sopenharmony_ci case RT5670_VENDOR_ID2: 41562306a36Sopenharmony_ci return true; 41662306a36Sopenharmony_ci default: 41762306a36Sopenharmony_ci return false; 41862306a36Sopenharmony_ci } 41962306a36Sopenharmony_ci} 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci/** 42262306a36Sopenharmony_ci * rt5670_headset_detect - Detect headset. 42362306a36Sopenharmony_ci * @component: SoC audio component device. 42462306a36Sopenharmony_ci * @jack_insert: Jack insert or not. 42562306a36Sopenharmony_ci * 42662306a36Sopenharmony_ci * Detect whether is headset or not when jack inserted. 42762306a36Sopenharmony_ci * 42862306a36Sopenharmony_ci * Returns detect status. 42962306a36Sopenharmony_ci */ 43062306a36Sopenharmony_ci 43162306a36Sopenharmony_cistatic int rt5670_headset_detect(struct snd_soc_component *component, int jack_insert) 43262306a36Sopenharmony_ci{ 43362306a36Sopenharmony_ci int val; 43462306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); 43562306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci if (jack_insert) { 43862306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin(dapm, "Mic Det Power"); 43962306a36Sopenharmony_ci snd_soc_dapm_sync(dapm); 44062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 0x4, 0x0); 44162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_CJ_CTRL2, 44262306a36Sopenharmony_ci RT5670_CBJ_DET_MODE | RT5670_CBJ_MN_JD, 44362306a36Sopenharmony_ci RT5670_CBJ_MN_JD); 44462306a36Sopenharmony_ci snd_soc_component_write(component, RT5670_GPIO_CTRL2, 0x0004); 44562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GPIO_CTRL1, 44662306a36Sopenharmony_ci RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_IRQ); 44762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_CJ_CTRL1, 44862306a36Sopenharmony_ci RT5670_CBJ_BST1_EN, RT5670_CBJ_BST1_EN); 44962306a36Sopenharmony_ci snd_soc_component_write(component, RT5670_JD_CTRL3, 0x00f0); 45062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_CJ_CTRL2, 45162306a36Sopenharmony_ci RT5670_CBJ_MN_JD, RT5670_CBJ_MN_JD); 45262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_CJ_CTRL2, 45362306a36Sopenharmony_ci RT5670_CBJ_MN_JD, 0); 45462306a36Sopenharmony_ci msleep(300); 45562306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5670_CJ_CTRL3) & 0x7; 45662306a36Sopenharmony_ci if (val == 0x1 || val == 0x2) { 45762306a36Sopenharmony_ci rt5670->jack_type = SND_JACK_HEADSET; 45862306a36Sopenharmony_ci /* for push button */ 45962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_INT_IRQ_ST, 0x8, 0x8); 46062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_IL_CMD, 0x40, 0x40); 46162306a36Sopenharmony_ci snd_soc_component_read(component, RT5670_IL_CMD); 46262306a36Sopenharmony_ci } else { 46362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 0x4, 0x4); 46462306a36Sopenharmony_ci rt5670->jack_type = SND_JACK_HEADPHONE; 46562306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 46662306a36Sopenharmony_ci snd_soc_dapm_sync(dapm); 46762306a36Sopenharmony_ci } 46862306a36Sopenharmony_ci } else { 46962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_INT_IRQ_ST, 0x8, 0x0); 47062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 0x4, 0x4); 47162306a36Sopenharmony_ci rt5670->jack_type = 0; 47262306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 47362306a36Sopenharmony_ci snd_soc_dapm_sync(dapm); 47462306a36Sopenharmony_ci } 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ci return rt5670->jack_type; 47762306a36Sopenharmony_ci} 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_civoid rt5670_jack_suspend(struct snd_soc_component *component) 48062306a36Sopenharmony_ci{ 48162306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ci rt5670->jack_type_saved = rt5670->jack_type; 48462306a36Sopenharmony_ci rt5670_headset_detect(component, 0); 48562306a36Sopenharmony_ci} 48662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5670_jack_suspend); 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_civoid rt5670_jack_resume(struct snd_soc_component *component) 48962306a36Sopenharmony_ci{ 49062306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci if (rt5670->jack_type_saved) 49362306a36Sopenharmony_ci rt5670_headset_detect(component, 1); 49462306a36Sopenharmony_ci} 49562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5670_jack_resume); 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_cistatic int rt5670_button_detect(struct snd_soc_component *component) 49862306a36Sopenharmony_ci{ 49962306a36Sopenharmony_ci int btn_type, val; 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5670_IL_CMD); 50262306a36Sopenharmony_ci btn_type = val & 0xff80; 50362306a36Sopenharmony_ci snd_soc_component_write(component, RT5670_IL_CMD, val); 50462306a36Sopenharmony_ci if (btn_type != 0) { 50562306a36Sopenharmony_ci msleep(20); 50662306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5670_IL_CMD); 50762306a36Sopenharmony_ci snd_soc_component_write(component, RT5670_IL_CMD, val); 50862306a36Sopenharmony_ci } 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci return btn_type; 51162306a36Sopenharmony_ci} 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_cistatic int rt5670_irq_detection(void *data) 51462306a36Sopenharmony_ci{ 51562306a36Sopenharmony_ci struct rt5670_priv *rt5670 = (struct rt5670_priv *)data; 51662306a36Sopenharmony_ci struct snd_soc_jack_gpio *gpio = &rt5670->hp_gpio; 51762306a36Sopenharmony_ci struct snd_soc_jack *jack = rt5670->jack; 51862306a36Sopenharmony_ci int val, btn_type, report = jack->status; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci if (rt5670->jd_mode == 1) /* 2 port */ 52162306a36Sopenharmony_ci val = snd_soc_component_read(rt5670->component, RT5670_A_JD_CTRL1) & 0x0070; 52262306a36Sopenharmony_ci else 52362306a36Sopenharmony_ci val = snd_soc_component_read(rt5670->component, RT5670_A_JD_CTRL1) & 0x0020; 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci switch (val) { 52662306a36Sopenharmony_ci /* jack in */ 52762306a36Sopenharmony_ci case 0x30: /* 2 port */ 52862306a36Sopenharmony_ci case 0x0: /* 1 port or 2 port */ 52962306a36Sopenharmony_ci if (rt5670->jack_type == 0) { 53062306a36Sopenharmony_ci report = rt5670_headset_detect(rt5670->component, 1); 53162306a36Sopenharmony_ci /* for push button and jack out */ 53262306a36Sopenharmony_ci gpio->debounce_time = 25; 53362306a36Sopenharmony_ci break; 53462306a36Sopenharmony_ci } 53562306a36Sopenharmony_ci btn_type = 0; 53662306a36Sopenharmony_ci if (snd_soc_component_read(rt5670->component, RT5670_INT_IRQ_ST) & 0x4) { 53762306a36Sopenharmony_ci /* button pressed */ 53862306a36Sopenharmony_ci report = SND_JACK_HEADSET; 53962306a36Sopenharmony_ci btn_type = rt5670_button_detect(rt5670->component); 54062306a36Sopenharmony_ci switch (btn_type) { 54162306a36Sopenharmony_ci case 0x2000: /* up */ 54262306a36Sopenharmony_ci report |= SND_JACK_BTN_1; 54362306a36Sopenharmony_ci break; 54462306a36Sopenharmony_ci case 0x0400: /* center */ 54562306a36Sopenharmony_ci report |= SND_JACK_BTN_0; 54662306a36Sopenharmony_ci break; 54762306a36Sopenharmony_ci case 0x0080: /* down */ 54862306a36Sopenharmony_ci report |= SND_JACK_BTN_2; 54962306a36Sopenharmony_ci break; 55062306a36Sopenharmony_ci default: 55162306a36Sopenharmony_ci dev_err(rt5670->component->dev, 55262306a36Sopenharmony_ci "Unexpected button code 0x%04x\n", 55362306a36Sopenharmony_ci btn_type); 55462306a36Sopenharmony_ci break; 55562306a36Sopenharmony_ci } 55662306a36Sopenharmony_ci } 55762306a36Sopenharmony_ci if (btn_type == 0)/* button release */ 55862306a36Sopenharmony_ci report = rt5670->jack_type; 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_ci break; 56162306a36Sopenharmony_ci /* jack out */ 56262306a36Sopenharmony_ci case 0x70: /* 2 port */ 56362306a36Sopenharmony_ci case 0x10: /* 2 port */ 56462306a36Sopenharmony_ci case 0x20: /* 1 port */ 56562306a36Sopenharmony_ci report = 0; 56662306a36Sopenharmony_ci snd_soc_component_update_bits(rt5670->component, RT5670_INT_IRQ_ST, 0x1, 0x0); 56762306a36Sopenharmony_ci rt5670_headset_detect(rt5670->component, 0); 56862306a36Sopenharmony_ci gpio->debounce_time = 150; /* for jack in */ 56962306a36Sopenharmony_ci break; 57062306a36Sopenharmony_ci default: 57162306a36Sopenharmony_ci break; 57262306a36Sopenharmony_ci } 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci return report; 57562306a36Sopenharmony_ci} 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ciint rt5670_set_jack_detect(struct snd_soc_component *component, 57862306a36Sopenharmony_ci struct snd_soc_jack *jack) 57962306a36Sopenharmony_ci{ 58062306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 58162306a36Sopenharmony_ci int ret; 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci rt5670->jack = jack; 58462306a36Sopenharmony_ci rt5670->hp_gpio.gpiod_dev = component->dev; 58562306a36Sopenharmony_ci rt5670->hp_gpio.name = "headset"; 58662306a36Sopenharmony_ci rt5670->hp_gpio.report = SND_JACK_HEADSET | 58762306a36Sopenharmony_ci SND_JACK_BTN_0 | SND_JACK_BTN_1 | SND_JACK_BTN_2; 58862306a36Sopenharmony_ci rt5670->hp_gpio.debounce_time = 150; 58962306a36Sopenharmony_ci rt5670->hp_gpio.wake = true; 59062306a36Sopenharmony_ci rt5670->hp_gpio.data = (struct rt5670_priv *)rt5670; 59162306a36Sopenharmony_ci rt5670->hp_gpio.jack_status_check = rt5670_irq_detection; 59262306a36Sopenharmony_ci 59362306a36Sopenharmony_ci ret = snd_soc_jack_add_gpios(rt5670->jack, 1, 59462306a36Sopenharmony_ci &rt5670->hp_gpio); 59562306a36Sopenharmony_ci if (ret) { 59662306a36Sopenharmony_ci dev_err(component->dev, "Adding jack GPIO failed\n"); 59762306a36Sopenharmony_ci return ret; 59862306a36Sopenharmony_ci } 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci return 0; 60162306a36Sopenharmony_ci} 60262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5670_set_jack_detect); 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); 60562306a36Sopenharmony_cistatic const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0); 60662306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); 60762306a36Sopenharmony_cistatic const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000); 60862306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ 61162306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(bst_tlv, 61262306a36Sopenharmony_ci 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0), 61362306a36Sopenharmony_ci 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0), 61462306a36Sopenharmony_ci 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0), 61562306a36Sopenharmony_ci 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0), 61662306a36Sopenharmony_ci 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0), 61762306a36Sopenharmony_ci 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0), 61862306a36Sopenharmony_ci 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0) 61962306a36Sopenharmony_ci); 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci/* Interface data select */ 62262306a36Sopenharmony_cistatic const char * const rt5670_data_select[] = { 62362306a36Sopenharmony_ci "Normal", "Swap", "left copy to right", "right copy to left" 62462306a36Sopenharmony_ci}; 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_if2_dac_enum, RT5670_DIG_INF1_DATA, 62762306a36Sopenharmony_ci RT5670_IF2_DAC_SEL_SFT, rt5670_data_select); 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_if2_adc_enum, RT5670_DIG_INF1_DATA, 63062306a36Sopenharmony_ci RT5670_IF2_ADC_SEL_SFT, rt5670_data_select); 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci/* 63362306a36Sopenharmony_ci * For reliable output-mute LED control we need a "DAC1 Playback Switch" control. 63462306a36Sopenharmony_ci * We emulate this by only clearing the RT5670_M_DAC1_L/_R AD_DA_MIXER register 63562306a36Sopenharmony_ci * bits when both our emulated DAC1 Playback Switch control and the DAC1 MIXL/R 63662306a36Sopenharmony_ci * DAPM-mixer DAC1 input are enabled. 63762306a36Sopenharmony_ci */ 63862306a36Sopenharmony_cistatic void rt5670_update_ad_da_mixer_dac1_m_bits(struct rt5670_priv *rt5670) 63962306a36Sopenharmony_ci{ 64062306a36Sopenharmony_ci int val = RT5670_M_DAC1_L | RT5670_M_DAC1_R; 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci if (rt5670->dac1_mixl_dac1_switch && rt5670->dac1_playback_switch_l) 64362306a36Sopenharmony_ci val &= ~RT5670_M_DAC1_L; 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci if (rt5670->dac1_mixr_dac1_switch && rt5670->dac1_playback_switch_r) 64662306a36Sopenharmony_ci val &= ~RT5670_M_DAC1_R; 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_AD_DA_MIXER, 64962306a36Sopenharmony_ci RT5670_M_DAC1_L | RT5670_M_DAC1_R, val); 65062306a36Sopenharmony_ci} 65162306a36Sopenharmony_ci 65262306a36Sopenharmony_cistatic int rt5670_dac1_playback_switch_get(struct snd_kcontrol *kcontrol, 65362306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 65462306a36Sopenharmony_ci{ 65562306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 65662306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_ci ucontrol->value.integer.value[0] = rt5670->dac1_playback_switch_l; 65962306a36Sopenharmony_ci ucontrol->value.integer.value[1] = rt5670->dac1_playback_switch_r; 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci return 0; 66262306a36Sopenharmony_ci} 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_cistatic int rt5670_dac1_playback_switch_put(struct snd_kcontrol *kcontrol, 66562306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 66662306a36Sopenharmony_ci{ 66762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 66862306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci if (rt5670->dac1_playback_switch_l == ucontrol->value.integer.value[0] && 67162306a36Sopenharmony_ci rt5670->dac1_playback_switch_r == ucontrol->value.integer.value[1]) 67262306a36Sopenharmony_ci return 0; 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci rt5670->dac1_playback_switch_l = ucontrol->value.integer.value[0]; 67562306a36Sopenharmony_ci rt5670->dac1_playback_switch_r = ucontrol->value.integer.value[1]; 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci rt5670_update_ad_da_mixer_dac1_m_bits(rt5670); 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci return 1; 68062306a36Sopenharmony_ci} 68162306a36Sopenharmony_ci 68262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_snd_controls[] = { 68362306a36Sopenharmony_ci /* Headphone Output Volume */ 68462306a36Sopenharmony_ci SOC_DOUBLE_TLV("HP Playback Volume", RT5670_HP_VOL, 68562306a36Sopenharmony_ci RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 68662306a36Sopenharmony_ci 39, 1, out_vol_tlv), 68762306a36Sopenharmony_ci /* OUTPUT Control */ 68862306a36Sopenharmony_ci SOC_DOUBLE_TLV("OUT Playback Volume", RT5670_LOUT1, 68962306a36Sopenharmony_ci RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 39, 1, out_vol_tlv), 69062306a36Sopenharmony_ci /* DAC Digital Volume */ 69162306a36Sopenharmony_ci SOC_DOUBLE("DAC2 Playback Switch", RT5670_DAC_CTRL, 69262306a36Sopenharmony_ci RT5670_M_DAC_L2_VOL_SFT, RT5670_M_DAC_R2_VOL_SFT, 1, 1), 69362306a36Sopenharmony_ci SOC_DOUBLE_EXT("DAC1 Playback Switch", SND_SOC_NOPM, 0, 1, 1, 0, 69462306a36Sopenharmony_ci rt5670_dac1_playback_switch_get, rt5670_dac1_playback_switch_put), 69562306a36Sopenharmony_ci SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5670_DAC1_DIG_VOL, 69662306a36Sopenharmony_ci RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 69762306a36Sopenharmony_ci 175, 0, dac_vol_tlv), 69862306a36Sopenharmony_ci SOC_DOUBLE_TLV("Mono DAC Playback Volume", RT5670_DAC2_DIG_VOL, 69962306a36Sopenharmony_ci RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 70062306a36Sopenharmony_ci 175, 0, dac_vol_tlv), 70162306a36Sopenharmony_ci /* IN1/IN2 Control */ 70262306a36Sopenharmony_ci SOC_SINGLE_TLV("IN1 Boost Volume", RT5670_CJ_CTRL1, 70362306a36Sopenharmony_ci RT5670_BST_SFT1, 8, 0, bst_tlv), 70462306a36Sopenharmony_ci SOC_SINGLE_TLV("IN2 Boost Volume", RT5670_IN2, 70562306a36Sopenharmony_ci RT5670_BST_SFT1, 8, 0, bst_tlv), 70662306a36Sopenharmony_ci /* INL/INR Volume Control */ 70762306a36Sopenharmony_ci SOC_DOUBLE_TLV("IN Capture Volume", RT5670_INL1_INR1_VOL, 70862306a36Sopenharmony_ci RT5670_INL_VOL_SFT, RT5670_INR_VOL_SFT, 70962306a36Sopenharmony_ci 31, 1, in_vol_tlv), 71062306a36Sopenharmony_ci /* ADC Digital Volume Control */ 71162306a36Sopenharmony_ci SOC_DOUBLE("ADC Capture Switch", RT5670_STO1_ADC_DIG_VOL, 71262306a36Sopenharmony_ci RT5670_L_MUTE_SFT, RT5670_R_MUTE_SFT, 1, 1), 71362306a36Sopenharmony_ci SOC_DOUBLE_TLV("ADC Capture Volume", RT5670_STO1_ADC_DIG_VOL, 71462306a36Sopenharmony_ci RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 71562306a36Sopenharmony_ci 127, 0, adc_vol_tlv), 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_ci SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5670_MONO_ADC_DIG_VOL, 71862306a36Sopenharmony_ci RT5670_L_VOL_SFT, RT5670_R_VOL_SFT, 71962306a36Sopenharmony_ci 127, 0, adc_vol_tlv), 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_ci /* ADC Boost Volume Control */ 72262306a36Sopenharmony_ci SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5670_ADC_BST_VOL1, 72362306a36Sopenharmony_ci RT5670_STO1_ADC_L_BST_SFT, RT5670_STO1_ADC_R_BST_SFT, 72462306a36Sopenharmony_ci 3, 0, adc_bst_tlv), 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5670_ADC_BST_VOL1, 72762306a36Sopenharmony_ci RT5670_STO2_ADC_L_BST_SFT, RT5670_STO2_ADC_R_BST_SFT, 72862306a36Sopenharmony_ci 3, 0, adc_bst_tlv), 72962306a36Sopenharmony_ci 73062306a36Sopenharmony_ci SOC_ENUM("ADC IF2 Data Switch", rt5670_if2_adc_enum), 73162306a36Sopenharmony_ci SOC_ENUM("DAC IF2 Data Switch", rt5670_if2_dac_enum), 73262306a36Sopenharmony_ci}; 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci/** 73562306a36Sopenharmony_ci * set_dmic_clk - Set parameter of dmic. 73662306a36Sopenharmony_ci * 73762306a36Sopenharmony_ci * @w: DAPM widget. 73862306a36Sopenharmony_ci * @kcontrol: The kcontrol of this widget. 73962306a36Sopenharmony_ci * @event: Event id. 74062306a36Sopenharmony_ci * 74162306a36Sopenharmony_ci * Choose dmic clock between 1MHz and 3MHz. 74262306a36Sopenharmony_ci * It is better for clock to approximate 3MHz. 74362306a36Sopenharmony_ci */ 74462306a36Sopenharmony_cistatic int set_dmic_clk(struct snd_soc_dapm_widget *w, 74562306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 74662306a36Sopenharmony_ci{ 74762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 74862306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 74962306a36Sopenharmony_ci int idx, rate; 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_ci rate = rt5670->sysclk / rl6231_get_pre_div(rt5670->regmap, 75262306a36Sopenharmony_ci RT5670_ADDA_CLK1, RT5670_I2S_PD1_SFT); 75362306a36Sopenharmony_ci idx = rl6231_calc_dmic_clk(rate); 75462306a36Sopenharmony_ci if (idx < 0) 75562306a36Sopenharmony_ci dev_err(component->dev, "Failed to set DMIC clock\n"); 75662306a36Sopenharmony_ci else 75762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_DMIC_CTRL1, 75862306a36Sopenharmony_ci RT5670_DMIC_CLK_MASK, idx << RT5670_DMIC_CLK_SFT); 75962306a36Sopenharmony_ci return idx; 76062306a36Sopenharmony_ci} 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_cistatic int is_sys_clk_from_pll(struct snd_soc_dapm_widget *source, 76362306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 76462306a36Sopenharmony_ci{ 76562306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); 76662306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci if (rt5670->sysclk_src == RT5670_SCLK_S_PLL1) 76962306a36Sopenharmony_ci return 1; 77062306a36Sopenharmony_ci else 77162306a36Sopenharmony_ci return 0; 77262306a36Sopenharmony_ci} 77362306a36Sopenharmony_ci 77462306a36Sopenharmony_cistatic int is_using_asrc(struct snd_soc_dapm_widget *source, 77562306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 77662306a36Sopenharmony_ci{ 77762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); 77862306a36Sopenharmony_ci unsigned int reg, shift, val; 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ci switch (source->shift) { 78162306a36Sopenharmony_ci case 0: 78262306a36Sopenharmony_ci reg = RT5670_ASRC_3; 78362306a36Sopenharmony_ci shift = 0; 78462306a36Sopenharmony_ci break; 78562306a36Sopenharmony_ci case 1: 78662306a36Sopenharmony_ci reg = RT5670_ASRC_3; 78762306a36Sopenharmony_ci shift = 4; 78862306a36Sopenharmony_ci break; 78962306a36Sopenharmony_ci case 2: 79062306a36Sopenharmony_ci reg = RT5670_ASRC_5; 79162306a36Sopenharmony_ci shift = 12; 79262306a36Sopenharmony_ci break; 79362306a36Sopenharmony_ci case 3: 79462306a36Sopenharmony_ci reg = RT5670_ASRC_2; 79562306a36Sopenharmony_ci shift = 0; 79662306a36Sopenharmony_ci break; 79762306a36Sopenharmony_ci case 8: 79862306a36Sopenharmony_ci reg = RT5670_ASRC_2; 79962306a36Sopenharmony_ci shift = 4; 80062306a36Sopenharmony_ci break; 80162306a36Sopenharmony_ci case 9: 80262306a36Sopenharmony_ci reg = RT5670_ASRC_2; 80362306a36Sopenharmony_ci shift = 8; 80462306a36Sopenharmony_ci break; 80562306a36Sopenharmony_ci case 10: 80662306a36Sopenharmony_ci reg = RT5670_ASRC_2; 80762306a36Sopenharmony_ci shift = 12; 80862306a36Sopenharmony_ci break; 80962306a36Sopenharmony_ci default: 81062306a36Sopenharmony_ci return 0; 81162306a36Sopenharmony_ci } 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci val = (snd_soc_component_read(component, reg) >> shift) & 0xf; 81462306a36Sopenharmony_ci switch (val) { 81562306a36Sopenharmony_ci case 1: 81662306a36Sopenharmony_ci case 2: 81762306a36Sopenharmony_ci case 3: 81862306a36Sopenharmony_ci case 4: 81962306a36Sopenharmony_ci return 1; 82062306a36Sopenharmony_ci default: 82162306a36Sopenharmony_ci return 0; 82262306a36Sopenharmony_ci } 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_ci} 82562306a36Sopenharmony_ci 82662306a36Sopenharmony_cistatic int can_use_asrc(struct snd_soc_dapm_widget *source, 82762306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 82862306a36Sopenharmony_ci{ 82962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); 83062306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ci if (rt5670->sysclk > rt5670->lrck[RT5670_AIF1] * 384) 83362306a36Sopenharmony_ci return 1; 83462306a36Sopenharmony_ci 83562306a36Sopenharmony_ci return 0; 83662306a36Sopenharmony_ci} 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_ci/** 84062306a36Sopenharmony_ci * rt5670_sel_asrc_clk_src - select ASRC clock source for a set of filters 84162306a36Sopenharmony_ci * @component: SoC audio component device. 84262306a36Sopenharmony_ci * @filter_mask: mask of filters. 84362306a36Sopenharmony_ci * @clk_src: clock source 84462306a36Sopenharmony_ci * 84562306a36Sopenharmony_ci * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5670 can 84662306a36Sopenharmony_ci * only support standard 32fs or 64fs i2s format, ASRC should be enabled to 84762306a36Sopenharmony_ci * support special i2s clock format such as Intel's 100fs(100 * sampling rate). 84862306a36Sopenharmony_ci * ASRC function will track i2s clock and generate a corresponding system clock 84962306a36Sopenharmony_ci * for codec. This function provides an API to select the clock source for a 85062306a36Sopenharmony_ci * set of filters specified by the mask. And the codec driver will turn on ASRC 85162306a36Sopenharmony_ci * for these filters if ASRC is selected as their clock source. 85262306a36Sopenharmony_ci */ 85362306a36Sopenharmony_ciint rt5670_sel_asrc_clk_src(struct snd_soc_component *component, 85462306a36Sopenharmony_ci unsigned int filter_mask, unsigned int clk_src) 85562306a36Sopenharmony_ci{ 85662306a36Sopenharmony_ci unsigned int asrc2_mask = 0, asrc2_value = 0; 85762306a36Sopenharmony_ci unsigned int asrc3_mask = 0, asrc3_value = 0; 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci if (clk_src > RT5670_CLK_SEL_SYS3) 86062306a36Sopenharmony_ci return -EINVAL; 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci if (filter_mask & RT5670_DA_STEREO_FILTER) { 86362306a36Sopenharmony_ci asrc2_mask |= RT5670_DA_STO_CLK_SEL_MASK; 86462306a36Sopenharmony_ci asrc2_value = (asrc2_value & ~RT5670_DA_STO_CLK_SEL_MASK) 86562306a36Sopenharmony_ci | (clk_src << RT5670_DA_STO_CLK_SEL_SFT); 86662306a36Sopenharmony_ci } 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci if (filter_mask & RT5670_DA_MONO_L_FILTER) { 86962306a36Sopenharmony_ci asrc2_mask |= RT5670_DA_MONOL_CLK_SEL_MASK; 87062306a36Sopenharmony_ci asrc2_value = (asrc2_value & ~RT5670_DA_MONOL_CLK_SEL_MASK) 87162306a36Sopenharmony_ci | (clk_src << RT5670_DA_MONOL_CLK_SEL_SFT); 87262306a36Sopenharmony_ci } 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci if (filter_mask & RT5670_DA_MONO_R_FILTER) { 87562306a36Sopenharmony_ci asrc2_mask |= RT5670_DA_MONOR_CLK_SEL_MASK; 87662306a36Sopenharmony_ci asrc2_value = (asrc2_value & ~RT5670_DA_MONOR_CLK_SEL_MASK) 87762306a36Sopenharmony_ci | (clk_src << RT5670_DA_MONOR_CLK_SEL_SFT); 87862306a36Sopenharmony_ci } 87962306a36Sopenharmony_ci 88062306a36Sopenharmony_ci if (filter_mask & RT5670_AD_STEREO_FILTER) { 88162306a36Sopenharmony_ci asrc2_mask |= RT5670_AD_STO1_CLK_SEL_MASK; 88262306a36Sopenharmony_ci asrc2_value = (asrc2_value & ~RT5670_AD_STO1_CLK_SEL_MASK) 88362306a36Sopenharmony_ci | (clk_src << RT5670_AD_STO1_CLK_SEL_SFT); 88462306a36Sopenharmony_ci } 88562306a36Sopenharmony_ci 88662306a36Sopenharmony_ci if (filter_mask & RT5670_AD_MONO_L_FILTER) { 88762306a36Sopenharmony_ci asrc3_mask |= RT5670_AD_MONOL_CLK_SEL_MASK; 88862306a36Sopenharmony_ci asrc3_value = (asrc3_value & ~RT5670_AD_MONOL_CLK_SEL_MASK) 88962306a36Sopenharmony_ci | (clk_src << RT5670_AD_MONOL_CLK_SEL_SFT); 89062306a36Sopenharmony_ci } 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_ci if (filter_mask & RT5670_AD_MONO_R_FILTER) { 89362306a36Sopenharmony_ci asrc3_mask |= RT5670_AD_MONOR_CLK_SEL_MASK; 89462306a36Sopenharmony_ci asrc3_value = (asrc3_value & ~RT5670_AD_MONOR_CLK_SEL_MASK) 89562306a36Sopenharmony_ci | (clk_src << RT5670_AD_MONOR_CLK_SEL_SFT); 89662306a36Sopenharmony_ci } 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci if (filter_mask & RT5670_UP_RATE_FILTER) { 89962306a36Sopenharmony_ci asrc3_mask |= RT5670_UP_CLK_SEL_MASK; 90062306a36Sopenharmony_ci asrc3_value = (asrc3_value & ~RT5670_UP_CLK_SEL_MASK) 90162306a36Sopenharmony_ci | (clk_src << RT5670_UP_CLK_SEL_SFT); 90262306a36Sopenharmony_ci } 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_ci if (filter_mask & RT5670_DOWN_RATE_FILTER) { 90562306a36Sopenharmony_ci asrc3_mask |= RT5670_DOWN_CLK_SEL_MASK; 90662306a36Sopenharmony_ci asrc3_value = (asrc3_value & ~RT5670_DOWN_CLK_SEL_MASK) 90762306a36Sopenharmony_ci | (clk_src << RT5670_DOWN_CLK_SEL_SFT); 90862306a36Sopenharmony_ci } 90962306a36Sopenharmony_ci 91062306a36Sopenharmony_ci if (asrc2_mask) 91162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_ASRC_2, 91262306a36Sopenharmony_ci asrc2_mask, asrc2_value); 91362306a36Sopenharmony_ci 91462306a36Sopenharmony_ci if (asrc3_mask) 91562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_ASRC_3, 91662306a36Sopenharmony_ci asrc3_mask, asrc3_value); 91762306a36Sopenharmony_ci return 0; 91862306a36Sopenharmony_ci} 91962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5670_sel_asrc_clk_src); 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_ci/* Digital Mixer */ 92262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto1_adc_l_mix[] = { 92362306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO1_ADC_MIXER, 92462306a36Sopenharmony_ci RT5670_M_ADC_L1_SFT, 1, 1), 92562306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO1_ADC_MIXER, 92662306a36Sopenharmony_ci RT5670_M_ADC_L2_SFT, 1, 1), 92762306a36Sopenharmony_ci}; 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto1_adc_r_mix[] = { 93062306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO1_ADC_MIXER, 93162306a36Sopenharmony_ci RT5670_M_ADC_R1_SFT, 1, 1), 93262306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO1_ADC_MIXER, 93362306a36Sopenharmony_ci RT5670_M_ADC_R2_SFT, 1, 1), 93462306a36Sopenharmony_ci}; 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto2_adc_l_mix[] = { 93762306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO2_ADC_MIXER, 93862306a36Sopenharmony_ci RT5670_M_ADC_L1_SFT, 1, 1), 93962306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO2_ADC_MIXER, 94062306a36Sopenharmony_ci RT5670_M_ADC_L2_SFT, 1, 1), 94162306a36Sopenharmony_ci}; 94262306a36Sopenharmony_ci 94362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto2_adc_r_mix[] = { 94462306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5670_STO2_ADC_MIXER, 94562306a36Sopenharmony_ci RT5670_M_ADC_R1_SFT, 1, 1), 94662306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5670_STO2_ADC_MIXER, 94762306a36Sopenharmony_ci RT5670_M_ADC_R2_SFT, 1, 1), 94862306a36Sopenharmony_ci}; 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_adc_l_mix[] = { 95162306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5670_MONO_ADC_MIXER, 95262306a36Sopenharmony_ci RT5670_M_MONO_ADC_L1_SFT, 1, 1), 95362306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5670_MONO_ADC_MIXER, 95462306a36Sopenharmony_ci RT5670_M_MONO_ADC_L2_SFT, 1, 1), 95562306a36Sopenharmony_ci}; 95662306a36Sopenharmony_ci 95762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_adc_r_mix[] = { 95862306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5670_MONO_ADC_MIXER, 95962306a36Sopenharmony_ci RT5670_M_MONO_ADC_R1_SFT, 1, 1), 96062306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5670_MONO_ADC_MIXER, 96162306a36Sopenharmony_ci RT5670_M_MONO_ADC_R2_SFT, 1, 1), 96262306a36Sopenharmony_ci}; 96362306a36Sopenharmony_ci 96462306a36Sopenharmony_ci/* See comment above rt5670_update_ad_da_mixer_dac1_m_bits() */ 96562306a36Sopenharmony_cistatic int rt5670_put_dac1_mix_dac1_switch(struct snd_kcontrol *kcontrol, 96662306a36Sopenharmony_ci struct snd_ctl_elem_value *ucontrol) 96762306a36Sopenharmony_ci{ 96862306a36Sopenharmony_ci struct soc_mixer_control *mc = (struct soc_mixer_control *)kcontrol->private_value; 96962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_kcontrol_component(kcontrol); 97062306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 97162306a36Sopenharmony_ci int ret; 97262306a36Sopenharmony_ci 97362306a36Sopenharmony_ci if (mc->shift == 0) 97462306a36Sopenharmony_ci rt5670->dac1_mixl_dac1_switch = ucontrol->value.integer.value[0]; 97562306a36Sopenharmony_ci else 97662306a36Sopenharmony_ci rt5670->dac1_mixr_dac1_switch = ucontrol->value.integer.value[0]; 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_ci /* Apply the update (if any) */ 97962306a36Sopenharmony_ci ret = snd_soc_dapm_put_volsw(kcontrol, ucontrol); 98062306a36Sopenharmony_ci if (ret == 0) 98162306a36Sopenharmony_ci return 0; 98262306a36Sopenharmony_ci 98362306a36Sopenharmony_ci rt5670_update_ad_da_mixer_dac1_m_bits(rt5670); 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_ci return 1; 98662306a36Sopenharmony_ci} 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_ci#define SOC_DAPM_SINGLE_RT5670_DAC1_SW(name, shift) \ 98962306a36Sopenharmony_ci SOC_SINGLE_EXT(name, SND_SOC_NOPM, shift, 1, 0, \ 99062306a36Sopenharmony_ci snd_soc_dapm_get_volsw, rt5670_put_dac1_mix_dac1_switch) 99162306a36Sopenharmony_ci 99262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dac_l_mix[] = { 99362306a36Sopenharmony_ci SOC_DAPM_SINGLE("Stereo ADC Switch", RT5670_AD_DA_MIXER, 99462306a36Sopenharmony_ci RT5670_M_ADCMIX_L_SFT, 1, 1), 99562306a36Sopenharmony_ci SOC_DAPM_SINGLE_RT5670_DAC1_SW("DAC1 Switch", 0), 99662306a36Sopenharmony_ci}; 99762306a36Sopenharmony_ci 99862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dac_r_mix[] = { 99962306a36Sopenharmony_ci SOC_DAPM_SINGLE("Stereo ADC Switch", RT5670_AD_DA_MIXER, 100062306a36Sopenharmony_ci RT5670_M_ADCMIX_R_SFT, 1, 1), 100162306a36Sopenharmony_ci SOC_DAPM_SINGLE_RT5670_DAC1_SW("DAC1 Switch", 1), 100262306a36Sopenharmony_ci}; 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto_dac_l_mix[] = { 100562306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_STO_DAC_MIXER, 100662306a36Sopenharmony_ci RT5670_M_DAC_L1_SFT, 1, 1), 100762306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_STO_DAC_MIXER, 100862306a36Sopenharmony_ci RT5670_M_DAC_L2_SFT, 1, 1), 100962306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_STO_DAC_MIXER, 101062306a36Sopenharmony_ci RT5670_M_DAC_R1_STO_L_SFT, 1, 1), 101162306a36Sopenharmony_ci}; 101262306a36Sopenharmony_ci 101362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto_dac_r_mix[] = { 101462306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_STO_DAC_MIXER, 101562306a36Sopenharmony_ci RT5670_M_DAC_R1_SFT, 1, 1), 101662306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_STO_DAC_MIXER, 101762306a36Sopenharmony_ci RT5670_M_DAC_R2_SFT, 1, 1), 101862306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_STO_DAC_MIXER, 101962306a36Sopenharmony_ci RT5670_M_DAC_L1_STO_R_SFT, 1, 1), 102062306a36Sopenharmony_ci}; 102162306a36Sopenharmony_ci 102262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_dac_l_mix[] = { 102362306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_DD_MIXER, 102462306a36Sopenharmony_ci RT5670_M_DAC_L1_MONO_L_SFT, 1, 1), 102562306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DD_MIXER, 102662306a36Sopenharmony_ci RT5670_M_DAC_L2_MONO_L_SFT, 1, 1), 102762306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DD_MIXER, 102862306a36Sopenharmony_ci RT5670_M_DAC_R2_MONO_L_SFT, 1, 1), 102962306a36Sopenharmony_ci}; 103062306a36Sopenharmony_ci 103162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_dac_r_mix[] = { 103262306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_DD_MIXER, 103362306a36Sopenharmony_ci RT5670_M_DAC_R1_MONO_R_SFT, 1, 1), 103462306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DD_MIXER, 103562306a36Sopenharmony_ci RT5670_M_DAC_R2_MONO_R_SFT, 1, 1), 103662306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DD_MIXER, 103762306a36Sopenharmony_ci RT5670_M_DAC_L2_MONO_R_SFT, 1, 1), 103862306a36Sopenharmony_ci}; 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dig_l_mix[] = { 104162306a36Sopenharmony_ci SOC_DAPM_SINGLE("Sto DAC Mix L Switch", RT5670_DIG_MIXER, 104262306a36Sopenharmony_ci RT5670_M_STO_L_DAC_L_SFT, 1, 1), 104362306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DIG_MIXER, 104462306a36Sopenharmony_ci RT5670_M_DAC_L2_DAC_L_SFT, 1, 1), 104562306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DIG_MIXER, 104662306a36Sopenharmony_ci RT5670_M_DAC_R2_DAC_L_SFT, 1, 1), 104762306a36Sopenharmony_ci}; 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dig_r_mix[] = { 105062306a36Sopenharmony_ci SOC_DAPM_SINGLE("Sto DAC Mix R Switch", RT5670_DIG_MIXER, 105162306a36Sopenharmony_ci RT5670_M_STO_R_DAC_R_SFT, 1, 1), 105262306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_DIG_MIXER, 105362306a36Sopenharmony_ci RT5670_M_DAC_R2_DAC_R_SFT, 1, 1), 105462306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_DIG_MIXER, 105562306a36Sopenharmony_ci RT5670_M_DAC_L2_DAC_R_SFT, 1, 1), 105662306a36Sopenharmony_ci}; 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci/* Analog Input Mixer */ 105962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_rec_l_mix[] = { 106062306a36Sopenharmony_ci SOC_DAPM_SINGLE("INL Switch", RT5670_REC_L2_MIXER, 106162306a36Sopenharmony_ci RT5670_M_IN_L_RM_L_SFT, 1, 1), 106262306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST2 Switch", RT5670_REC_L2_MIXER, 106362306a36Sopenharmony_ci RT5670_M_BST2_RM_L_SFT, 1, 1), 106462306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST1 Switch", RT5670_REC_L2_MIXER, 106562306a36Sopenharmony_ci RT5670_M_BST1_RM_L_SFT, 1, 1), 106662306a36Sopenharmony_ci}; 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_rec_r_mix[] = { 106962306a36Sopenharmony_ci SOC_DAPM_SINGLE("INR Switch", RT5670_REC_R2_MIXER, 107062306a36Sopenharmony_ci RT5670_M_IN_R_RM_R_SFT, 1, 1), 107162306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST2 Switch", RT5670_REC_R2_MIXER, 107262306a36Sopenharmony_ci RT5670_M_BST2_RM_R_SFT, 1, 1), 107362306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST1 Switch", RT5670_REC_R2_MIXER, 107462306a36Sopenharmony_ci RT5670_M_BST1_RM_R_SFT, 1, 1), 107562306a36Sopenharmony_ci}; 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_out_l_mix[] = { 107862306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST1 Switch", RT5670_OUT_L1_MIXER, 107962306a36Sopenharmony_ci RT5670_M_BST1_OM_L_SFT, 1, 1), 108062306a36Sopenharmony_ci SOC_DAPM_SINGLE("INL Switch", RT5670_OUT_L1_MIXER, 108162306a36Sopenharmony_ci RT5670_M_IN_L_OM_L_SFT, 1, 1), 108262306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L2 Switch", RT5670_OUT_L1_MIXER, 108362306a36Sopenharmony_ci RT5670_M_DAC_L2_OM_L_SFT, 1, 1), 108462306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_OUT_L1_MIXER, 108562306a36Sopenharmony_ci RT5670_M_DAC_L1_OM_L_SFT, 1, 1), 108662306a36Sopenharmony_ci}; 108762306a36Sopenharmony_ci 108862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_out_r_mix[] = { 108962306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST2 Switch", RT5670_OUT_R1_MIXER, 109062306a36Sopenharmony_ci RT5670_M_BST2_OM_R_SFT, 1, 1), 109162306a36Sopenharmony_ci SOC_DAPM_SINGLE("INR Switch", RT5670_OUT_R1_MIXER, 109262306a36Sopenharmony_ci RT5670_M_IN_R_OM_R_SFT, 1, 1), 109362306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R2 Switch", RT5670_OUT_R1_MIXER, 109462306a36Sopenharmony_ci RT5670_M_DAC_R2_OM_R_SFT, 1, 1), 109562306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_OUT_R1_MIXER, 109662306a36Sopenharmony_ci RT5670_M_DAC_R1_OM_R_SFT, 1, 1), 109762306a36Sopenharmony_ci}; 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_hpo_mix[] = { 110062306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER, 110162306a36Sopenharmony_ci RT5670_M_DAC1_HM_SFT, 1, 1), 110262306a36Sopenharmony_ci SOC_DAPM_SINGLE("HPVOL Switch", RT5670_HPO_MIXER, 110362306a36Sopenharmony_ci RT5670_M_HPVOL_HM_SFT, 1, 1), 110462306a36Sopenharmony_ci}; 110562306a36Sopenharmony_ci 110662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_hpvoll_mix[] = { 110762306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER, 110862306a36Sopenharmony_ci RT5670_M_DACL1_HML_SFT, 1, 1), 110962306a36Sopenharmony_ci SOC_DAPM_SINGLE("INL Switch", RT5670_HPO_MIXER, 111062306a36Sopenharmony_ci RT5670_M_INL1_HML_SFT, 1, 1), 111162306a36Sopenharmony_ci}; 111262306a36Sopenharmony_ci 111362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_hpvolr_mix[] = { 111462306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC1 Switch", RT5670_HPO_MIXER, 111562306a36Sopenharmony_ci RT5670_M_DACR1_HMR_SFT, 1, 1), 111662306a36Sopenharmony_ci SOC_DAPM_SINGLE("INR Switch", RT5670_HPO_MIXER, 111762306a36Sopenharmony_ci RT5670_M_INR1_HMR_SFT, 1, 1), 111862306a36Sopenharmony_ci}; 111962306a36Sopenharmony_ci 112062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_lout_mix[] = { 112162306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L1 Switch", RT5670_LOUT_MIXER, 112262306a36Sopenharmony_ci RT5670_M_DAC_L1_LM_SFT, 1, 1), 112362306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R1 Switch", RT5670_LOUT_MIXER, 112462306a36Sopenharmony_ci RT5670_M_DAC_R1_LM_SFT, 1, 1), 112562306a36Sopenharmony_ci SOC_DAPM_SINGLE("OUTMIX L Switch", RT5670_LOUT_MIXER, 112662306a36Sopenharmony_ci RT5670_M_OV_L_LM_SFT, 1, 1), 112762306a36Sopenharmony_ci SOC_DAPM_SINGLE("OUTMIX R Switch", RT5670_LOUT_MIXER, 112862306a36Sopenharmony_ci RT5670_M_OV_R_LM_SFT, 1, 1), 112962306a36Sopenharmony_ci}; 113062306a36Sopenharmony_ci 113162306a36Sopenharmony_cistatic const struct snd_kcontrol_new lout_l_enable_control = 113262306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5670_LOUT1, 113362306a36Sopenharmony_ci RT5670_L_MUTE_SFT, 1, 1); 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_cistatic const struct snd_kcontrol_new lout_r_enable_control = 113662306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5670_LOUT1, 113762306a36Sopenharmony_ci RT5670_R_MUTE_SFT, 1, 1); 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci/* DAC1 L/R source */ /* MX-29 [9:8] [11:10] */ 114062306a36Sopenharmony_cistatic const char * const rt5670_dac1_src[] = { 114162306a36Sopenharmony_ci "IF1 DAC", "IF2 DAC" 114262306a36Sopenharmony_ci}; 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_dac1l_enum, RT5670_AD_DA_MIXER, 114562306a36Sopenharmony_ci RT5670_DAC1_L_SEL_SFT, rt5670_dac1_src); 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dac1l_mux = 114862306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC1 L source", rt5670_dac1l_enum); 114962306a36Sopenharmony_ci 115062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_dac1r_enum, RT5670_AD_DA_MIXER, 115162306a36Sopenharmony_ci RT5670_DAC1_R_SEL_SFT, rt5670_dac1_src); 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dac1r_mux = 115462306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC1 R source", rt5670_dac1r_enum); 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci/*DAC2 L/R source*/ /* MX-1B [6:4] [2:0] */ 115762306a36Sopenharmony_ci/* TODO Use SOC_VALUE_ENUM_SINGLE_DECL */ 115862306a36Sopenharmony_cistatic const char * const rt5670_dac12_src[] = { 115962306a36Sopenharmony_ci "IF1 DAC", "IF2 DAC", "IF3 DAC", "TxDC DAC", 116062306a36Sopenharmony_ci "Bass", "VAD_ADC", "IF4 DAC" 116162306a36Sopenharmony_ci}; 116262306a36Sopenharmony_ci 116362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_dac2l_enum, RT5670_DAC_CTRL, 116462306a36Sopenharmony_ci RT5670_DAC2_L_SEL_SFT, rt5670_dac12_src); 116562306a36Sopenharmony_ci 116662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dac_l2_mux = 116762306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC2 L source", rt5670_dac2l_enum); 116862306a36Sopenharmony_ci 116962306a36Sopenharmony_cistatic const char * const rt5670_dacr2_src[] = { 117062306a36Sopenharmony_ci "IF1 DAC", "IF2 DAC", "IF3 DAC", "TxDC DAC", "TxDP ADC", "IF4 DAC" 117162306a36Sopenharmony_ci}; 117262306a36Sopenharmony_ci 117362306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_dac2r_enum, RT5670_DAC_CTRL, 117462306a36Sopenharmony_ci RT5670_DAC2_R_SEL_SFT, rt5670_dacr2_src); 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dac_r2_mux = 117762306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC2 R source", rt5670_dac2r_enum); 117862306a36Sopenharmony_ci 117962306a36Sopenharmony_ci/*RxDP source*/ /* MX-2D [15:13] */ 118062306a36Sopenharmony_cistatic const char * const rt5670_rxdp_src[] = { 118162306a36Sopenharmony_ci "IF2 DAC", "IF1 DAC", "STO1 ADC Mixer", "STO2 ADC Mixer", 118262306a36Sopenharmony_ci "Mono ADC Mixer L", "Mono ADC Mixer R", "DAC1" 118362306a36Sopenharmony_ci}; 118462306a36Sopenharmony_ci 118562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_rxdp_enum, RT5670_DSP_PATH1, 118662306a36Sopenharmony_ci RT5670_RXDP_SEL_SFT, rt5670_rxdp_src); 118762306a36Sopenharmony_ci 118862306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_rxdp_mux = 118962306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC2 L source", rt5670_rxdp_enum); 119062306a36Sopenharmony_ci 119162306a36Sopenharmony_ci/* MX-2D [1] [0] */ 119262306a36Sopenharmony_cistatic const char * const rt5670_dsp_bypass_src[] = { 119362306a36Sopenharmony_ci "DSP", "Bypass" 119462306a36Sopenharmony_ci}; 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_dsp_ul_enum, RT5670_DSP_PATH1, 119762306a36Sopenharmony_ci RT5670_DSP_UL_SFT, rt5670_dsp_bypass_src); 119862306a36Sopenharmony_ci 119962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dsp_ul_mux = 120062306a36Sopenharmony_ci SOC_DAPM_ENUM("DSP UL source", rt5670_dsp_ul_enum); 120162306a36Sopenharmony_ci 120262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_dsp_dl_enum, RT5670_DSP_PATH1, 120362306a36Sopenharmony_ci RT5670_DSP_DL_SFT, rt5670_dsp_bypass_src); 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_dsp_dl_mux = 120662306a36Sopenharmony_ci SOC_DAPM_ENUM("DSP DL source", rt5670_dsp_dl_enum); 120762306a36Sopenharmony_ci 120862306a36Sopenharmony_ci/* Stereo2 ADC source */ 120962306a36Sopenharmony_ci/* MX-26 [15] */ 121062306a36Sopenharmony_cistatic const char * const rt5670_stereo2_adc_lr_src[] = { 121162306a36Sopenharmony_ci "L", "LR" 121262306a36Sopenharmony_ci}; 121362306a36Sopenharmony_ci 121462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc_lr_enum, RT5670_STO2_ADC_MIXER, 121562306a36Sopenharmony_ci RT5670_STO2_ADC_SRC_SFT, rt5670_stereo2_adc_lr_src); 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto2_adc_lr_mux = 121862306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo2 ADC LR source", rt5670_stereo2_adc_lr_enum); 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci/* Stereo1 ADC source */ 122162306a36Sopenharmony_ci/* MX-27 MX-26 [12] */ 122262306a36Sopenharmony_cistatic const char * const rt5670_stereo_adc1_src[] = { 122362306a36Sopenharmony_ci "DAC MIX", "ADC" 122462306a36Sopenharmony_ci}; 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc1_enum, RT5670_STO1_ADC_MIXER, 122762306a36Sopenharmony_ci RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src); 122862306a36Sopenharmony_ci 122962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto_adc_1_mux = 123062306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC 1 Mux", rt5670_stereo1_adc1_enum); 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc1_enum, RT5670_STO2_ADC_MIXER, 123362306a36Sopenharmony_ci RT5670_ADC_1_SRC_SFT, rt5670_stereo_adc1_src); 123462306a36Sopenharmony_ci 123562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto2_adc_1_mux = 123662306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo2 ADC 1 Mux", rt5670_stereo2_adc1_enum); 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_ci 123962306a36Sopenharmony_ci/* MX-27 MX-26 [11] */ 124062306a36Sopenharmony_cistatic const char * const rt5670_stereo_adc2_src[] = { 124162306a36Sopenharmony_ci "DAC MIX", "DMIC" 124262306a36Sopenharmony_ci}; 124362306a36Sopenharmony_ci 124462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_stereo1_adc2_enum, RT5670_STO1_ADC_MIXER, 124562306a36Sopenharmony_ci RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src); 124662306a36Sopenharmony_ci 124762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto_adc_2_mux = 124862306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 ADC 2 Mux", rt5670_stereo1_adc2_enum); 124962306a36Sopenharmony_ci 125062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_stereo2_adc2_enum, RT5670_STO2_ADC_MIXER, 125162306a36Sopenharmony_ci RT5670_ADC_2_SRC_SFT, rt5670_stereo_adc2_src); 125262306a36Sopenharmony_ci 125362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto2_adc_2_mux = 125462306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo2 ADC 2 Mux", rt5670_stereo2_adc2_enum); 125562306a36Sopenharmony_ci 125662306a36Sopenharmony_ci/* MX-27 MX-26 [9:8] */ 125762306a36Sopenharmony_cistatic const char * const rt5670_stereo_dmic_src[] = { 125862306a36Sopenharmony_ci "DMIC1", "DMIC2", "DMIC3" 125962306a36Sopenharmony_ci}; 126062306a36Sopenharmony_ci 126162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_stereo1_dmic_enum, RT5670_STO1_ADC_MIXER, 126262306a36Sopenharmony_ci RT5670_DMIC_SRC_SFT, rt5670_stereo_dmic_src); 126362306a36Sopenharmony_ci 126462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto1_dmic_mux = 126562306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo1 DMIC source", rt5670_stereo1_dmic_enum); 126662306a36Sopenharmony_ci 126762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_stereo2_dmic_enum, RT5670_STO2_ADC_MIXER, 126862306a36Sopenharmony_ci RT5670_DMIC_SRC_SFT, rt5670_stereo_dmic_src); 126962306a36Sopenharmony_ci 127062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_sto2_dmic_mux = 127162306a36Sopenharmony_ci SOC_DAPM_ENUM("Stereo2 DMIC source", rt5670_stereo2_dmic_enum); 127262306a36Sopenharmony_ci 127362306a36Sopenharmony_ci/* Mono ADC source */ 127462306a36Sopenharmony_ci/* MX-28 [12] */ 127562306a36Sopenharmony_cistatic const char * const rt5670_mono_adc_l1_src[] = { 127662306a36Sopenharmony_ci "Mono DAC MIXL", "ADC1" 127762306a36Sopenharmony_ci}; 127862306a36Sopenharmony_ci 127962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_l1_enum, RT5670_MONO_ADC_MIXER, 128062306a36Sopenharmony_ci RT5670_MONO_ADC_L1_SRC_SFT, rt5670_mono_adc_l1_src); 128162306a36Sopenharmony_ci 128262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_adc_l1_mux = 128362306a36Sopenharmony_ci SOC_DAPM_ENUM("Mono ADC1 left source", rt5670_mono_adc_l1_enum); 128462306a36Sopenharmony_ci/* MX-28 [11] */ 128562306a36Sopenharmony_cistatic const char * const rt5670_mono_adc_l2_src[] = { 128662306a36Sopenharmony_ci "Mono DAC MIXL", "DMIC" 128762306a36Sopenharmony_ci}; 128862306a36Sopenharmony_ci 128962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_l2_enum, RT5670_MONO_ADC_MIXER, 129062306a36Sopenharmony_ci RT5670_MONO_ADC_L2_SRC_SFT, rt5670_mono_adc_l2_src); 129162306a36Sopenharmony_ci 129262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_adc_l2_mux = 129362306a36Sopenharmony_ci SOC_DAPM_ENUM("Mono ADC2 left source", rt5670_mono_adc_l2_enum); 129462306a36Sopenharmony_ci 129562306a36Sopenharmony_ci/* MX-28 [9:8] */ 129662306a36Sopenharmony_cistatic const char * const rt5670_mono_dmic_src[] = { 129762306a36Sopenharmony_ci "DMIC1", "DMIC2", "DMIC3" 129862306a36Sopenharmony_ci}; 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_mono_dmic_l_enum, RT5670_MONO_ADC_MIXER, 130162306a36Sopenharmony_ci RT5670_MONO_DMIC_L_SRC_SFT, rt5670_mono_dmic_src); 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_dmic_l_mux = 130462306a36Sopenharmony_ci SOC_DAPM_ENUM("Mono DMIC left source", rt5670_mono_dmic_l_enum); 130562306a36Sopenharmony_ci/* MX-28 [1:0] */ 130662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_mono_dmic_r_enum, RT5670_MONO_ADC_MIXER, 130762306a36Sopenharmony_ci RT5670_MONO_DMIC_R_SRC_SFT, rt5670_mono_dmic_src); 130862306a36Sopenharmony_ci 130962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_dmic_r_mux = 131062306a36Sopenharmony_ci SOC_DAPM_ENUM("Mono DMIC Right source", rt5670_mono_dmic_r_enum); 131162306a36Sopenharmony_ci/* MX-28 [4] */ 131262306a36Sopenharmony_cistatic const char * const rt5670_mono_adc_r1_src[] = { 131362306a36Sopenharmony_ci "Mono DAC MIXR", "ADC2" 131462306a36Sopenharmony_ci}; 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_r1_enum, RT5670_MONO_ADC_MIXER, 131762306a36Sopenharmony_ci RT5670_MONO_ADC_R1_SRC_SFT, rt5670_mono_adc_r1_src); 131862306a36Sopenharmony_ci 131962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_adc_r1_mux = 132062306a36Sopenharmony_ci SOC_DAPM_ENUM("Mono ADC1 right source", rt5670_mono_adc_r1_enum); 132162306a36Sopenharmony_ci/* MX-28 [3] */ 132262306a36Sopenharmony_cistatic const char * const rt5670_mono_adc_r2_src[] = { 132362306a36Sopenharmony_ci "Mono DAC MIXR", "DMIC" 132462306a36Sopenharmony_ci}; 132562306a36Sopenharmony_ci 132662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_mono_adc_r2_enum, RT5670_MONO_ADC_MIXER, 132762306a36Sopenharmony_ci RT5670_MONO_ADC_R2_SRC_SFT, rt5670_mono_adc_r2_src); 132862306a36Sopenharmony_ci 132962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_mono_adc_r2_mux = 133062306a36Sopenharmony_ci SOC_DAPM_ENUM("Mono ADC2 right source", rt5670_mono_adc_r2_enum); 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci/* MX-2D [3:2] */ 133362306a36Sopenharmony_cistatic const char * const rt5670_txdp_slot_src[] = { 133462306a36Sopenharmony_ci "Slot 0-1", "Slot 2-3", "Slot 4-5", "Slot 6-7" 133562306a36Sopenharmony_ci}; 133662306a36Sopenharmony_ci 133762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_txdp_slot_enum, RT5670_DSP_PATH1, 133862306a36Sopenharmony_ci RT5670_TXDP_SLOT_SEL_SFT, rt5670_txdp_slot_src); 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_txdp_slot_mux = 134162306a36Sopenharmony_ci SOC_DAPM_ENUM("TxDP Slot source", rt5670_txdp_slot_enum); 134262306a36Sopenharmony_ci 134362306a36Sopenharmony_ci/* MX-2F [15] */ 134462306a36Sopenharmony_cistatic const char * const rt5670_if1_adc2_in_src[] = { 134562306a36Sopenharmony_ci "IF_ADC2", "VAD_ADC" 134662306a36Sopenharmony_ci}; 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_if1_adc2_in_enum, RT5670_DIG_INF1_DATA, 134962306a36Sopenharmony_ci RT5670_IF1_ADC2_IN_SFT, rt5670_if1_adc2_in_src); 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_if1_adc2_in_mux = 135262306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 ADC2 IN source", rt5670_if1_adc2_in_enum); 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci/* MX-2F [14:12] */ 135562306a36Sopenharmony_cistatic const char * const rt5670_if2_adc_in_src[] = { 135662306a36Sopenharmony_ci "IF_ADC1", "IF_ADC2", "IF_ADC3", "TxDC_DAC", "TxDP_ADC", "VAD_ADC" 135762306a36Sopenharmony_ci}; 135862306a36Sopenharmony_ci 135962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_if2_adc_in_enum, RT5670_DIG_INF1_DATA, 136062306a36Sopenharmony_ci RT5670_IF2_ADC_IN_SFT, rt5670_if2_adc_in_src); 136162306a36Sopenharmony_ci 136262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_if2_adc_in_mux = 136362306a36Sopenharmony_ci SOC_DAPM_ENUM("IF2 ADC IN source", rt5670_if2_adc_in_enum); 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci/* MX-31 [15] [13] [11] [9] */ 136662306a36Sopenharmony_cistatic const char * const rt5670_pdm_src[] = { 136762306a36Sopenharmony_ci "Mono DAC", "Stereo DAC" 136862306a36Sopenharmony_ci}; 136962306a36Sopenharmony_ci 137062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_pdm1_l_enum, RT5670_PDM_OUT_CTRL, 137162306a36Sopenharmony_ci RT5670_PDM1_L_SFT, rt5670_pdm_src); 137262306a36Sopenharmony_ci 137362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_pdm1_l_mux = 137462306a36Sopenharmony_ci SOC_DAPM_ENUM("PDM1 L source", rt5670_pdm1_l_enum); 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_pdm1_r_enum, RT5670_PDM_OUT_CTRL, 137762306a36Sopenharmony_ci RT5670_PDM1_R_SFT, rt5670_pdm_src); 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_pdm1_r_mux = 138062306a36Sopenharmony_ci SOC_DAPM_ENUM("PDM1 R source", rt5670_pdm1_r_enum); 138162306a36Sopenharmony_ci 138262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_pdm2_l_enum, RT5670_PDM_OUT_CTRL, 138362306a36Sopenharmony_ci RT5670_PDM2_L_SFT, rt5670_pdm_src); 138462306a36Sopenharmony_ci 138562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_pdm2_l_mux = 138662306a36Sopenharmony_ci SOC_DAPM_ENUM("PDM2 L source", rt5670_pdm2_l_enum); 138762306a36Sopenharmony_ci 138862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_pdm2_r_enum, RT5670_PDM_OUT_CTRL, 138962306a36Sopenharmony_ci RT5670_PDM2_R_SFT, rt5670_pdm_src); 139062306a36Sopenharmony_ci 139162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_pdm2_r_mux = 139262306a36Sopenharmony_ci SOC_DAPM_ENUM("PDM2 R source", rt5670_pdm2_r_enum); 139362306a36Sopenharmony_ci 139462306a36Sopenharmony_ci/* MX-FA [12] */ 139562306a36Sopenharmony_cistatic const char * const rt5670_if1_adc1_in1_src[] = { 139662306a36Sopenharmony_ci "IF_ADC1", "IF1_ADC3" 139762306a36Sopenharmony_ci}; 139862306a36Sopenharmony_ci 139962306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_if1_adc1_in1_enum, RT5670_DIG_MISC, 140062306a36Sopenharmony_ci RT5670_IF1_ADC1_IN1_SFT, rt5670_if1_adc1_in1_src); 140162306a36Sopenharmony_ci 140262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_if1_adc1_in1_mux = 140362306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 ADC1 IN1 source", rt5670_if1_adc1_in1_enum); 140462306a36Sopenharmony_ci 140562306a36Sopenharmony_ci/* MX-FA [11] */ 140662306a36Sopenharmony_cistatic const char * const rt5670_if1_adc1_in2_src[] = { 140762306a36Sopenharmony_ci "IF1_ADC1_IN1", "IF1_ADC4" 140862306a36Sopenharmony_ci}; 140962306a36Sopenharmony_ci 141062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_if1_adc1_in2_enum, RT5670_DIG_MISC, 141162306a36Sopenharmony_ci RT5670_IF1_ADC1_IN2_SFT, rt5670_if1_adc1_in2_src); 141262306a36Sopenharmony_ci 141362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_if1_adc1_in2_mux = 141462306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 ADC1 IN2 source", rt5670_if1_adc1_in2_enum); 141562306a36Sopenharmony_ci 141662306a36Sopenharmony_ci/* MX-FA [10] */ 141762306a36Sopenharmony_cistatic const char * const rt5670_if1_adc2_in1_src[] = { 141862306a36Sopenharmony_ci "IF1_ADC2_IN", "IF1_ADC4" 141962306a36Sopenharmony_ci}; 142062306a36Sopenharmony_ci 142162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_if1_adc2_in1_enum, RT5670_DIG_MISC, 142262306a36Sopenharmony_ci RT5670_IF1_ADC2_IN1_SFT, rt5670_if1_adc2_in1_src); 142362306a36Sopenharmony_ci 142462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_if1_adc2_in1_mux = 142562306a36Sopenharmony_ci SOC_DAPM_ENUM("IF1 ADC2 IN1 source", rt5670_if1_adc2_in1_enum); 142662306a36Sopenharmony_ci 142762306a36Sopenharmony_ci/* MX-9D [9:8] */ 142862306a36Sopenharmony_cistatic const char * const rt5670_vad_adc_src[] = { 142962306a36Sopenharmony_ci "Sto1 ADC L", "Mono ADC L", "Mono ADC R", "Sto2 ADC L" 143062306a36Sopenharmony_ci}; 143162306a36Sopenharmony_ci 143262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5670_vad_adc_enum, RT5670_VAD_CTRL4, 143362306a36Sopenharmony_ci RT5670_VAD_SEL_SFT, rt5670_vad_adc_src); 143462306a36Sopenharmony_ci 143562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5670_vad_adc_mux = 143662306a36Sopenharmony_ci SOC_DAPM_ENUM("VAD ADC source", rt5670_vad_adc_enum); 143762306a36Sopenharmony_ci 143862306a36Sopenharmony_cistatic int rt5670_hp_power_event(struct snd_soc_dapm_widget *w, 143962306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 144062306a36Sopenharmony_ci{ 144162306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 144262306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci switch (event) { 144562306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 144662306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_CHARGE_PUMP, 144762306a36Sopenharmony_ci RT5670_PM_HP_MASK, RT5670_PM_HP_HV); 144862306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GEN_CTRL2, 144962306a36Sopenharmony_ci 0x0400, 0x0400); 145062306a36Sopenharmony_ci /* headphone amp power on */ 145162306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1, 145262306a36Sopenharmony_ci RT5670_PWR_HA | RT5670_PWR_FV1 | 145362306a36Sopenharmony_ci RT5670_PWR_FV2, RT5670_PWR_HA | 145462306a36Sopenharmony_ci RT5670_PWR_FV1 | RT5670_PWR_FV2); 145562306a36Sopenharmony_ci /* depop parameters */ 145662306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M2, 0x3100); 145762306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8009); 145862306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_PR_BASE + 145962306a36Sopenharmony_ci RT5670_HP_DCC_INT1, 0x9f00); 146062306a36Sopenharmony_ci mdelay(20); 146162306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019); 146262306a36Sopenharmony_ci break; 146362306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 146462306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x0004); 146562306a36Sopenharmony_ci msleep(30); 146662306a36Sopenharmony_ci break; 146762306a36Sopenharmony_ci default: 146862306a36Sopenharmony_ci return 0; 146962306a36Sopenharmony_ci } 147062306a36Sopenharmony_ci 147162306a36Sopenharmony_ci return 0; 147262306a36Sopenharmony_ci} 147362306a36Sopenharmony_ci 147462306a36Sopenharmony_cistatic int rt5670_hp_event(struct snd_soc_dapm_widget *w, 147562306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 147662306a36Sopenharmony_ci{ 147762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 147862306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 147962306a36Sopenharmony_ci 148062306a36Sopenharmony_ci switch (event) { 148162306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 148262306a36Sopenharmony_ci /* headphone unmute sequence */ 148362306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_PR_BASE + 148462306a36Sopenharmony_ci RT5670_MAMP_INT_REG2, 0xb400); 148562306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0772); 148662306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x805d); 148762306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x831d); 148862306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GEN_CTRL2, 148962306a36Sopenharmony_ci 0x0300, 0x0300); 149062306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_HP_VOL, 149162306a36Sopenharmony_ci RT5670_L_MUTE | RT5670_R_MUTE, 0); 149262306a36Sopenharmony_ci msleep(80); 149362306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019); 149462306a36Sopenharmony_ci break; 149562306a36Sopenharmony_ci 149662306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 149762306a36Sopenharmony_ci /* headphone mute sequence */ 149862306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_PR_BASE + 149962306a36Sopenharmony_ci RT5670_MAMP_INT_REG2, 0xb400); 150062306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0772); 150162306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x803d); 150262306a36Sopenharmony_ci mdelay(10); 150362306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x831d); 150462306a36Sopenharmony_ci mdelay(10); 150562306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_HP_VOL, 150662306a36Sopenharmony_ci RT5670_L_MUTE | RT5670_R_MUTE, 150762306a36Sopenharmony_ci RT5670_L_MUTE | RT5670_R_MUTE); 150862306a36Sopenharmony_ci msleep(20); 150962306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, 151062306a36Sopenharmony_ci RT5670_GEN_CTRL2, 0x0300, 0x0); 151162306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M1, 0x8019); 151262306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_DEPOP_M3, 0x0707); 151362306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_PR_BASE + 151462306a36Sopenharmony_ci RT5670_MAMP_INT_REG2, 0xfc00); 151562306a36Sopenharmony_ci break; 151662306a36Sopenharmony_ci 151762306a36Sopenharmony_ci default: 151862306a36Sopenharmony_ci return 0; 151962306a36Sopenharmony_ci } 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_ci return 0; 152262306a36Sopenharmony_ci} 152362306a36Sopenharmony_ci 152462306a36Sopenharmony_cistatic int rt5670_spk_event(struct snd_soc_dapm_widget *w, 152562306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 152662306a36Sopenharmony_ci{ 152762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 152862306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 152962306a36Sopenharmony_ci 153062306a36Sopenharmony_ci if (!rt5670->gpio1_is_ext_spk_en) 153162306a36Sopenharmony_ci return 0; 153262306a36Sopenharmony_ci 153362306a36Sopenharmony_ci switch (event) { 153462306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 153562306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2, 153662306a36Sopenharmony_ci RT5670_GP1_OUT_MASK, RT5670_GP1_OUT_HI); 153762306a36Sopenharmony_ci break; 153862306a36Sopenharmony_ci 153962306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 154062306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2, 154162306a36Sopenharmony_ci RT5670_GP1_OUT_MASK, RT5670_GP1_OUT_LO); 154262306a36Sopenharmony_ci break; 154362306a36Sopenharmony_ci 154462306a36Sopenharmony_ci default: 154562306a36Sopenharmony_ci return 0; 154662306a36Sopenharmony_ci } 154762306a36Sopenharmony_ci 154862306a36Sopenharmony_ci return 0; 154962306a36Sopenharmony_ci} 155062306a36Sopenharmony_ci 155162306a36Sopenharmony_cistatic int rt5670_bst1_event(struct snd_soc_dapm_widget *w, 155262306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 155362306a36Sopenharmony_ci{ 155462306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 155562306a36Sopenharmony_ci 155662306a36Sopenharmony_ci switch (event) { 155762306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 155862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, 155962306a36Sopenharmony_ci RT5670_PWR_BST1_P, RT5670_PWR_BST1_P); 156062306a36Sopenharmony_ci break; 156162306a36Sopenharmony_ci 156262306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 156362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, 156462306a36Sopenharmony_ci RT5670_PWR_BST1_P, 0); 156562306a36Sopenharmony_ci break; 156662306a36Sopenharmony_ci 156762306a36Sopenharmony_ci default: 156862306a36Sopenharmony_ci return 0; 156962306a36Sopenharmony_ci } 157062306a36Sopenharmony_ci 157162306a36Sopenharmony_ci return 0; 157262306a36Sopenharmony_ci} 157362306a36Sopenharmony_ci 157462306a36Sopenharmony_cistatic int rt5670_bst2_event(struct snd_soc_dapm_widget *w, 157562306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 157662306a36Sopenharmony_ci{ 157762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 157862306a36Sopenharmony_ci 157962306a36Sopenharmony_ci switch (event) { 158062306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 158162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, 158262306a36Sopenharmony_ci RT5670_PWR_BST2_P, RT5670_PWR_BST2_P); 158362306a36Sopenharmony_ci break; 158462306a36Sopenharmony_ci 158562306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 158662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG2, 158762306a36Sopenharmony_ci RT5670_PWR_BST2_P, 0); 158862306a36Sopenharmony_ci break; 158962306a36Sopenharmony_ci 159062306a36Sopenharmony_ci default: 159162306a36Sopenharmony_ci return 0; 159262306a36Sopenharmony_ci } 159362306a36Sopenharmony_ci 159462306a36Sopenharmony_ci return 0; 159562306a36Sopenharmony_ci} 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5670_dapm_widgets[] = { 159862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL1", RT5670_PWR_ANLG2, 159962306a36Sopenharmony_ci RT5670_PWR_PLL_BIT, 0, NULL, 0), 160062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S DSP", RT5670_PWR_DIG2, 160162306a36Sopenharmony_ci RT5670_PWR_I2S_DSP_BIT, 0, NULL, 0), 160262306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5670_PWR_VOL, 160362306a36Sopenharmony_ci RT5670_PWR_MIC_DET_BIT, 0, NULL, 0), 160462306a36Sopenharmony_ci 160562306a36Sopenharmony_ci /* ASRC */ 160662306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5670_ASRC_1, 160762306a36Sopenharmony_ci 11, 0, NULL, 0), 160862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5670_ASRC_1, 160962306a36Sopenharmony_ci 12, 0, NULL, 0), 161062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DAC STO ASRC", 1, RT5670_ASRC_1, 161162306a36Sopenharmony_ci 10, 0, NULL, 0), 161262306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DAC MONO L ASRC", 1, RT5670_ASRC_1, 161362306a36Sopenharmony_ci 9, 0, NULL, 0), 161462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DAC MONO R ASRC", 1, RT5670_ASRC_1, 161562306a36Sopenharmony_ci 8, 0, NULL, 0), 161662306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5670_ASRC_1, 161762306a36Sopenharmony_ci 7, 0, NULL, 0), 161862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5670_ASRC_1, 161962306a36Sopenharmony_ci 6, 0, NULL, 0), 162062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5670_ASRC_1, 162162306a36Sopenharmony_ci 5, 0, NULL, 0), 162262306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5670_ASRC_1, 162362306a36Sopenharmony_ci 4, 0, NULL, 0), 162462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5670_ASRC_1, 162562306a36Sopenharmony_ci 3, 0, NULL, 0), 162662306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("ADC STO2 ASRC", 1, RT5670_ASRC_1, 162762306a36Sopenharmony_ci 2, 0, NULL, 0), 162862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("ADC MONO L ASRC", 1, RT5670_ASRC_1, 162962306a36Sopenharmony_ci 1, 0, NULL, 0), 163062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("ADC MONO R ASRC", 1, RT5670_ASRC_1, 163162306a36Sopenharmony_ci 0, 0, NULL, 0), 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_ci /* Input Side */ 163462306a36Sopenharmony_ci /* micbias */ 163562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5670_PWR_ANLG2, 163662306a36Sopenharmony_ci RT5670_PWR_MB1_BIT, 0, NULL, 0), 163762306a36Sopenharmony_ci 163862306a36Sopenharmony_ci /* Input Lines */ 163962306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC L1"), 164062306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC R1"), 164162306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC L2"), 164262306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC R2"), 164362306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC L3"), 164462306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("DMIC R3"), 164562306a36Sopenharmony_ci 164662306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN1P"), 164762306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN1N"), 164862306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN2P"), 164962306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN2N"), 165062306a36Sopenharmony_ci 165162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0), 165262306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0), 165362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DMIC3", SND_SOC_NOPM, 0, 0, NULL, 0), 165462306a36Sopenharmony_ci 165562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0, 165662306a36Sopenharmony_ci set_dmic_clk, SND_SOC_DAPM_PRE_PMU), 165762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5670_DMIC_CTRL1, 165862306a36Sopenharmony_ci RT5670_DMIC_1_EN_SFT, 0, NULL, 0), 165962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5670_DMIC_CTRL1, 166062306a36Sopenharmony_ci RT5670_DMIC_2_EN_SFT, 0, NULL, 0), 166162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DMIC3 Power", RT5670_DMIC_CTRL1, 166262306a36Sopenharmony_ci RT5670_DMIC_3_EN_SFT, 0, NULL, 0), 166362306a36Sopenharmony_ci /* Boost */ 166462306a36Sopenharmony_ci SND_SOC_DAPM_PGA_E("BST1", RT5670_PWR_ANLG2, RT5670_PWR_BST1_BIT, 166562306a36Sopenharmony_ci 0, NULL, 0, rt5670_bst1_event, 166662306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 166762306a36Sopenharmony_ci SND_SOC_DAPM_PGA_E("BST2", RT5670_PWR_ANLG2, RT5670_PWR_BST2_BIT, 166862306a36Sopenharmony_ci 0, NULL, 0, rt5670_bst2_event, 166962306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 167062306a36Sopenharmony_ci /* Input Volume */ 167162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("INL VOL", RT5670_PWR_VOL, 167262306a36Sopenharmony_ci RT5670_PWR_IN_L_BIT, 0, NULL, 0), 167362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("INR VOL", RT5670_PWR_VOL, 167462306a36Sopenharmony_ci RT5670_PWR_IN_R_BIT, 0, NULL, 0), 167562306a36Sopenharmony_ci 167662306a36Sopenharmony_ci /* REC Mixer */ 167762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RECMIXL", RT5670_PWR_MIXER, RT5670_PWR_RM_L_BIT, 0, 167862306a36Sopenharmony_ci rt5670_rec_l_mix, ARRAY_SIZE(rt5670_rec_l_mix)), 167962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RECMIXR", RT5670_PWR_MIXER, RT5670_PWR_RM_R_BIT, 0, 168062306a36Sopenharmony_ci rt5670_rec_r_mix, ARRAY_SIZE(rt5670_rec_r_mix)), 168162306a36Sopenharmony_ci /* ADCs */ 168262306a36Sopenharmony_ci SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM, 0, 0), 168362306a36Sopenharmony_ci SND_SOC_DAPM_ADC("ADC 2", NULL, SND_SOC_NOPM, 0, 0), 168462306a36Sopenharmony_ci 168562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("ADC 1_2", SND_SOC_NOPM, 0, 0, NULL, 0), 168662306a36Sopenharmony_ci 168762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC 1 power", RT5670_PWR_DIG1, 168862306a36Sopenharmony_ci RT5670_PWR_ADC_L_BIT, 0, NULL, 0), 168962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC 2 power", RT5670_PWR_DIG1, 169062306a36Sopenharmony_ci RT5670_PWR_ADC_R_BIT, 0, NULL, 0), 169162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC clock", RT5670_PR_BASE + 169262306a36Sopenharmony_ci RT5670_CHOP_DAC_ADC, 12, 0, NULL, 0), 169362306a36Sopenharmony_ci /* ADC Mux */ 169462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 DMIC Mux", SND_SOC_NOPM, 0, 0, 169562306a36Sopenharmony_ci &rt5670_sto1_dmic_mux), 169662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0, 169762306a36Sopenharmony_ci &rt5670_sto_adc_2_mux), 169862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0, 169962306a36Sopenharmony_ci &rt5670_sto_adc_2_mux), 170062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0, 170162306a36Sopenharmony_ci &rt5670_sto_adc_1_mux), 170262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0, 170362306a36Sopenharmony_ci &rt5670_sto_adc_1_mux), 170462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo2 DMIC Mux", SND_SOC_NOPM, 0, 0, 170562306a36Sopenharmony_ci &rt5670_sto2_dmic_mux), 170662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo2 ADC L2 Mux", SND_SOC_NOPM, 0, 0, 170762306a36Sopenharmony_ci &rt5670_sto2_adc_2_mux), 170862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo2 ADC R2 Mux", SND_SOC_NOPM, 0, 0, 170962306a36Sopenharmony_ci &rt5670_sto2_adc_2_mux), 171062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo2 ADC L1 Mux", SND_SOC_NOPM, 0, 0, 171162306a36Sopenharmony_ci &rt5670_sto2_adc_1_mux), 171262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo2 ADC R1 Mux", SND_SOC_NOPM, 0, 0, 171362306a36Sopenharmony_ci &rt5670_sto2_adc_1_mux), 171462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Stereo2 ADC LR Mux", SND_SOC_NOPM, 0, 0, 171562306a36Sopenharmony_ci &rt5670_sto2_adc_lr_mux), 171662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0, 171762306a36Sopenharmony_ci &rt5670_mono_dmic_l_mux), 171862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0, 171962306a36Sopenharmony_ci &rt5670_mono_dmic_r_mux), 172062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0, 172162306a36Sopenharmony_ci &rt5670_mono_adc_l2_mux), 172262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0, 172362306a36Sopenharmony_ci &rt5670_mono_adc_l1_mux), 172462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0, 172562306a36Sopenharmony_ci &rt5670_mono_adc_r1_mux), 172662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0, 172762306a36Sopenharmony_ci &rt5670_mono_adc_r2_mux), 172862306a36Sopenharmony_ci /* ADC Mixer */ 172962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5670_PWR_DIG2, 173062306a36Sopenharmony_ci RT5670_PWR_ADC_S1F_BIT, 0, NULL, 0), 173162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC Stereo2 Filter", RT5670_PWR_DIG2, 173262306a36Sopenharmony_ci RT5670_PWR_ADC_S2F_BIT, 0, NULL, 0), 173362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0, 173462306a36Sopenharmony_ci rt5670_sto1_adc_l_mix, ARRAY_SIZE(rt5670_sto1_adc_l_mix)), 173562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", SND_SOC_NOPM, 0, 0, 173662306a36Sopenharmony_ci rt5670_sto1_adc_r_mix, ARRAY_SIZE(rt5670_sto1_adc_r_mix)), 173762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Sto2 ADC MIXL", SND_SOC_NOPM, 0, 0, 173862306a36Sopenharmony_ci rt5670_sto2_adc_l_mix, 173962306a36Sopenharmony_ci ARRAY_SIZE(rt5670_sto2_adc_l_mix)), 174062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Sto2 ADC MIXR", SND_SOC_NOPM, 0, 0, 174162306a36Sopenharmony_ci rt5670_sto2_adc_r_mix, 174262306a36Sopenharmony_ci ARRAY_SIZE(rt5670_sto2_adc_r_mix)), 174362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC Mono Left Filter", RT5670_PWR_DIG2, 174462306a36Sopenharmony_ci RT5670_PWR_ADC_MF_L_BIT, 0, NULL, 0), 174562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Mono ADC MIXL", RT5670_MONO_ADC_DIG_VOL, 174662306a36Sopenharmony_ci RT5670_L_MUTE_SFT, 1, rt5670_mono_adc_l_mix, 174762306a36Sopenharmony_ci ARRAY_SIZE(rt5670_mono_adc_l_mix)), 174862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC Mono Right Filter", RT5670_PWR_DIG2, 174962306a36Sopenharmony_ci RT5670_PWR_ADC_MF_R_BIT, 0, NULL, 0), 175062306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Mono ADC MIXR", RT5670_MONO_ADC_DIG_VOL, 175162306a36Sopenharmony_ci RT5670_R_MUTE_SFT, 1, rt5670_mono_adc_r_mix, 175262306a36Sopenharmony_ci ARRAY_SIZE(rt5670_mono_adc_r_mix)), 175362306a36Sopenharmony_ci 175462306a36Sopenharmony_ci /* ADC PGA */ 175562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo1 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0), 175662306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo1 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0), 175762306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo2 ADC MIXL", SND_SOC_NOPM, 0, 0, NULL, 0), 175862306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo2 ADC MIXR", SND_SOC_NOPM, 0, 0, NULL, 0), 175962306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Sto2 ADC LR MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 176062306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 176162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 176262306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 176362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("VAD_ADC", SND_SOC_NOPM, 0, 0, NULL, 0), 176462306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0), 176562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0), 176662306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0), 176762306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1_ADC1", SND_SOC_NOPM, 0, 0, NULL, 0), 176862306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1_ADC2", SND_SOC_NOPM, 0, 0, NULL, 0), 176962306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1_ADC3", SND_SOC_NOPM, 0, 0, NULL, 0), 177062306a36Sopenharmony_ci 177162306a36Sopenharmony_ci /* DSP */ 177262306a36Sopenharmony_ci SND_SOC_DAPM_PGA("TxDP_ADC", SND_SOC_NOPM, 0, 0, NULL, 0), 177362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("TxDP_ADC_L", SND_SOC_NOPM, 0, 0, NULL, 0), 177462306a36Sopenharmony_ci SND_SOC_DAPM_PGA("TxDP_ADC_R", SND_SOC_NOPM, 0, 0, NULL, 0), 177562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("TxDC_DAC", SND_SOC_NOPM, 0, 0, NULL, 0), 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_ci SND_SOC_DAPM_MUX("TDM Data Mux", SND_SOC_NOPM, 0, 0, 177862306a36Sopenharmony_ci &rt5670_txdp_slot_mux), 177962306a36Sopenharmony_ci 178062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DSP UL Mux", SND_SOC_NOPM, 0, 0, 178162306a36Sopenharmony_ci &rt5670_dsp_ul_mux), 178262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DSP DL Mux", SND_SOC_NOPM, 0, 0, 178362306a36Sopenharmony_ci &rt5670_dsp_dl_mux), 178462306a36Sopenharmony_ci 178562306a36Sopenharmony_ci SND_SOC_DAPM_MUX("RxDP Mux", SND_SOC_NOPM, 0, 0, 178662306a36Sopenharmony_ci &rt5670_rxdp_mux), 178762306a36Sopenharmony_ci 178862306a36Sopenharmony_ci /* IF2 Mux */ 178962306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF2 ADC Mux", SND_SOC_NOPM, 0, 0, 179062306a36Sopenharmony_ci &rt5670_if2_adc_in_mux), 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_ci /* Digital Interface */ 179362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S1", RT5670_PWR_DIG1, 179462306a36Sopenharmony_ci RT5670_PWR_I2S1_BIT, 0, NULL, 0), 179562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0), 179662306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0), 179762306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0), 179862306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0), 179962306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0), 180062306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0), 180162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0), 180262306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0), 180362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0), 180462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S2", RT5670_PWR_DIG1, 180562306a36Sopenharmony_ci RT5670_PWR_I2S2_BIT, 0, NULL, 0), 180662306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0), 180762306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0), 180862306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0), 180962306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0), 181062306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF2 ADC L", SND_SOC_NOPM, 0, 0, NULL, 0), 181162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF2 ADC R", SND_SOC_NOPM, 0, 0, NULL, 0), 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_ci /* Digital Interface Select */ 181462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 ADC1 IN1 Mux", SND_SOC_NOPM, 0, 0, 181562306a36Sopenharmony_ci &rt5670_if1_adc1_in1_mux), 181662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 ADC1 IN2 Mux", SND_SOC_NOPM, 0, 0, 181762306a36Sopenharmony_ci &rt5670_if1_adc1_in2_mux), 181862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 ADC2 IN Mux", SND_SOC_NOPM, 0, 0, 181962306a36Sopenharmony_ci &rt5670_if1_adc2_in_mux), 182062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("IF1 ADC2 IN1 Mux", SND_SOC_NOPM, 0, 0, 182162306a36Sopenharmony_ci &rt5670_if1_adc2_in1_mux), 182262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("VAD ADC Mux", SND_SOC_NOPM, 0, 0, 182362306a36Sopenharmony_ci &rt5670_vad_adc_mux), 182462306a36Sopenharmony_ci 182562306a36Sopenharmony_ci /* Audio Interface */ 182662306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0), 182762306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0), 182862306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("AIF2RX", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0), 182962306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0, 183062306a36Sopenharmony_ci RT5670_GPIO_CTRL1, RT5670_I2S2_PIN_SFT, 1), 183162306a36Sopenharmony_ci 183262306a36Sopenharmony_ci /* Audio DSP */ 183362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("Audio DSP", SND_SOC_NOPM, 0, 0, NULL, 0), 183462306a36Sopenharmony_ci 183562306a36Sopenharmony_ci /* Output Side */ 183662306a36Sopenharmony_ci /* DAC mixer before sound effect */ 183762306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0, 183862306a36Sopenharmony_ci rt5670_dac_l_mix, ARRAY_SIZE(rt5670_dac_l_mix)), 183962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0, 184062306a36Sopenharmony_ci rt5670_dac_r_mix, ARRAY_SIZE(rt5670_dac_r_mix)), 184162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DAC MIX", SND_SOC_NOPM, 0, 0, NULL, 0), 184262306a36Sopenharmony_ci 184362306a36Sopenharmony_ci /* DAC2 channel Mux */ 184462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, 184562306a36Sopenharmony_ci &rt5670_dac_l2_mux), 184662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, 184762306a36Sopenharmony_ci &rt5670_dac_r2_mux), 184862306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DAC L2 Volume", RT5670_PWR_DIG1, 184962306a36Sopenharmony_ci RT5670_PWR_DAC_L2_BIT, 0, NULL, 0), 185062306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DAC R2 Volume", RT5670_PWR_DIG1, 185162306a36Sopenharmony_ci RT5670_PWR_DAC_R2_BIT, 0, NULL, 0), 185262306a36Sopenharmony_ci 185362306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC1 L Mux", SND_SOC_NOPM, 0, 0, &rt5670_dac1l_mux), 185462306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC1 R Mux", SND_SOC_NOPM, 0, 0, &rt5670_dac1r_mux), 185562306a36Sopenharmony_ci 185662306a36Sopenharmony_ci /* DAC Mixer */ 185762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5670_PWR_DIG2, 185862306a36Sopenharmony_ci RT5670_PWR_DAC_S1F_BIT, 0, NULL, 0), 185962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC Mono Left Filter", RT5670_PWR_DIG2, 186062306a36Sopenharmony_ci RT5670_PWR_DAC_MF_L_BIT, 0, NULL, 0), 186162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC Mono Right Filter", RT5670_PWR_DIG2, 186262306a36Sopenharmony_ci RT5670_PWR_DAC_MF_R_BIT, 0, NULL, 0), 186362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo DAC MIXL", SND_SOC_NOPM, 0, 0, 186462306a36Sopenharmony_ci rt5670_sto_dac_l_mix, 186562306a36Sopenharmony_ci ARRAY_SIZE(rt5670_sto_dac_l_mix)), 186662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Stereo DAC MIXR", SND_SOC_NOPM, 0, 0, 186762306a36Sopenharmony_ci rt5670_sto_dac_r_mix, 186862306a36Sopenharmony_ci ARRAY_SIZE(rt5670_sto_dac_r_mix)), 186962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0, 187062306a36Sopenharmony_ci rt5670_mono_dac_l_mix, 187162306a36Sopenharmony_ci ARRAY_SIZE(rt5670_mono_dac_l_mix)), 187262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0, 187362306a36Sopenharmony_ci rt5670_mono_dac_r_mix, 187462306a36Sopenharmony_ci ARRAY_SIZE(rt5670_mono_dac_r_mix)), 187562306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC MIXL", SND_SOC_NOPM, 0, 0, 187662306a36Sopenharmony_ci rt5670_dig_l_mix, 187762306a36Sopenharmony_ci ARRAY_SIZE(rt5670_dig_l_mix)), 187862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("DAC MIXR", SND_SOC_NOPM, 0, 0, 187962306a36Sopenharmony_ci rt5670_dig_r_mix, 188062306a36Sopenharmony_ci ARRAY_SIZE(rt5670_dig_r_mix)), 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_ci /* DACs */ 188362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC L1 Power", RT5670_PWR_DIG1, 188462306a36Sopenharmony_ci RT5670_PWR_DAC_L1_BIT, 0, NULL, 0), 188562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC R1 Power", RT5670_PWR_DIG1, 188662306a36Sopenharmony_ci RT5670_PWR_DAC_R1_BIT, 0, NULL, 0), 188762306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC L1", NULL, SND_SOC_NOPM, 0, 0), 188862306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC R1", NULL, SND_SOC_NOPM, 0, 0), 188962306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC L2", NULL, RT5670_PWR_DIG1, 189062306a36Sopenharmony_ci RT5670_PWR_DAC_L2_BIT, 0), 189162306a36Sopenharmony_ci 189262306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC R2", NULL, RT5670_PWR_DIG1, 189362306a36Sopenharmony_ci RT5670_PWR_DAC_R2_BIT, 0), 189462306a36Sopenharmony_ci /* OUT Mixer */ 189562306a36Sopenharmony_ci 189662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("OUT MIXL", RT5670_PWR_MIXER, RT5670_PWR_OM_L_BIT, 189762306a36Sopenharmony_ci 0, rt5670_out_l_mix, ARRAY_SIZE(rt5670_out_l_mix)), 189862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("OUT MIXR", RT5670_PWR_MIXER, RT5670_PWR_OM_R_BIT, 189962306a36Sopenharmony_ci 0, rt5670_out_r_mix, ARRAY_SIZE(rt5670_out_r_mix)), 190062306a36Sopenharmony_ci /* Ouput Volume */ 190162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("HPOVOL MIXL", RT5670_PWR_VOL, 190262306a36Sopenharmony_ci RT5670_PWR_HV_L_BIT, 0, 190362306a36Sopenharmony_ci rt5670_hpvoll_mix, ARRAY_SIZE(rt5670_hpvoll_mix)), 190462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("HPOVOL MIXR", RT5670_PWR_VOL, 190562306a36Sopenharmony_ci RT5670_PWR_HV_R_BIT, 0, 190662306a36Sopenharmony_ci rt5670_hpvolr_mix, ARRAY_SIZE(rt5670_hpvolr_mix)), 190762306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DAC 1", SND_SOC_NOPM, 0, 0, NULL, 0), 190862306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DAC 2", SND_SOC_NOPM, 0, 0, NULL, 0), 190962306a36Sopenharmony_ci SND_SOC_DAPM_PGA("HPOVOL", SND_SOC_NOPM, 0, 0, NULL, 0), 191062306a36Sopenharmony_ci 191162306a36Sopenharmony_ci /* HPO/LOUT/Mono Mixer */ 191262306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("HPO MIX", SND_SOC_NOPM, 0, 0, 191362306a36Sopenharmony_ci rt5670_hpo_mix, ARRAY_SIZE(rt5670_hpo_mix)), 191462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("LOUT MIX", RT5670_PWR_ANLG1, RT5670_PWR_LM_BIT, 191562306a36Sopenharmony_ci 0, rt5670_lout_mix, ARRAY_SIZE(rt5670_lout_mix)), 191662306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY_S("Improve HP Amp Drv", 1, SND_SOC_NOPM, 0, 0, 191762306a36Sopenharmony_ci rt5670_hp_power_event, SND_SOC_DAPM_POST_PMU | 191862306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMD), 191962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("HP L Amp", RT5670_PWR_ANLG1, 192062306a36Sopenharmony_ci RT5670_PWR_HP_L_BIT, 0, NULL, 0), 192162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("HP R Amp", RT5670_PWR_ANLG1, 192262306a36Sopenharmony_ci RT5670_PWR_HP_R_BIT, 0, NULL, 0), 192362306a36Sopenharmony_ci SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, 192462306a36Sopenharmony_ci rt5670_hp_event, SND_SOC_DAPM_PRE_PMD | 192562306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMU), 192662306a36Sopenharmony_ci SND_SOC_DAPM_SWITCH("LOUT L Playback", SND_SOC_NOPM, 0, 0, 192762306a36Sopenharmony_ci &lout_l_enable_control), 192862306a36Sopenharmony_ci SND_SOC_DAPM_SWITCH("LOUT R Playback", SND_SOC_NOPM, 0, 0, 192962306a36Sopenharmony_ci &lout_r_enable_control), 193062306a36Sopenharmony_ci SND_SOC_DAPM_PGA("LOUT Amp", SND_SOC_NOPM, 0, 0, NULL, 0), 193162306a36Sopenharmony_ci 193262306a36Sopenharmony_ci /* PDM */ 193362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PDM1 Power", RT5670_PWR_DIG2, 193462306a36Sopenharmony_ci RT5670_PWR_PDM1_BIT, 0, NULL, 0), 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_ci SND_SOC_DAPM_MUX("PDM1 L Mux", RT5670_PDM_OUT_CTRL, 193762306a36Sopenharmony_ci RT5670_M_PDM1_L_SFT, 1, &rt5670_pdm1_l_mux), 193862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("PDM1 R Mux", RT5670_PDM_OUT_CTRL, 193962306a36Sopenharmony_ci RT5670_M_PDM1_R_SFT, 1, &rt5670_pdm1_r_mux), 194062306a36Sopenharmony_ci 194162306a36Sopenharmony_ci /* Output Lines */ 194262306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOL"), 194362306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOR"), 194462306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("LOUTL"), 194562306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("LOUTR"), 194662306a36Sopenharmony_ci}; 194762306a36Sopenharmony_ci 194862306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5670_specific_dapm_widgets[] = { 194962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PDM2 Power", RT5670_PWR_DIG2, 195062306a36Sopenharmony_ci RT5670_PWR_PDM2_BIT, 0, NULL, 0), 195162306a36Sopenharmony_ci SND_SOC_DAPM_MUX("PDM2 L Mux", RT5670_PDM_OUT_CTRL, 195262306a36Sopenharmony_ci RT5670_M_PDM2_L_SFT, 1, &rt5670_pdm2_l_mux), 195362306a36Sopenharmony_ci SND_SOC_DAPM_MUX("PDM2 R Mux", RT5670_PDM_OUT_CTRL, 195462306a36Sopenharmony_ci RT5670_M_PDM2_R_SFT, 1, &rt5670_pdm2_r_mux), 195562306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("PDM1L"), 195662306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("PDM1R"), 195762306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("PDM2L"), 195862306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("PDM2R"), 195962306a36Sopenharmony_ci}; 196062306a36Sopenharmony_ci 196162306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5672_specific_dapm_widgets[] = { 196262306a36Sopenharmony_ci SND_SOC_DAPM_PGA_E("SPO Amp", SND_SOC_NOPM, 0, 0, NULL, 0, 196362306a36Sopenharmony_ci rt5670_spk_event, SND_SOC_DAPM_PRE_PMD | 196462306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMU), 196562306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("SPOLP"), 196662306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("SPOLN"), 196762306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("SPORP"), 196862306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("SPORN"), 196962306a36Sopenharmony_ci}; 197062306a36Sopenharmony_ci 197162306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5670_dapm_routes[] = { 197262306a36Sopenharmony_ci { "ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc }, 197362306a36Sopenharmony_ci { "ADC Stereo2 Filter", NULL, "ADC STO2 ASRC", is_using_asrc }, 197462306a36Sopenharmony_ci { "ADC Mono Left Filter", NULL, "ADC MONO L ASRC", is_using_asrc }, 197562306a36Sopenharmony_ci { "ADC Mono Right Filter", NULL, "ADC MONO R ASRC", is_using_asrc }, 197662306a36Sopenharmony_ci { "DAC Mono Left Filter", NULL, "DAC MONO L ASRC", is_using_asrc }, 197762306a36Sopenharmony_ci { "DAC Mono Right Filter", NULL, "DAC MONO R ASRC", is_using_asrc }, 197862306a36Sopenharmony_ci { "DAC Stereo1 Filter", NULL, "DAC STO ASRC", is_using_asrc }, 197962306a36Sopenharmony_ci { "Stereo1 DMIC Mux", NULL, "DMIC STO1 ASRC", can_use_asrc }, 198062306a36Sopenharmony_ci { "Stereo2 DMIC Mux", NULL, "DMIC STO2 ASRC", can_use_asrc }, 198162306a36Sopenharmony_ci { "Mono DMIC L Mux", NULL, "DMIC MONO L ASRC", can_use_asrc }, 198262306a36Sopenharmony_ci { "Mono DMIC R Mux", NULL, "DMIC MONO R ASRC", can_use_asrc }, 198362306a36Sopenharmony_ci 198462306a36Sopenharmony_ci { "I2S1", NULL, "I2S1 ASRC", can_use_asrc}, 198562306a36Sopenharmony_ci { "I2S2", NULL, "I2S2 ASRC", can_use_asrc}, 198662306a36Sopenharmony_ci 198762306a36Sopenharmony_ci { "DMIC1", NULL, "DMIC L1" }, 198862306a36Sopenharmony_ci { "DMIC1", NULL, "DMIC R1" }, 198962306a36Sopenharmony_ci { "DMIC2", NULL, "DMIC L2" }, 199062306a36Sopenharmony_ci { "DMIC2", NULL, "DMIC R2" }, 199162306a36Sopenharmony_ci { "DMIC3", NULL, "DMIC L3" }, 199262306a36Sopenharmony_ci { "DMIC3", NULL, "DMIC R3" }, 199362306a36Sopenharmony_ci 199462306a36Sopenharmony_ci { "BST1", NULL, "IN1P" }, 199562306a36Sopenharmony_ci { "BST1", NULL, "IN1N" }, 199662306a36Sopenharmony_ci { "BST1", NULL, "Mic Det Power" }, 199762306a36Sopenharmony_ci { "BST2", NULL, "IN2P" }, 199862306a36Sopenharmony_ci { "BST2", NULL, "IN2N" }, 199962306a36Sopenharmony_ci 200062306a36Sopenharmony_ci { "INL VOL", NULL, "IN2P" }, 200162306a36Sopenharmony_ci { "INR VOL", NULL, "IN2N" }, 200262306a36Sopenharmony_ci 200362306a36Sopenharmony_ci { "RECMIXL", "INL Switch", "INL VOL" }, 200462306a36Sopenharmony_ci { "RECMIXL", "BST2 Switch", "BST2" }, 200562306a36Sopenharmony_ci { "RECMIXL", "BST1 Switch", "BST1" }, 200662306a36Sopenharmony_ci 200762306a36Sopenharmony_ci { "RECMIXR", "INR Switch", "INR VOL" }, 200862306a36Sopenharmony_ci { "RECMIXR", "BST2 Switch", "BST2" }, 200962306a36Sopenharmony_ci { "RECMIXR", "BST1 Switch", "BST1" }, 201062306a36Sopenharmony_ci 201162306a36Sopenharmony_ci { "ADC 1", NULL, "RECMIXL" }, 201262306a36Sopenharmony_ci { "ADC 1", NULL, "ADC 1 power" }, 201362306a36Sopenharmony_ci { "ADC 1", NULL, "ADC clock" }, 201462306a36Sopenharmony_ci { "ADC 2", NULL, "RECMIXR" }, 201562306a36Sopenharmony_ci { "ADC 2", NULL, "ADC 2 power" }, 201662306a36Sopenharmony_ci { "ADC 2", NULL, "ADC clock" }, 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_ci { "DMIC L1", NULL, "DMIC CLK" }, 201962306a36Sopenharmony_ci { "DMIC L1", NULL, "DMIC1 Power" }, 202062306a36Sopenharmony_ci { "DMIC R1", NULL, "DMIC CLK" }, 202162306a36Sopenharmony_ci { "DMIC R1", NULL, "DMIC1 Power" }, 202262306a36Sopenharmony_ci { "DMIC L2", NULL, "DMIC CLK" }, 202362306a36Sopenharmony_ci { "DMIC L2", NULL, "DMIC2 Power" }, 202462306a36Sopenharmony_ci { "DMIC R2", NULL, "DMIC CLK" }, 202562306a36Sopenharmony_ci { "DMIC R2", NULL, "DMIC2 Power" }, 202662306a36Sopenharmony_ci { "DMIC L3", NULL, "DMIC CLK" }, 202762306a36Sopenharmony_ci { "DMIC L3", NULL, "DMIC3 Power" }, 202862306a36Sopenharmony_ci { "DMIC R3", NULL, "DMIC CLK" }, 202962306a36Sopenharmony_ci { "DMIC R3", NULL, "DMIC3 Power" }, 203062306a36Sopenharmony_ci 203162306a36Sopenharmony_ci { "Stereo1 DMIC Mux", "DMIC1", "DMIC1" }, 203262306a36Sopenharmony_ci { "Stereo1 DMIC Mux", "DMIC2", "DMIC2" }, 203362306a36Sopenharmony_ci { "Stereo1 DMIC Mux", "DMIC3", "DMIC3" }, 203462306a36Sopenharmony_ci 203562306a36Sopenharmony_ci { "Stereo2 DMIC Mux", "DMIC1", "DMIC1" }, 203662306a36Sopenharmony_ci { "Stereo2 DMIC Mux", "DMIC2", "DMIC2" }, 203762306a36Sopenharmony_ci { "Stereo2 DMIC Mux", "DMIC3", "DMIC3" }, 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_ci { "Mono DMIC L Mux", "DMIC1", "DMIC L1" }, 204062306a36Sopenharmony_ci { "Mono DMIC L Mux", "DMIC2", "DMIC L2" }, 204162306a36Sopenharmony_ci { "Mono DMIC L Mux", "DMIC3", "DMIC L3" }, 204262306a36Sopenharmony_ci 204362306a36Sopenharmony_ci { "Mono DMIC R Mux", "DMIC1", "DMIC R1" }, 204462306a36Sopenharmony_ci { "Mono DMIC R Mux", "DMIC2", "DMIC R2" }, 204562306a36Sopenharmony_ci { "Mono DMIC R Mux", "DMIC3", "DMIC R3" }, 204662306a36Sopenharmony_ci 204762306a36Sopenharmony_ci { "ADC 1_2", NULL, "ADC 1" }, 204862306a36Sopenharmony_ci { "ADC 1_2", NULL, "ADC 2" }, 204962306a36Sopenharmony_ci 205062306a36Sopenharmony_ci { "Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC Mux" }, 205162306a36Sopenharmony_ci { "Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL" }, 205262306a36Sopenharmony_ci { "Stereo1 ADC L1 Mux", "ADC", "ADC 1_2" }, 205362306a36Sopenharmony_ci { "Stereo1 ADC L1 Mux", "DAC MIX", "DAC MIXL" }, 205462306a36Sopenharmony_ci 205562306a36Sopenharmony_ci { "Stereo1 ADC R1 Mux", "ADC", "ADC 1_2" }, 205662306a36Sopenharmony_ci { "Stereo1 ADC R1 Mux", "DAC MIX", "DAC MIXR" }, 205762306a36Sopenharmony_ci { "Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC Mux" }, 205862306a36Sopenharmony_ci { "Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR" }, 205962306a36Sopenharmony_ci 206062306a36Sopenharmony_ci { "Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux" }, 206162306a36Sopenharmony_ci { "Mono ADC L2 Mux", "Mono DAC MIXL", "Mono DAC MIXL" }, 206262306a36Sopenharmony_ci { "Mono ADC L1 Mux", "Mono DAC MIXL", "Mono DAC MIXL" }, 206362306a36Sopenharmony_ci { "Mono ADC L1 Mux", "ADC1", "ADC 1" }, 206462306a36Sopenharmony_ci 206562306a36Sopenharmony_ci { "Mono ADC R1 Mux", "Mono DAC MIXR", "Mono DAC MIXR" }, 206662306a36Sopenharmony_ci { "Mono ADC R1 Mux", "ADC2", "ADC 2" }, 206762306a36Sopenharmony_ci { "Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux" }, 206862306a36Sopenharmony_ci { "Mono ADC R2 Mux", "Mono DAC MIXR", "Mono DAC MIXR" }, 206962306a36Sopenharmony_ci 207062306a36Sopenharmony_ci { "Sto1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux" }, 207162306a36Sopenharmony_ci { "Sto1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux" }, 207262306a36Sopenharmony_ci { "Sto1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux" }, 207362306a36Sopenharmony_ci { "Sto1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux" }, 207462306a36Sopenharmony_ci 207562306a36Sopenharmony_ci { "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" }, 207662306a36Sopenharmony_ci { "Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter" }, 207762306a36Sopenharmony_ci 207862306a36Sopenharmony_ci { "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" }, 207962306a36Sopenharmony_ci { "Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter" }, 208062306a36Sopenharmony_ci { "ADC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll }, 208162306a36Sopenharmony_ci 208262306a36Sopenharmony_ci { "Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux" }, 208362306a36Sopenharmony_ci { "Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux" }, 208462306a36Sopenharmony_ci { "Mono ADC MIXL", NULL, "ADC Mono Left Filter" }, 208562306a36Sopenharmony_ci { "ADC Mono Left Filter", NULL, "PLL1", is_sys_clk_from_pll }, 208662306a36Sopenharmony_ci 208762306a36Sopenharmony_ci { "Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux" }, 208862306a36Sopenharmony_ci { "Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux" }, 208962306a36Sopenharmony_ci { "Mono ADC MIXR", NULL, "ADC Mono Right Filter" }, 209062306a36Sopenharmony_ci { "ADC Mono Right Filter", NULL, "PLL1", is_sys_clk_from_pll }, 209162306a36Sopenharmony_ci 209262306a36Sopenharmony_ci { "Stereo2 ADC L2 Mux", "DMIC", "Stereo2 DMIC Mux" }, 209362306a36Sopenharmony_ci { "Stereo2 ADC L2 Mux", "DAC MIX", "DAC MIXL" }, 209462306a36Sopenharmony_ci { "Stereo2 ADC L1 Mux", "ADC", "ADC 1_2" }, 209562306a36Sopenharmony_ci { "Stereo2 ADC L1 Mux", "DAC MIX", "DAC MIXL" }, 209662306a36Sopenharmony_ci 209762306a36Sopenharmony_ci { "Stereo2 ADC R1 Mux", "ADC", "ADC 1_2" }, 209862306a36Sopenharmony_ci { "Stereo2 ADC R1 Mux", "DAC MIX", "DAC MIXR" }, 209962306a36Sopenharmony_ci { "Stereo2 ADC R2 Mux", "DMIC", "Stereo2 DMIC Mux" }, 210062306a36Sopenharmony_ci { "Stereo2 ADC R2 Mux", "DAC MIX", "DAC MIXR" }, 210162306a36Sopenharmony_ci 210262306a36Sopenharmony_ci { "Sto2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC L1 Mux" }, 210362306a36Sopenharmony_ci { "Sto2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC L2 Mux" }, 210462306a36Sopenharmony_ci { "Sto2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC R1 Mux" }, 210562306a36Sopenharmony_ci { "Sto2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC R2 Mux" }, 210662306a36Sopenharmony_ci 210762306a36Sopenharmony_ci { "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXL" }, 210862306a36Sopenharmony_ci { "Sto2 ADC LR MIX", NULL, "Sto2 ADC MIXR" }, 210962306a36Sopenharmony_ci 211062306a36Sopenharmony_ci { "Stereo2 ADC LR Mux", "L", "Sto2 ADC MIXL" }, 211162306a36Sopenharmony_ci { "Stereo2 ADC LR Mux", "LR", "Sto2 ADC LR MIX" }, 211262306a36Sopenharmony_ci 211362306a36Sopenharmony_ci { "Stereo2 ADC MIXL", NULL, "Stereo2 ADC LR Mux" }, 211462306a36Sopenharmony_ci { "Stereo2 ADC MIXL", NULL, "ADC Stereo2 Filter" }, 211562306a36Sopenharmony_ci 211662306a36Sopenharmony_ci { "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" }, 211762306a36Sopenharmony_ci { "Stereo2 ADC MIXR", NULL, "ADC Stereo2 Filter" }, 211862306a36Sopenharmony_ci { "ADC Stereo2 Filter", NULL, "PLL1", is_sys_clk_from_pll }, 211962306a36Sopenharmony_ci 212062306a36Sopenharmony_ci { "VAD ADC Mux", "Sto1 ADC L", "Stereo1 ADC MIXL" }, 212162306a36Sopenharmony_ci { "VAD ADC Mux", "Mono ADC L", "Mono ADC MIXL" }, 212262306a36Sopenharmony_ci { "VAD ADC Mux", "Mono ADC R", "Mono ADC MIXR" }, 212362306a36Sopenharmony_ci { "VAD ADC Mux", "Sto2 ADC L", "Sto2 ADC MIXL" }, 212462306a36Sopenharmony_ci 212562306a36Sopenharmony_ci { "VAD_ADC", NULL, "VAD ADC Mux" }, 212662306a36Sopenharmony_ci 212762306a36Sopenharmony_ci { "IF_ADC1", NULL, "Stereo1 ADC MIXL" }, 212862306a36Sopenharmony_ci { "IF_ADC1", NULL, "Stereo1 ADC MIXR" }, 212962306a36Sopenharmony_ci { "IF_ADC2", NULL, "Mono ADC MIXL" }, 213062306a36Sopenharmony_ci { "IF_ADC2", NULL, "Mono ADC MIXR" }, 213162306a36Sopenharmony_ci { "IF_ADC3", NULL, "Stereo2 ADC MIXL" }, 213262306a36Sopenharmony_ci { "IF_ADC3", NULL, "Stereo2 ADC MIXR" }, 213362306a36Sopenharmony_ci 213462306a36Sopenharmony_ci { "IF1 ADC1 IN1 Mux", "IF_ADC1", "IF_ADC1" }, 213562306a36Sopenharmony_ci { "IF1 ADC1 IN1 Mux", "IF1_ADC3", "IF1_ADC3" }, 213662306a36Sopenharmony_ci 213762306a36Sopenharmony_ci { "IF1 ADC1 IN2 Mux", "IF1_ADC1_IN1", "IF1 ADC1 IN1 Mux" }, 213862306a36Sopenharmony_ci { "IF1 ADC1 IN2 Mux", "IF1_ADC4", "TxDP_ADC" }, 213962306a36Sopenharmony_ci 214062306a36Sopenharmony_ci { "IF1 ADC2 IN Mux", "IF_ADC2", "IF_ADC2" }, 214162306a36Sopenharmony_ci { "IF1 ADC2 IN Mux", "VAD_ADC", "VAD_ADC" }, 214262306a36Sopenharmony_ci 214362306a36Sopenharmony_ci { "IF1 ADC2 IN1 Mux", "IF1_ADC2_IN", "IF1 ADC2 IN Mux" }, 214462306a36Sopenharmony_ci { "IF1 ADC2 IN1 Mux", "IF1_ADC4", "TxDP_ADC" }, 214562306a36Sopenharmony_ci 214662306a36Sopenharmony_ci { "IF1_ADC1" , NULL, "IF1 ADC1 IN2 Mux" }, 214762306a36Sopenharmony_ci { "IF1_ADC2" , NULL, "IF1 ADC2 IN1 Mux" }, 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL" }, 215062306a36Sopenharmony_ci { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" }, 215162306a36Sopenharmony_ci { "Stereo2 ADC MIX", NULL, "Sto2 ADC MIXL" }, 215262306a36Sopenharmony_ci { "Stereo2 ADC MIX", NULL, "Sto2 ADC MIXR" }, 215362306a36Sopenharmony_ci { "Mono ADC MIX", NULL, "Mono ADC MIXL" }, 215462306a36Sopenharmony_ci { "Mono ADC MIX", NULL, "Mono ADC MIXR" }, 215562306a36Sopenharmony_ci 215662306a36Sopenharmony_ci { "RxDP Mux", "IF2 DAC", "IF2 DAC" }, 215762306a36Sopenharmony_ci { "RxDP Mux", "IF1 DAC", "IF1 DAC2" }, 215862306a36Sopenharmony_ci { "RxDP Mux", "STO1 ADC Mixer", "Stereo1 ADC MIX" }, 215962306a36Sopenharmony_ci { "RxDP Mux", "STO2 ADC Mixer", "Stereo2 ADC MIX" }, 216062306a36Sopenharmony_ci { "RxDP Mux", "Mono ADC Mixer L", "Mono ADC MIXL" }, 216162306a36Sopenharmony_ci { "RxDP Mux", "Mono ADC Mixer R", "Mono ADC MIXR" }, 216262306a36Sopenharmony_ci { "RxDP Mux", "DAC1", "DAC MIX" }, 216362306a36Sopenharmony_ci 216462306a36Sopenharmony_ci { "TDM Data Mux", "Slot 0-1", "Stereo1 ADC MIX" }, 216562306a36Sopenharmony_ci { "TDM Data Mux", "Slot 2-3", "Mono ADC MIX" }, 216662306a36Sopenharmony_ci { "TDM Data Mux", "Slot 4-5", "Stereo2 ADC MIX" }, 216762306a36Sopenharmony_ci { "TDM Data Mux", "Slot 6-7", "IF2 DAC" }, 216862306a36Sopenharmony_ci 216962306a36Sopenharmony_ci { "DSP UL Mux", "Bypass", "TDM Data Mux" }, 217062306a36Sopenharmony_ci { "DSP UL Mux", NULL, "I2S DSP" }, 217162306a36Sopenharmony_ci { "DSP DL Mux", "Bypass", "RxDP Mux" }, 217262306a36Sopenharmony_ci { "DSP DL Mux", NULL, "I2S DSP" }, 217362306a36Sopenharmony_ci 217462306a36Sopenharmony_ci { "TxDP_ADC_L", NULL, "DSP UL Mux" }, 217562306a36Sopenharmony_ci { "TxDP_ADC_R", NULL, "DSP UL Mux" }, 217662306a36Sopenharmony_ci { "TxDC_DAC", NULL, "DSP DL Mux" }, 217762306a36Sopenharmony_ci 217862306a36Sopenharmony_ci { "TxDP_ADC", NULL, "TxDP_ADC_L" }, 217962306a36Sopenharmony_ci { "TxDP_ADC", NULL, "TxDP_ADC_R" }, 218062306a36Sopenharmony_ci 218162306a36Sopenharmony_ci { "IF1 ADC", NULL, "I2S1" }, 218262306a36Sopenharmony_ci { "IF1 ADC", NULL, "IF1_ADC1" }, 218362306a36Sopenharmony_ci { "IF1 ADC", NULL, "IF1_ADC2" }, 218462306a36Sopenharmony_ci { "IF1 ADC", NULL, "IF_ADC3" }, 218562306a36Sopenharmony_ci { "IF1 ADC", NULL, "TxDP_ADC" }, 218662306a36Sopenharmony_ci 218762306a36Sopenharmony_ci { "IF2 ADC Mux", "IF_ADC1", "IF_ADC1" }, 218862306a36Sopenharmony_ci { "IF2 ADC Mux", "IF_ADC2", "IF_ADC2" }, 218962306a36Sopenharmony_ci { "IF2 ADC Mux", "IF_ADC3", "IF_ADC3" }, 219062306a36Sopenharmony_ci { "IF2 ADC Mux", "TxDC_DAC", "TxDC_DAC" }, 219162306a36Sopenharmony_ci { "IF2 ADC Mux", "TxDP_ADC", "TxDP_ADC" }, 219262306a36Sopenharmony_ci { "IF2 ADC Mux", "VAD_ADC", "VAD_ADC" }, 219362306a36Sopenharmony_ci 219462306a36Sopenharmony_ci { "IF2 ADC L", NULL, "IF2 ADC Mux" }, 219562306a36Sopenharmony_ci { "IF2 ADC R", NULL, "IF2 ADC Mux" }, 219662306a36Sopenharmony_ci 219762306a36Sopenharmony_ci { "IF2 ADC", NULL, "I2S2" }, 219862306a36Sopenharmony_ci { "IF2 ADC", NULL, "IF2 ADC L" }, 219962306a36Sopenharmony_ci { "IF2 ADC", NULL, "IF2 ADC R" }, 220062306a36Sopenharmony_ci 220162306a36Sopenharmony_ci { "AIF1TX", NULL, "IF1 ADC" }, 220262306a36Sopenharmony_ci { "AIF2TX", NULL, "IF2 ADC" }, 220362306a36Sopenharmony_ci 220462306a36Sopenharmony_ci { "IF1 DAC1", NULL, "AIF1RX" }, 220562306a36Sopenharmony_ci { "IF1 DAC2", NULL, "AIF1RX" }, 220662306a36Sopenharmony_ci { "IF2 DAC", NULL, "AIF2RX" }, 220762306a36Sopenharmony_ci 220862306a36Sopenharmony_ci { "IF1 DAC1", NULL, "I2S1" }, 220962306a36Sopenharmony_ci { "IF1 DAC2", NULL, "I2S1" }, 221062306a36Sopenharmony_ci { "IF2 DAC", NULL, "I2S2" }, 221162306a36Sopenharmony_ci 221262306a36Sopenharmony_ci { "IF1 DAC2 L", NULL, "IF1 DAC2" }, 221362306a36Sopenharmony_ci { "IF1 DAC2 R", NULL, "IF1 DAC2" }, 221462306a36Sopenharmony_ci { "IF1 DAC1 L", NULL, "IF1 DAC1" }, 221562306a36Sopenharmony_ci { "IF1 DAC1 R", NULL, "IF1 DAC1" }, 221662306a36Sopenharmony_ci { "IF2 DAC L", NULL, "IF2 DAC" }, 221762306a36Sopenharmony_ci { "IF2 DAC R", NULL, "IF2 DAC" }, 221862306a36Sopenharmony_ci 221962306a36Sopenharmony_ci { "DAC1 L Mux", "IF1 DAC", "IF1 DAC1 L" }, 222062306a36Sopenharmony_ci { "DAC1 L Mux", "IF2 DAC", "IF2 DAC L" }, 222162306a36Sopenharmony_ci 222262306a36Sopenharmony_ci { "DAC1 R Mux", "IF1 DAC", "IF1 DAC1 R" }, 222362306a36Sopenharmony_ci { "DAC1 R Mux", "IF2 DAC", "IF2 DAC R" }, 222462306a36Sopenharmony_ci 222562306a36Sopenharmony_ci { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL" }, 222662306a36Sopenharmony_ci { "DAC1 MIXL", "DAC1 Switch", "DAC1 L Mux" }, 222762306a36Sopenharmony_ci { "DAC1 MIXL", NULL, "DAC Stereo1 Filter" }, 222862306a36Sopenharmony_ci { "DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR" }, 222962306a36Sopenharmony_ci { "DAC1 MIXR", "DAC1 Switch", "DAC1 R Mux" }, 223062306a36Sopenharmony_ci { "DAC1 MIXR", NULL, "DAC Stereo1 Filter" }, 223162306a36Sopenharmony_ci 223262306a36Sopenharmony_ci { "DAC Stereo1 Filter", NULL, "PLL1", is_sys_clk_from_pll }, 223362306a36Sopenharmony_ci { "DAC Mono Left Filter", NULL, "PLL1", is_sys_clk_from_pll }, 223462306a36Sopenharmony_ci { "DAC Mono Right Filter", NULL, "PLL1", is_sys_clk_from_pll }, 223562306a36Sopenharmony_ci 223662306a36Sopenharmony_ci { "DAC MIX", NULL, "DAC1 MIXL" }, 223762306a36Sopenharmony_ci { "DAC MIX", NULL, "DAC1 MIXR" }, 223862306a36Sopenharmony_ci 223962306a36Sopenharmony_ci { "Audio DSP", NULL, "DAC1 MIXL" }, 224062306a36Sopenharmony_ci { "Audio DSP", NULL, "DAC1 MIXR" }, 224162306a36Sopenharmony_ci 224262306a36Sopenharmony_ci { "DAC L2 Mux", "IF1 DAC", "IF1 DAC2 L" }, 224362306a36Sopenharmony_ci { "DAC L2 Mux", "IF2 DAC", "IF2 DAC L" }, 224462306a36Sopenharmony_ci { "DAC L2 Mux", "TxDC DAC", "TxDC_DAC" }, 224562306a36Sopenharmony_ci { "DAC L2 Mux", "VAD_ADC", "VAD_ADC" }, 224662306a36Sopenharmony_ci { "DAC L2 Volume", NULL, "DAC L2 Mux" }, 224762306a36Sopenharmony_ci { "DAC L2 Volume", NULL, "DAC Mono Left Filter" }, 224862306a36Sopenharmony_ci 224962306a36Sopenharmony_ci { "DAC R2 Mux", "IF1 DAC", "IF1 DAC2 R" }, 225062306a36Sopenharmony_ci { "DAC R2 Mux", "IF2 DAC", "IF2 DAC R" }, 225162306a36Sopenharmony_ci { "DAC R2 Mux", "TxDC DAC", "TxDC_DAC" }, 225262306a36Sopenharmony_ci { "DAC R2 Mux", "TxDP ADC", "TxDP_ADC" }, 225362306a36Sopenharmony_ci { "DAC R2 Volume", NULL, "DAC R2 Mux" }, 225462306a36Sopenharmony_ci { "DAC R2 Volume", NULL, "DAC Mono Right Filter" }, 225562306a36Sopenharmony_ci 225662306a36Sopenharmony_ci { "Stereo DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" }, 225762306a36Sopenharmony_ci { "Stereo DAC MIXL", "DAC R1 Switch", "DAC1 MIXR" }, 225862306a36Sopenharmony_ci { "Stereo DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" }, 225962306a36Sopenharmony_ci { "Stereo DAC MIXL", NULL, "DAC Stereo1 Filter" }, 226062306a36Sopenharmony_ci { "Stereo DAC MIXL", NULL, "DAC L1 Power" }, 226162306a36Sopenharmony_ci { "Stereo DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" }, 226262306a36Sopenharmony_ci { "Stereo DAC MIXR", "DAC L1 Switch", "DAC1 MIXL" }, 226362306a36Sopenharmony_ci { "Stereo DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" }, 226462306a36Sopenharmony_ci { "Stereo DAC MIXR", NULL, "DAC Stereo1 Filter" }, 226562306a36Sopenharmony_ci { "Stereo DAC MIXR", NULL, "DAC R1 Power" }, 226662306a36Sopenharmony_ci 226762306a36Sopenharmony_ci { "Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL" }, 226862306a36Sopenharmony_ci { "Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" }, 226962306a36Sopenharmony_ci { "Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Volume" }, 227062306a36Sopenharmony_ci { "Mono DAC MIXL", NULL, "DAC Mono Left Filter" }, 227162306a36Sopenharmony_ci { "Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR" }, 227262306a36Sopenharmony_ci { "Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" }, 227362306a36Sopenharmony_ci { "Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" }, 227462306a36Sopenharmony_ci { "Mono DAC MIXR", NULL, "DAC Mono Right Filter" }, 227562306a36Sopenharmony_ci 227662306a36Sopenharmony_ci { "DAC MIXL", "Sto DAC Mix L Switch", "Stereo DAC MIXL" }, 227762306a36Sopenharmony_ci { "DAC MIXL", "DAC L2 Switch", "DAC L2 Volume" }, 227862306a36Sopenharmony_ci { "DAC MIXL", "DAC R2 Switch", "DAC R2 Volume" }, 227962306a36Sopenharmony_ci { "DAC MIXR", "Sto DAC Mix R Switch", "Stereo DAC MIXR" }, 228062306a36Sopenharmony_ci { "DAC MIXR", "DAC R2 Switch", "DAC R2 Volume" }, 228162306a36Sopenharmony_ci { "DAC MIXR", "DAC L2 Switch", "DAC L2 Volume" }, 228262306a36Sopenharmony_ci 228362306a36Sopenharmony_ci { "DAC L1", NULL, "DAC L1 Power" }, 228462306a36Sopenharmony_ci { "DAC L1", NULL, "Stereo DAC MIXL" }, 228562306a36Sopenharmony_ci { "DAC R1", NULL, "DAC R1 Power" }, 228662306a36Sopenharmony_ci { "DAC R1", NULL, "Stereo DAC MIXR" }, 228762306a36Sopenharmony_ci { "DAC L2", NULL, "Mono DAC MIXL" }, 228862306a36Sopenharmony_ci { "DAC R2", NULL, "Mono DAC MIXR" }, 228962306a36Sopenharmony_ci 229062306a36Sopenharmony_ci { "OUT MIXL", "BST1 Switch", "BST1" }, 229162306a36Sopenharmony_ci { "OUT MIXL", "INL Switch", "INL VOL" }, 229262306a36Sopenharmony_ci { "OUT MIXL", "DAC L2 Switch", "DAC L2" }, 229362306a36Sopenharmony_ci { "OUT MIXL", "DAC L1 Switch", "DAC L1" }, 229462306a36Sopenharmony_ci 229562306a36Sopenharmony_ci { "OUT MIXR", "BST2 Switch", "BST2" }, 229662306a36Sopenharmony_ci { "OUT MIXR", "INR Switch", "INR VOL" }, 229762306a36Sopenharmony_ci { "OUT MIXR", "DAC R2 Switch", "DAC R2" }, 229862306a36Sopenharmony_ci { "OUT MIXR", "DAC R1 Switch", "DAC R1" }, 229962306a36Sopenharmony_ci 230062306a36Sopenharmony_ci { "HPOVOL MIXL", "DAC1 Switch", "DAC L1" }, 230162306a36Sopenharmony_ci { "HPOVOL MIXL", "INL Switch", "INL VOL" }, 230262306a36Sopenharmony_ci { "HPOVOL MIXR", "DAC1 Switch", "DAC R1" }, 230362306a36Sopenharmony_ci { "HPOVOL MIXR", "INR Switch", "INR VOL" }, 230462306a36Sopenharmony_ci 230562306a36Sopenharmony_ci { "DAC 2", NULL, "DAC L2" }, 230662306a36Sopenharmony_ci { "DAC 2", NULL, "DAC R2" }, 230762306a36Sopenharmony_ci { "DAC 1", NULL, "DAC L1" }, 230862306a36Sopenharmony_ci { "DAC 1", NULL, "DAC R1" }, 230962306a36Sopenharmony_ci { "HPOVOL", NULL, "HPOVOL MIXL" }, 231062306a36Sopenharmony_ci { "HPOVOL", NULL, "HPOVOL MIXR" }, 231162306a36Sopenharmony_ci { "HPO MIX", "DAC1 Switch", "DAC 1" }, 231262306a36Sopenharmony_ci { "HPO MIX", "HPVOL Switch", "HPOVOL" }, 231362306a36Sopenharmony_ci 231462306a36Sopenharmony_ci { "LOUT MIX", "DAC L1 Switch", "DAC L1" }, 231562306a36Sopenharmony_ci { "LOUT MIX", "DAC R1 Switch", "DAC R1" }, 231662306a36Sopenharmony_ci { "LOUT MIX", "OUTMIX L Switch", "OUT MIXL" }, 231762306a36Sopenharmony_ci { "LOUT MIX", "OUTMIX R Switch", "OUT MIXR" }, 231862306a36Sopenharmony_ci 231962306a36Sopenharmony_ci { "PDM1 L Mux", "Stereo DAC", "Stereo DAC MIXL" }, 232062306a36Sopenharmony_ci { "PDM1 L Mux", "Mono DAC", "Mono DAC MIXL" }, 232162306a36Sopenharmony_ci { "PDM1 L Mux", NULL, "PDM1 Power" }, 232262306a36Sopenharmony_ci { "PDM1 R Mux", "Stereo DAC", "Stereo DAC MIXR" }, 232362306a36Sopenharmony_ci { "PDM1 R Mux", "Mono DAC", "Mono DAC MIXR" }, 232462306a36Sopenharmony_ci { "PDM1 R Mux", NULL, "PDM1 Power" }, 232562306a36Sopenharmony_ci 232662306a36Sopenharmony_ci { "HP Amp", NULL, "HPO MIX" }, 232762306a36Sopenharmony_ci { "HP Amp", NULL, "Mic Det Power" }, 232862306a36Sopenharmony_ci { "HPOL", NULL, "HP Amp" }, 232962306a36Sopenharmony_ci { "HPOL", NULL, "HP L Amp" }, 233062306a36Sopenharmony_ci { "HPOL", NULL, "Improve HP Amp Drv" }, 233162306a36Sopenharmony_ci { "HPOR", NULL, "HP Amp" }, 233262306a36Sopenharmony_ci { "HPOR", NULL, "HP R Amp" }, 233362306a36Sopenharmony_ci { "HPOR", NULL, "Improve HP Amp Drv" }, 233462306a36Sopenharmony_ci 233562306a36Sopenharmony_ci { "LOUT Amp", NULL, "LOUT MIX" }, 233662306a36Sopenharmony_ci { "LOUT L Playback", "Switch", "LOUT Amp" }, 233762306a36Sopenharmony_ci { "LOUT R Playback", "Switch", "LOUT Amp" }, 233862306a36Sopenharmony_ci { "LOUTL", NULL, "LOUT L Playback" }, 233962306a36Sopenharmony_ci { "LOUTR", NULL, "LOUT R Playback" }, 234062306a36Sopenharmony_ci { "LOUTL", NULL, "Improve HP Amp Drv" }, 234162306a36Sopenharmony_ci { "LOUTR", NULL, "Improve HP Amp Drv" }, 234262306a36Sopenharmony_ci}; 234362306a36Sopenharmony_ci 234462306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5670_specific_dapm_routes[] = { 234562306a36Sopenharmony_ci { "PDM2 L Mux", "Stereo DAC", "Stereo DAC MIXL" }, 234662306a36Sopenharmony_ci { "PDM2 L Mux", "Mono DAC", "Mono DAC MIXL" }, 234762306a36Sopenharmony_ci { "PDM2 L Mux", NULL, "PDM2 Power" }, 234862306a36Sopenharmony_ci { "PDM2 R Mux", "Stereo DAC", "Stereo DAC MIXR" }, 234962306a36Sopenharmony_ci { "PDM2 R Mux", "Mono DAC", "Mono DAC MIXR" }, 235062306a36Sopenharmony_ci { "PDM2 R Mux", NULL, "PDM2 Power" }, 235162306a36Sopenharmony_ci { "PDM1L", NULL, "PDM1 L Mux" }, 235262306a36Sopenharmony_ci { "PDM1R", NULL, "PDM1 R Mux" }, 235362306a36Sopenharmony_ci { "PDM2L", NULL, "PDM2 L Mux" }, 235462306a36Sopenharmony_ci { "PDM2R", NULL, "PDM2 R Mux" }, 235562306a36Sopenharmony_ci}; 235662306a36Sopenharmony_ci 235762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5672_specific_dapm_routes[] = { 235862306a36Sopenharmony_ci { "SPO Amp", NULL, "PDM1 L Mux" }, 235962306a36Sopenharmony_ci { "SPO Amp", NULL, "PDM1 R Mux" }, 236062306a36Sopenharmony_ci { "SPOLP", NULL, "SPO Amp" }, 236162306a36Sopenharmony_ci { "SPOLN", NULL, "SPO Amp" }, 236262306a36Sopenharmony_ci { "SPORP", NULL, "SPO Amp" }, 236362306a36Sopenharmony_ci { "SPORN", NULL, "SPO Amp" }, 236462306a36Sopenharmony_ci}; 236562306a36Sopenharmony_ci 236662306a36Sopenharmony_cistatic int rt5670_hw_params(struct snd_pcm_substream *substream, 236762306a36Sopenharmony_ci struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 236862306a36Sopenharmony_ci{ 236962306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 237062306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 237162306a36Sopenharmony_ci unsigned int val_len = 0, val_clk, mask_clk; 237262306a36Sopenharmony_ci int pre_div, bclk_ms, frame_size; 237362306a36Sopenharmony_ci 237462306a36Sopenharmony_ci rt5670->lrck[dai->id] = params_rate(params); 237562306a36Sopenharmony_ci pre_div = rl6231_get_clk_info(rt5670->sysclk, rt5670->lrck[dai->id]); 237662306a36Sopenharmony_ci if (pre_div < 0) { 237762306a36Sopenharmony_ci dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", 237862306a36Sopenharmony_ci rt5670->lrck[dai->id], dai->id); 237962306a36Sopenharmony_ci return -EINVAL; 238062306a36Sopenharmony_ci } 238162306a36Sopenharmony_ci frame_size = snd_soc_params_to_frame_size(params); 238262306a36Sopenharmony_ci if (frame_size < 0) { 238362306a36Sopenharmony_ci dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); 238462306a36Sopenharmony_ci return -EINVAL; 238562306a36Sopenharmony_ci } 238662306a36Sopenharmony_ci bclk_ms = frame_size > 32; 238762306a36Sopenharmony_ci rt5670->bclk[dai->id] = rt5670->lrck[dai->id] * (32 << bclk_ms); 238862306a36Sopenharmony_ci 238962306a36Sopenharmony_ci dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n", 239062306a36Sopenharmony_ci rt5670->bclk[dai->id], rt5670->lrck[dai->id]); 239162306a36Sopenharmony_ci dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", 239262306a36Sopenharmony_ci bclk_ms, pre_div, dai->id); 239362306a36Sopenharmony_ci 239462306a36Sopenharmony_ci switch (params_width(params)) { 239562306a36Sopenharmony_ci case 16: 239662306a36Sopenharmony_ci break; 239762306a36Sopenharmony_ci case 20: 239862306a36Sopenharmony_ci val_len |= RT5670_I2S_DL_20; 239962306a36Sopenharmony_ci break; 240062306a36Sopenharmony_ci case 24: 240162306a36Sopenharmony_ci val_len |= RT5670_I2S_DL_24; 240262306a36Sopenharmony_ci break; 240362306a36Sopenharmony_ci case 8: 240462306a36Sopenharmony_ci val_len |= RT5670_I2S_DL_8; 240562306a36Sopenharmony_ci break; 240662306a36Sopenharmony_ci default: 240762306a36Sopenharmony_ci return -EINVAL; 240862306a36Sopenharmony_ci } 240962306a36Sopenharmony_ci 241062306a36Sopenharmony_ci switch (dai->id) { 241162306a36Sopenharmony_ci case RT5670_AIF1: 241262306a36Sopenharmony_ci mask_clk = RT5670_I2S_BCLK_MS1_MASK | RT5670_I2S_PD1_MASK; 241362306a36Sopenharmony_ci val_clk = bclk_ms << RT5670_I2S_BCLK_MS1_SFT | 241462306a36Sopenharmony_ci pre_div << RT5670_I2S_PD1_SFT; 241562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_I2S1_SDP, 241662306a36Sopenharmony_ci RT5670_I2S_DL_MASK, val_len); 241762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_ADDA_CLK1, mask_clk, val_clk); 241862306a36Sopenharmony_ci break; 241962306a36Sopenharmony_ci case RT5670_AIF2: 242062306a36Sopenharmony_ci mask_clk = RT5670_I2S_BCLK_MS2_MASK | RT5670_I2S_PD2_MASK; 242162306a36Sopenharmony_ci val_clk = bclk_ms << RT5670_I2S_BCLK_MS2_SFT | 242262306a36Sopenharmony_ci pre_div << RT5670_I2S_PD2_SFT; 242362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_I2S2_SDP, 242462306a36Sopenharmony_ci RT5670_I2S_DL_MASK, val_len); 242562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_ADDA_CLK1, mask_clk, val_clk); 242662306a36Sopenharmony_ci break; 242762306a36Sopenharmony_ci default: 242862306a36Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 242962306a36Sopenharmony_ci return -EINVAL; 243062306a36Sopenharmony_ci } 243162306a36Sopenharmony_ci 243262306a36Sopenharmony_ci return 0; 243362306a36Sopenharmony_ci} 243462306a36Sopenharmony_ci 243562306a36Sopenharmony_cistatic int rt5670_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) 243662306a36Sopenharmony_ci{ 243762306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 243862306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 243962306a36Sopenharmony_ci unsigned int reg_val = 0; 244062306a36Sopenharmony_ci 244162306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 244262306a36Sopenharmony_ci case SND_SOC_DAIFMT_CBM_CFM: 244362306a36Sopenharmony_ci rt5670->master[dai->id] = 1; 244462306a36Sopenharmony_ci break; 244562306a36Sopenharmony_ci case SND_SOC_DAIFMT_CBS_CFS: 244662306a36Sopenharmony_ci reg_val |= RT5670_I2S_MS_S; 244762306a36Sopenharmony_ci rt5670->master[dai->id] = 0; 244862306a36Sopenharmony_ci break; 244962306a36Sopenharmony_ci default: 245062306a36Sopenharmony_ci return -EINVAL; 245162306a36Sopenharmony_ci } 245262306a36Sopenharmony_ci 245362306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 245462306a36Sopenharmony_ci case SND_SOC_DAIFMT_NB_NF: 245562306a36Sopenharmony_ci break; 245662306a36Sopenharmony_ci case SND_SOC_DAIFMT_IB_NF: 245762306a36Sopenharmony_ci reg_val |= RT5670_I2S_BP_INV; 245862306a36Sopenharmony_ci break; 245962306a36Sopenharmony_ci default: 246062306a36Sopenharmony_ci return -EINVAL; 246162306a36Sopenharmony_ci } 246262306a36Sopenharmony_ci 246362306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 246462306a36Sopenharmony_ci case SND_SOC_DAIFMT_I2S: 246562306a36Sopenharmony_ci break; 246662306a36Sopenharmony_ci case SND_SOC_DAIFMT_LEFT_J: 246762306a36Sopenharmony_ci reg_val |= RT5670_I2S_DF_LEFT; 246862306a36Sopenharmony_ci break; 246962306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_A: 247062306a36Sopenharmony_ci reg_val |= RT5670_I2S_DF_PCM_A; 247162306a36Sopenharmony_ci break; 247262306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_B: 247362306a36Sopenharmony_ci reg_val |= RT5670_I2S_DF_PCM_B; 247462306a36Sopenharmony_ci break; 247562306a36Sopenharmony_ci default: 247662306a36Sopenharmony_ci return -EINVAL; 247762306a36Sopenharmony_ci } 247862306a36Sopenharmony_ci 247962306a36Sopenharmony_ci switch (dai->id) { 248062306a36Sopenharmony_ci case RT5670_AIF1: 248162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_I2S1_SDP, 248262306a36Sopenharmony_ci RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK | 248362306a36Sopenharmony_ci RT5670_I2S_DF_MASK, reg_val); 248462306a36Sopenharmony_ci break; 248562306a36Sopenharmony_ci case RT5670_AIF2: 248662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_I2S2_SDP, 248762306a36Sopenharmony_ci RT5670_I2S_MS_MASK | RT5670_I2S_BP_MASK | 248862306a36Sopenharmony_ci RT5670_I2S_DF_MASK, reg_val); 248962306a36Sopenharmony_ci break; 249062306a36Sopenharmony_ci default: 249162306a36Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 249262306a36Sopenharmony_ci return -EINVAL; 249362306a36Sopenharmony_ci } 249462306a36Sopenharmony_ci return 0; 249562306a36Sopenharmony_ci} 249662306a36Sopenharmony_ci 249762306a36Sopenharmony_cistatic int rt5670_set_codec_sysclk(struct snd_soc_component *component, int clk_id, 249862306a36Sopenharmony_ci int source, unsigned int freq, int dir) 249962306a36Sopenharmony_ci{ 250062306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 250162306a36Sopenharmony_ci unsigned int reg_val = 0; 250262306a36Sopenharmony_ci 250362306a36Sopenharmony_ci switch (clk_id) { 250462306a36Sopenharmony_ci case RT5670_SCLK_S_MCLK: 250562306a36Sopenharmony_ci reg_val |= RT5670_SCLK_SRC_MCLK; 250662306a36Sopenharmony_ci break; 250762306a36Sopenharmony_ci case RT5670_SCLK_S_PLL1: 250862306a36Sopenharmony_ci reg_val |= RT5670_SCLK_SRC_PLL1; 250962306a36Sopenharmony_ci break; 251062306a36Sopenharmony_ci case RT5670_SCLK_S_RCCLK: 251162306a36Sopenharmony_ci reg_val |= RT5670_SCLK_SRC_RCCLK; 251262306a36Sopenharmony_ci break; 251362306a36Sopenharmony_ci default: 251462306a36Sopenharmony_ci dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); 251562306a36Sopenharmony_ci return -EINVAL; 251662306a36Sopenharmony_ci } 251762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GLB_CLK, 251862306a36Sopenharmony_ci RT5670_SCLK_SRC_MASK, reg_val); 251962306a36Sopenharmony_ci rt5670->sysclk = freq; 252062306a36Sopenharmony_ci if (clk_id != RT5670_SCLK_S_RCCLK) 252162306a36Sopenharmony_ci rt5670->sysclk_src = clk_id; 252262306a36Sopenharmony_ci 252362306a36Sopenharmony_ci dev_dbg(component->dev, "Sysclk : %dHz clock id : %d\n", freq, clk_id); 252462306a36Sopenharmony_ci 252562306a36Sopenharmony_ci return 0; 252662306a36Sopenharmony_ci} 252762306a36Sopenharmony_ci 252862306a36Sopenharmony_cistatic int rt5670_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, 252962306a36Sopenharmony_ci unsigned int freq_in, unsigned int freq_out) 253062306a36Sopenharmony_ci{ 253162306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 253262306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 253362306a36Sopenharmony_ci struct rl6231_pll_code pll_code; 253462306a36Sopenharmony_ci int ret; 253562306a36Sopenharmony_ci 253662306a36Sopenharmony_ci if (source == rt5670->pll_src && freq_in == rt5670->pll_in && 253762306a36Sopenharmony_ci freq_out == rt5670->pll_out) 253862306a36Sopenharmony_ci return 0; 253962306a36Sopenharmony_ci 254062306a36Sopenharmony_ci if (!freq_in || !freq_out) { 254162306a36Sopenharmony_ci dev_dbg(component->dev, "PLL disabled\n"); 254262306a36Sopenharmony_ci 254362306a36Sopenharmony_ci rt5670->pll_in = 0; 254462306a36Sopenharmony_ci rt5670->pll_out = 0; 254562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GLB_CLK, 254662306a36Sopenharmony_ci RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_MCLK); 254762306a36Sopenharmony_ci return 0; 254862306a36Sopenharmony_ci } 254962306a36Sopenharmony_ci 255062306a36Sopenharmony_ci switch (source) { 255162306a36Sopenharmony_ci case RT5670_PLL1_S_MCLK: 255262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GLB_CLK, 255362306a36Sopenharmony_ci RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_MCLK); 255462306a36Sopenharmony_ci break; 255562306a36Sopenharmony_ci case RT5670_PLL1_S_BCLK1: 255662306a36Sopenharmony_ci case RT5670_PLL1_S_BCLK2: 255762306a36Sopenharmony_ci case RT5670_PLL1_S_BCLK3: 255862306a36Sopenharmony_ci case RT5670_PLL1_S_BCLK4: 255962306a36Sopenharmony_ci switch (dai->id) { 256062306a36Sopenharmony_ci case RT5670_AIF1: 256162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GLB_CLK, 256262306a36Sopenharmony_ci RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK1); 256362306a36Sopenharmony_ci break; 256462306a36Sopenharmony_ci case RT5670_AIF2: 256562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GLB_CLK, 256662306a36Sopenharmony_ci RT5670_PLL1_SRC_MASK, RT5670_PLL1_SRC_BCLK2); 256762306a36Sopenharmony_ci break; 256862306a36Sopenharmony_ci default: 256962306a36Sopenharmony_ci dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); 257062306a36Sopenharmony_ci return -EINVAL; 257162306a36Sopenharmony_ci } 257262306a36Sopenharmony_ci break; 257362306a36Sopenharmony_ci default: 257462306a36Sopenharmony_ci dev_err(component->dev, "Unknown PLL source %d\n", source); 257562306a36Sopenharmony_ci return -EINVAL; 257662306a36Sopenharmony_ci } 257762306a36Sopenharmony_ci 257862306a36Sopenharmony_ci ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); 257962306a36Sopenharmony_ci if (ret < 0) { 258062306a36Sopenharmony_ci dev_err(component->dev, "Unsupported input clock %d\n", freq_in); 258162306a36Sopenharmony_ci return ret; 258262306a36Sopenharmony_ci } 258362306a36Sopenharmony_ci 258462306a36Sopenharmony_ci dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", 258562306a36Sopenharmony_ci pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code), 258662306a36Sopenharmony_ci pll_code.n_code, pll_code.k_code); 258762306a36Sopenharmony_ci 258862306a36Sopenharmony_ci snd_soc_component_write(component, RT5670_PLL_CTRL1, 258962306a36Sopenharmony_ci pll_code.n_code << RT5670_PLL_N_SFT | pll_code.k_code); 259062306a36Sopenharmony_ci snd_soc_component_write(component, RT5670_PLL_CTRL2, 259162306a36Sopenharmony_ci ((pll_code.m_bp ? 0 : pll_code.m_code) << RT5670_PLL_M_SFT) | 259262306a36Sopenharmony_ci (pll_code.m_bp << RT5670_PLL_M_BP_SFT)); 259362306a36Sopenharmony_ci 259462306a36Sopenharmony_ci rt5670->pll_in = freq_in; 259562306a36Sopenharmony_ci rt5670->pll_out = freq_out; 259662306a36Sopenharmony_ci rt5670->pll_src = source; 259762306a36Sopenharmony_ci 259862306a36Sopenharmony_ci return 0; 259962306a36Sopenharmony_ci} 260062306a36Sopenharmony_ci 260162306a36Sopenharmony_cistatic int rt5670_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 260262306a36Sopenharmony_ci unsigned int rx_mask, int slots, int slot_width) 260362306a36Sopenharmony_ci{ 260462306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 260562306a36Sopenharmony_ci unsigned int val = 0; 260662306a36Sopenharmony_ci 260762306a36Sopenharmony_ci if (rx_mask || tx_mask) 260862306a36Sopenharmony_ci val |= (1 << 14); 260962306a36Sopenharmony_ci 261062306a36Sopenharmony_ci switch (slots) { 261162306a36Sopenharmony_ci case 4: 261262306a36Sopenharmony_ci val |= (1 << 12); 261362306a36Sopenharmony_ci break; 261462306a36Sopenharmony_ci case 6: 261562306a36Sopenharmony_ci val |= (2 << 12); 261662306a36Sopenharmony_ci break; 261762306a36Sopenharmony_ci case 8: 261862306a36Sopenharmony_ci val |= (3 << 12); 261962306a36Sopenharmony_ci break; 262062306a36Sopenharmony_ci case 2: 262162306a36Sopenharmony_ci break; 262262306a36Sopenharmony_ci default: 262362306a36Sopenharmony_ci return -EINVAL; 262462306a36Sopenharmony_ci } 262562306a36Sopenharmony_ci 262662306a36Sopenharmony_ci switch (slot_width) { 262762306a36Sopenharmony_ci case 20: 262862306a36Sopenharmony_ci val |= (1 << 10); 262962306a36Sopenharmony_ci break; 263062306a36Sopenharmony_ci case 24: 263162306a36Sopenharmony_ci val |= (2 << 10); 263262306a36Sopenharmony_ci break; 263362306a36Sopenharmony_ci case 32: 263462306a36Sopenharmony_ci val |= (3 << 10); 263562306a36Sopenharmony_ci break; 263662306a36Sopenharmony_ci case 16: 263762306a36Sopenharmony_ci break; 263862306a36Sopenharmony_ci default: 263962306a36Sopenharmony_ci return -EINVAL; 264062306a36Sopenharmony_ci } 264162306a36Sopenharmony_ci 264262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_TDM_CTRL_1, 0x7c00, val); 264362306a36Sopenharmony_ci 264462306a36Sopenharmony_ci return 0; 264562306a36Sopenharmony_ci} 264662306a36Sopenharmony_ci 264762306a36Sopenharmony_cistatic int rt5670_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) 264862306a36Sopenharmony_ci{ 264962306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 265062306a36Sopenharmony_ci 265162306a36Sopenharmony_ci dev_dbg(component->dev, "%s ratio=%d\n", __func__, ratio); 265262306a36Sopenharmony_ci if (dai->id != RT5670_AIF1) 265362306a36Sopenharmony_ci return 0; 265462306a36Sopenharmony_ci 265562306a36Sopenharmony_ci if ((ratio % 50) == 0) 265662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 265762306a36Sopenharmony_ci RT5670_TDM_DATA_MODE_SEL, RT5670_TDM_DATA_MODE_50FS); 265862306a36Sopenharmony_ci else 265962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_GEN_CTRL3, 266062306a36Sopenharmony_ci RT5670_TDM_DATA_MODE_SEL, RT5670_TDM_DATA_MODE_NOR); 266162306a36Sopenharmony_ci 266262306a36Sopenharmony_ci return 0; 266362306a36Sopenharmony_ci} 266462306a36Sopenharmony_ci 266562306a36Sopenharmony_cistatic int rt5670_set_bias_level(struct snd_soc_component *component, 266662306a36Sopenharmony_ci enum snd_soc_bias_level level) 266762306a36Sopenharmony_ci{ 266862306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 266962306a36Sopenharmony_ci 267062306a36Sopenharmony_ci switch (level) { 267162306a36Sopenharmony_ci case SND_SOC_BIAS_PREPARE: 267262306a36Sopenharmony_ci if (SND_SOC_BIAS_STANDBY == snd_soc_component_get_bias_level(component)) { 267362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, 267462306a36Sopenharmony_ci RT5670_PWR_VREF1 | RT5670_PWR_MB | 267562306a36Sopenharmony_ci RT5670_PWR_BG | RT5670_PWR_VREF2, 267662306a36Sopenharmony_ci RT5670_PWR_VREF1 | RT5670_PWR_MB | 267762306a36Sopenharmony_ci RT5670_PWR_BG | RT5670_PWR_VREF2); 267862306a36Sopenharmony_ci mdelay(10); 267962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, 268062306a36Sopenharmony_ci RT5670_PWR_FV1 | RT5670_PWR_FV2, 268162306a36Sopenharmony_ci RT5670_PWR_FV1 | RT5670_PWR_FV2); 268262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_CHARGE_PUMP, 268362306a36Sopenharmony_ci RT5670_OSW_L_MASK | RT5670_OSW_R_MASK, 268462306a36Sopenharmony_ci RT5670_OSW_L_DIS | RT5670_OSW_R_DIS); 268562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_DIG_MISC, 0x1, 0x1); 268662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, 268762306a36Sopenharmony_ci RT5670_LDO_SEL_MASK, 0x5); 268862306a36Sopenharmony_ci } 268962306a36Sopenharmony_ci break; 269062306a36Sopenharmony_ci case SND_SOC_BIAS_STANDBY: 269162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, 269262306a36Sopenharmony_ci RT5670_PWR_VREF1 | RT5670_PWR_VREF2 | 269362306a36Sopenharmony_ci RT5670_PWR_FV1 | RT5670_PWR_FV2, 0); 269462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, 269562306a36Sopenharmony_ci RT5670_LDO_SEL_MASK, 0x3); 269662306a36Sopenharmony_ci break; 269762306a36Sopenharmony_ci case SND_SOC_BIAS_OFF: 269862306a36Sopenharmony_ci if (rt5670->jd_mode) 269962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, 270062306a36Sopenharmony_ci RT5670_PWR_VREF1 | RT5670_PWR_MB | 270162306a36Sopenharmony_ci RT5670_PWR_BG | RT5670_PWR_VREF2 | 270262306a36Sopenharmony_ci RT5670_PWR_FV1 | RT5670_PWR_FV2, 270362306a36Sopenharmony_ci RT5670_PWR_MB | RT5670_PWR_BG); 270462306a36Sopenharmony_ci else 270562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_PWR_ANLG1, 270662306a36Sopenharmony_ci RT5670_PWR_VREF1 | RT5670_PWR_MB | 270762306a36Sopenharmony_ci RT5670_PWR_BG | RT5670_PWR_VREF2 | 270862306a36Sopenharmony_ci RT5670_PWR_FV1 | RT5670_PWR_FV2, 0); 270962306a36Sopenharmony_ci 271062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5670_DIG_MISC, 0x1, 0x0); 271162306a36Sopenharmony_ci break; 271262306a36Sopenharmony_ci 271362306a36Sopenharmony_ci default: 271462306a36Sopenharmony_ci break; 271562306a36Sopenharmony_ci } 271662306a36Sopenharmony_ci 271762306a36Sopenharmony_ci return 0; 271862306a36Sopenharmony_ci} 271962306a36Sopenharmony_ci 272062306a36Sopenharmony_cistatic int rt5670_probe(struct snd_soc_component *component) 272162306a36Sopenharmony_ci{ 272262306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); 272362306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 272462306a36Sopenharmony_ci 272562306a36Sopenharmony_ci switch (snd_soc_component_read(component, RT5670_RESET) & RT5670_ID_MASK) { 272662306a36Sopenharmony_ci case RT5670_ID_5670: 272762306a36Sopenharmony_ci case RT5670_ID_5671: 272862306a36Sopenharmony_ci snd_soc_dapm_new_controls(dapm, 272962306a36Sopenharmony_ci rt5670_specific_dapm_widgets, 273062306a36Sopenharmony_ci ARRAY_SIZE(rt5670_specific_dapm_widgets)); 273162306a36Sopenharmony_ci snd_soc_dapm_add_routes(dapm, 273262306a36Sopenharmony_ci rt5670_specific_dapm_routes, 273362306a36Sopenharmony_ci ARRAY_SIZE(rt5670_specific_dapm_routes)); 273462306a36Sopenharmony_ci break; 273562306a36Sopenharmony_ci case RT5670_ID_5672: 273662306a36Sopenharmony_ci snd_soc_dapm_new_controls(dapm, 273762306a36Sopenharmony_ci rt5672_specific_dapm_widgets, 273862306a36Sopenharmony_ci ARRAY_SIZE(rt5672_specific_dapm_widgets)); 273962306a36Sopenharmony_ci snd_soc_dapm_add_routes(dapm, 274062306a36Sopenharmony_ci rt5672_specific_dapm_routes, 274162306a36Sopenharmony_ci ARRAY_SIZE(rt5672_specific_dapm_routes)); 274262306a36Sopenharmony_ci break; 274362306a36Sopenharmony_ci default: 274462306a36Sopenharmony_ci dev_err(component->dev, 274562306a36Sopenharmony_ci "The driver is for RT5670 RT5671 or RT5672 only\n"); 274662306a36Sopenharmony_ci return -ENODEV; 274762306a36Sopenharmony_ci } 274862306a36Sopenharmony_ci rt5670->component = component; 274962306a36Sopenharmony_ci 275062306a36Sopenharmony_ci return 0; 275162306a36Sopenharmony_ci} 275262306a36Sopenharmony_ci 275362306a36Sopenharmony_cistatic void rt5670_remove(struct snd_soc_component *component) 275462306a36Sopenharmony_ci{ 275562306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 275662306a36Sopenharmony_ci 275762306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_RESET, 0); 275862306a36Sopenharmony_ci snd_soc_jack_free_gpios(rt5670->jack, 1, &rt5670->hp_gpio); 275962306a36Sopenharmony_ci} 276062306a36Sopenharmony_ci 276162306a36Sopenharmony_ci#ifdef CONFIG_PM 276262306a36Sopenharmony_cistatic int rt5670_suspend(struct snd_soc_component *component) 276362306a36Sopenharmony_ci{ 276462306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 276562306a36Sopenharmony_ci 276662306a36Sopenharmony_ci regcache_cache_only(rt5670->regmap, true); 276762306a36Sopenharmony_ci regcache_mark_dirty(rt5670->regmap); 276862306a36Sopenharmony_ci return 0; 276962306a36Sopenharmony_ci} 277062306a36Sopenharmony_ci 277162306a36Sopenharmony_cistatic int rt5670_resume(struct snd_soc_component *component) 277262306a36Sopenharmony_ci{ 277362306a36Sopenharmony_ci struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component); 277462306a36Sopenharmony_ci 277562306a36Sopenharmony_ci regcache_cache_only(rt5670->regmap, false); 277662306a36Sopenharmony_ci regcache_sync(rt5670->regmap); 277762306a36Sopenharmony_ci 277862306a36Sopenharmony_ci return 0; 277962306a36Sopenharmony_ci} 278062306a36Sopenharmony_ci#else 278162306a36Sopenharmony_ci#define rt5670_suspend NULL 278262306a36Sopenharmony_ci#define rt5670_resume NULL 278362306a36Sopenharmony_ci#endif 278462306a36Sopenharmony_ci 278562306a36Sopenharmony_ci#define RT5670_STEREO_RATES SNDRV_PCM_RATE_8000_96000 278662306a36Sopenharmony_ci#define RT5670_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 278762306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8) 278862306a36Sopenharmony_ci 278962306a36Sopenharmony_cistatic const struct snd_soc_dai_ops rt5670_aif_dai_ops = { 279062306a36Sopenharmony_ci .hw_params = rt5670_hw_params, 279162306a36Sopenharmony_ci .set_fmt = rt5670_set_dai_fmt, 279262306a36Sopenharmony_ci .set_tdm_slot = rt5670_set_tdm_slot, 279362306a36Sopenharmony_ci .set_pll = rt5670_set_dai_pll, 279462306a36Sopenharmony_ci .set_bclk_ratio = rt5670_set_bclk_ratio, 279562306a36Sopenharmony_ci}; 279662306a36Sopenharmony_ci 279762306a36Sopenharmony_cistatic struct snd_soc_dai_driver rt5670_dai[] = { 279862306a36Sopenharmony_ci { 279962306a36Sopenharmony_ci .name = "rt5670-aif1", 280062306a36Sopenharmony_ci .id = RT5670_AIF1, 280162306a36Sopenharmony_ci .playback = { 280262306a36Sopenharmony_ci .stream_name = "AIF1 Playback", 280362306a36Sopenharmony_ci .channels_min = 1, 280462306a36Sopenharmony_ci .channels_max = 2, 280562306a36Sopenharmony_ci .rates = RT5670_STEREO_RATES, 280662306a36Sopenharmony_ci .formats = RT5670_FORMATS, 280762306a36Sopenharmony_ci }, 280862306a36Sopenharmony_ci .capture = { 280962306a36Sopenharmony_ci .stream_name = "AIF1 Capture", 281062306a36Sopenharmony_ci .channels_min = 1, 281162306a36Sopenharmony_ci .channels_max = 2, 281262306a36Sopenharmony_ci .rates = RT5670_STEREO_RATES, 281362306a36Sopenharmony_ci .formats = RT5670_FORMATS, 281462306a36Sopenharmony_ci }, 281562306a36Sopenharmony_ci .ops = &rt5670_aif_dai_ops, 281662306a36Sopenharmony_ci .symmetric_rate = 1, 281762306a36Sopenharmony_ci }, 281862306a36Sopenharmony_ci { 281962306a36Sopenharmony_ci .name = "rt5670-aif2", 282062306a36Sopenharmony_ci .id = RT5670_AIF2, 282162306a36Sopenharmony_ci .playback = { 282262306a36Sopenharmony_ci .stream_name = "AIF2 Playback", 282362306a36Sopenharmony_ci .channels_min = 1, 282462306a36Sopenharmony_ci .channels_max = 2, 282562306a36Sopenharmony_ci .rates = RT5670_STEREO_RATES, 282662306a36Sopenharmony_ci .formats = RT5670_FORMATS, 282762306a36Sopenharmony_ci }, 282862306a36Sopenharmony_ci .capture = { 282962306a36Sopenharmony_ci .stream_name = "AIF2 Capture", 283062306a36Sopenharmony_ci .channels_min = 1, 283162306a36Sopenharmony_ci .channels_max = 2, 283262306a36Sopenharmony_ci .rates = RT5670_STEREO_RATES, 283362306a36Sopenharmony_ci .formats = RT5670_FORMATS, 283462306a36Sopenharmony_ci }, 283562306a36Sopenharmony_ci .ops = &rt5670_aif_dai_ops, 283662306a36Sopenharmony_ci .symmetric_rate = 1, 283762306a36Sopenharmony_ci }, 283862306a36Sopenharmony_ci}; 283962306a36Sopenharmony_ci 284062306a36Sopenharmony_cistatic const struct snd_soc_component_driver soc_component_dev_rt5670 = { 284162306a36Sopenharmony_ci .probe = rt5670_probe, 284262306a36Sopenharmony_ci .remove = rt5670_remove, 284362306a36Sopenharmony_ci .suspend = rt5670_suspend, 284462306a36Sopenharmony_ci .resume = rt5670_resume, 284562306a36Sopenharmony_ci .set_bias_level = rt5670_set_bias_level, 284662306a36Sopenharmony_ci .set_sysclk = rt5670_set_codec_sysclk, 284762306a36Sopenharmony_ci .controls = rt5670_snd_controls, 284862306a36Sopenharmony_ci .num_controls = ARRAY_SIZE(rt5670_snd_controls), 284962306a36Sopenharmony_ci .dapm_widgets = rt5670_dapm_widgets, 285062306a36Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(rt5670_dapm_widgets), 285162306a36Sopenharmony_ci .dapm_routes = rt5670_dapm_routes, 285262306a36Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(rt5670_dapm_routes), 285362306a36Sopenharmony_ci .use_pmdown_time = 1, 285462306a36Sopenharmony_ci .endianness = 1, 285562306a36Sopenharmony_ci}; 285662306a36Sopenharmony_ci 285762306a36Sopenharmony_cistatic const struct regmap_config rt5670_regmap = { 285862306a36Sopenharmony_ci .reg_bits = 8, 285962306a36Sopenharmony_ci .val_bits = 16, 286062306a36Sopenharmony_ci .use_single_read = true, 286162306a36Sopenharmony_ci .use_single_write = true, 286262306a36Sopenharmony_ci .max_register = RT5670_VENDOR_ID2 + 1 + (ARRAY_SIZE(rt5670_ranges) * 286362306a36Sopenharmony_ci RT5670_PR_SPACING), 286462306a36Sopenharmony_ci .volatile_reg = rt5670_volatile_register, 286562306a36Sopenharmony_ci .readable_reg = rt5670_readable_register, 286662306a36Sopenharmony_ci .cache_type = REGCACHE_MAPLE, 286762306a36Sopenharmony_ci .reg_defaults = rt5670_reg, 286862306a36Sopenharmony_ci .num_reg_defaults = ARRAY_SIZE(rt5670_reg), 286962306a36Sopenharmony_ci .ranges = rt5670_ranges, 287062306a36Sopenharmony_ci .num_ranges = ARRAY_SIZE(rt5670_ranges), 287162306a36Sopenharmony_ci}; 287262306a36Sopenharmony_ci 287362306a36Sopenharmony_cistatic const struct i2c_device_id rt5670_i2c_id[] = { 287462306a36Sopenharmony_ci { "rt5670", 0 }, 287562306a36Sopenharmony_ci { "rt5671", 0 }, 287662306a36Sopenharmony_ci { "rt5672", 0 }, 287762306a36Sopenharmony_ci { } 287862306a36Sopenharmony_ci}; 287962306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, rt5670_i2c_id); 288062306a36Sopenharmony_ci 288162306a36Sopenharmony_ci#ifdef CONFIG_ACPI 288262306a36Sopenharmony_cistatic const struct acpi_device_id rt5670_acpi_match[] = { 288362306a36Sopenharmony_ci { "10EC5670", 0}, 288462306a36Sopenharmony_ci { "10EC5672", 0}, 288562306a36Sopenharmony_ci { "10EC5640", 0}, /* quirk */ 288662306a36Sopenharmony_ci { }, 288762306a36Sopenharmony_ci}; 288862306a36Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, rt5670_acpi_match); 288962306a36Sopenharmony_ci#endif 289062306a36Sopenharmony_ci 289162306a36Sopenharmony_cistatic int rt5670_quirk_cb(const struct dmi_system_id *id) 289262306a36Sopenharmony_ci{ 289362306a36Sopenharmony_ci rt5670_quirk = (unsigned long)id->driver_data; 289462306a36Sopenharmony_ci return 1; 289562306a36Sopenharmony_ci} 289662306a36Sopenharmony_ci 289762306a36Sopenharmony_cistatic const struct dmi_system_id dmi_platform_intel_quirks[] = { 289862306a36Sopenharmony_ci { 289962306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 290062306a36Sopenharmony_ci .ident = "Intel Braswell", 290162306a36Sopenharmony_ci .matches = { 290262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Intel Corporation"), 290362306a36Sopenharmony_ci DMI_MATCH(DMI_BOARD_NAME, "Braswell CRB"), 290462306a36Sopenharmony_ci }, 290562306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 290662306a36Sopenharmony_ci RT5670_DMIC1_IN2P | 290762306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 290862306a36Sopenharmony_ci RT5670_JD_MODE1), 290962306a36Sopenharmony_ci }, 291062306a36Sopenharmony_ci { 291162306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 291262306a36Sopenharmony_ci .ident = "Dell Wyse 3040", 291362306a36Sopenharmony_ci .matches = { 291462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 291562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Wyse 3040"), 291662306a36Sopenharmony_ci }, 291762306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 291862306a36Sopenharmony_ci RT5670_DMIC1_IN2P | 291962306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 292062306a36Sopenharmony_ci RT5670_JD_MODE1), 292162306a36Sopenharmony_ci }, 292262306a36Sopenharmony_ci { 292362306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 292462306a36Sopenharmony_ci .ident = "Lenovo Thinkpad Tablet 8", 292562306a36Sopenharmony_ci .matches = { 292662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 292762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 8"), 292862306a36Sopenharmony_ci }, 292962306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 293062306a36Sopenharmony_ci RT5670_DMIC2_INR | 293162306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 293262306a36Sopenharmony_ci RT5670_JD_MODE1), 293362306a36Sopenharmony_ci }, 293462306a36Sopenharmony_ci { 293562306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 293662306a36Sopenharmony_ci .ident = "Lenovo Thinkpad Tablet 10", 293762306a36Sopenharmony_ci .matches = { 293862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 293962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad 10"), 294062306a36Sopenharmony_ci }, 294162306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 294262306a36Sopenharmony_ci RT5670_DMIC1_IN2P | 294362306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 294462306a36Sopenharmony_ci RT5670_JD_MODE1), 294562306a36Sopenharmony_ci }, 294662306a36Sopenharmony_ci { 294762306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 294862306a36Sopenharmony_ci .ident = "Lenovo Thinkpad Tablet 10", 294962306a36Sopenharmony_ci .matches = { 295062306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 295162306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad Tablet B"), 295262306a36Sopenharmony_ci }, 295362306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 295462306a36Sopenharmony_ci RT5670_DMIC1_IN2P | 295562306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 295662306a36Sopenharmony_ci RT5670_JD_MODE1), 295762306a36Sopenharmony_ci }, 295862306a36Sopenharmony_ci { 295962306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 296062306a36Sopenharmony_ci .ident = "Lenovo Miix 2 10", 296162306a36Sopenharmony_ci .matches = { 296262306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 296362306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Miix 2 10"), 296462306a36Sopenharmony_ci }, 296562306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 296662306a36Sopenharmony_ci RT5670_DMIC1_IN2P | 296762306a36Sopenharmony_ci RT5670_GPIO1_IS_EXT_SPK_EN | 296862306a36Sopenharmony_ci RT5670_JD_MODE2), 296962306a36Sopenharmony_ci }, 297062306a36Sopenharmony_ci { 297162306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 297262306a36Sopenharmony_ci .ident = "Dell Venue 8 Pro 5855", 297362306a36Sopenharmony_ci .matches = { 297462306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 297562306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Venue 8 Pro 5855"), 297662306a36Sopenharmony_ci }, 297762306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 297862306a36Sopenharmony_ci RT5670_DMIC2_INR | 297962306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 298062306a36Sopenharmony_ci RT5670_JD_MODE3), 298162306a36Sopenharmony_ci }, 298262306a36Sopenharmony_ci { 298362306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 298462306a36Sopenharmony_ci .ident = "Dell Venue 10 Pro 5055", 298562306a36Sopenharmony_ci .matches = { 298662306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), 298762306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_NAME, "Venue 10 Pro 5055"), 298862306a36Sopenharmony_ci }, 298962306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 299062306a36Sopenharmony_ci RT5670_DMIC2_INR | 299162306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 299262306a36Sopenharmony_ci RT5670_JD_MODE1), 299362306a36Sopenharmony_ci }, 299462306a36Sopenharmony_ci { 299562306a36Sopenharmony_ci .callback = rt5670_quirk_cb, 299662306a36Sopenharmony_ci .ident = "Aegex 10 tablet (RU2)", 299762306a36Sopenharmony_ci .matches = { 299862306a36Sopenharmony_ci DMI_MATCH(DMI_SYS_VENDOR, "AEGEX"), 299962306a36Sopenharmony_ci DMI_MATCH(DMI_PRODUCT_VERSION, "RU2"), 300062306a36Sopenharmony_ci }, 300162306a36Sopenharmony_ci .driver_data = (unsigned long *)(RT5670_DMIC_EN | 300262306a36Sopenharmony_ci RT5670_DMIC2_INR | 300362306a36Sopenharmony_ci RT5670_GPIO1_IS_IRQ | 300462306a36Sopenharmony_ci RT5670_JD_MODE3), 300562306a36Sopenharmony_ci }, 300662306a36Sopenharmony_ci {} 300762306a36Sopenharmony_ci}; 300862306a36Sopenharmony_ci 300962306a36Sopenharmony_ciconst char *rt5670_components(void) 301062306a36Sopenharmony_ci{ 301162306a36Sopenharmony_ci unsigned long quirk; 301262306a36Sopenharmony_ci bool dmic1 = false; 301362306a36Sopenharmony_ci bool dmic2 = false; 301462306a36Sopenharmony_ci bool dmic3 = false; 301562306a36Sopenharmony_ci 301662306a36Sopenharmony_ci if (quirk_override) { 301762306a36Sopenharmony_ci quirk = quirk_override; 301862306a36Sopenharmony_ci } else { 301962306a36Sopenharmony_ci dmi_check_system(dmi_platform_intel_quirks); 302062306a36Sopenharmony_ci quirk = rt5670_quirk; 302162306a36Sopenharmony_ci } 302262306a36Sopenharmony_ci 302362306a36Sopenharmony_ci if ((quirk & RT5670_DMIC1_IN2P) || 302462306a36Sopenharmony_ci (quirk & RT5670_DMIC1_GPIO6) || 302562306a36Sopenharmony_ci (quirk & RT5670_DMIC1_GPIO7)) 302662306a36Sopenharmony_ci dmic1 = true; 302762306a36Sopenharmony_ci 302862306a36Sopenharmony_ci if ((quirk & RT5670_DMIC2_INR) || 302962306a36Sopenharmony_ci (quirk & RT5670_DMIC2_GPIO8)) 303062306a36Sopenharmony_ci dmic2 = true; 303162306a36Sopenharmony_ci 303262306a36Sopenharmony_ci if (quirk & RT5670_DMIC3_GPIO5) 303362306a36Sopenharmony_ci dmic3 = true; 303462306a36Sopenharmony_ci 303562306a36Sopenharmony_ci if (dmic1 && dmic2) 303662306a36Sopenharmony_ci return "cfg-spk:2 cfg-mic:dmics12"; 303762306a36Sopenharmony_ci else if (dmic1) 303862306a36Sopenharmony_ci return "cfg-spk:2 cfg-mic:dmic1"; 303962306a36Sopenharmony_ci else if (dmic2) 304062306a36Sopenharmony_ci return "cfg-spk:2 cfg-mic:dmic2"; 304162306a36Sopenharmony_ci else if (dmic3) 304262306a36Sopenharmony_ci return "cfg-spk:2 cfg-mic:dmic3"; 304362306a36Sopenharmony_ci 304462306a36Sopenharmony_ci return NULL; 304562306a36Sopenharmony_ci} 304662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5670_components); 304762306a36Sopenharmony_ci 304862306a36Sopenharmony_cistatic int rt5670_i2c_probe(struct i2c_client *i2c) 304962306a36Sopenharmony_ci{ 305062306a36Sopenharmony_ci struct rt5670_priv *rt5670; 305162306a36Sopenharmony_ci int ret; 305262306a36Sopenharmony_ci unsigned int val; 305362306a36Sopenharmony_ci 305462306a36Sopenharmony_ci rt5670 = devm_kzalloc(&i2c->dev, 305562306a36Sopenharmony_ci sizeof(struct rt5670_priv), 305662306a36Sopenharmony_ci GFP_KERNEL); 305762306a36Sopenharmony_ci if (NULL == rt5670) 305862306a36Sopenharmony_ci return -ENOMEM; 305962306a36Sopenharmony_ci 306062306a36Sopenharmony_ci i2c_set_clientdata(i2c, rt5670); 306162306a36Sopenharmony_ci 306262306a36Sopenharmony_ci dmi_check_system(dmi_platform_intel_quirks); 306362306a36Sopenharmony_ci if (quirk_override) { 306462306a36Sopenharmony_ci dev_info(&i2c->dev, "Overriding quirk 0x%x => 0x%x\n", 306562306a36Sopenharmony_ci (unsigned int)rt5670_quirk, quirk_override); 306662306a36Sopenharmony_ci rt5670_quirk = quirk_override; 306762306a36Sopenharmony_ci } 306862306a36Sopenharmony_ci 306962306a36Sopenharmony_ci if (rt5670_quirk & RT5670_GPIO1_IS_IRQ) { 307062306a36Sopenharmony_ci rt5670->gpio1_is_irq = true; 307162306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk GPIO1 is IRQ\n"); 307262306a36Sopenharmony_ci } 307362306a36Sopenharmony_ci if (rt5670_quirk & RT5670_GPIO1_IS_EXT_SPK_EN) { 307462306a36Sopenharmony_ci rt5670->gpio1_is_ext_spk_en = true; 307562306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk GPIO1 is external speaker enable\n"); 307662306a36Sopenharmony_ci } 307762306a36Sopenharmony_ci if (rt5670_quirk & RT5670_IN2_DIFF) { 307862306a36Sopenharmony_ci rt5670->in2_diff = true; 307962306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk IN2_DIFF\n"); 308062306a36Sopenharmony_ci } 308162306a36Sopenharmony_ci if (rt5670_quirk & RT5670_DMIC_EN) { 308262306a36Sopenharmony_ci rt5670->dmic_en = true; 308362306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk DMIC enabled\n"); 308462306a36Sopenharmony_ci } 308562306a36Sopenharmony_ci if (rt5670_quirk & RT5670_DMIC1_IN2P) { 308662306a36Sopenharmony_ci rt5670->dmic1_data_pin = RT5670_DMIC_DATA_IN2P; 308762306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk DMIC1 on IN2P pin\n"); 308862306a36Sopenharmony_ci } 308962306a36Sopenharmony_ci if (rt5670_quirk & RT5670_DMIC1_GPIO6) { 309062306a36Sopenharmony_ci rt5670->dmic1_data_pin = RT5670_DMIC_DATA_GPIO6; 309162306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk DMIC1 on GPIO6 pin\n"); 309262306a36Sopenharmony_ci } 309362306a36Sopenharmony_ci if (rt5670_quirk & RT5670_DMIC1_GPIO7) { 309462306a36Sopenharmony_ci rt5670->dmic1_data_pin = RT5670_DMIC_DATA_GPIO7; 309562306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk DMIC1 on GPIO7 pin\n"); 309662306a36Sopenharmony_ci } 309762306a36Sopenharmony_ci if (rt5670_quirk & RT5670_DMIC2_INR) { 309862306a36Sopenharmony_ci rt5670->dmic2_data_pin = RT5670_DMIC_DATA_IN3N; 309962306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk DMIC2 on INR pin\n"); 310062306a36Sopenharmony_ci } 310162306a36Sopenharmony_ci if (rt5670_quirk & RT5670_DMIC2_GPIO8) { 310262306a36Sopenharmony_ci rt5670->dmic2_data_pin = RT5670_DMIC_DATA_GPIO8; 310362306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk DMIC2 on GPIO8 pin\n"); 310462306a36Sopenharmony_ci } 310562306a36Sopenharmony_ci if (rt5670_quirk & RT5670_DMIC3_GPIO5) { 310662306a36Sopenharmony_ci rt5670->dmic3_data_pin = RT5670_DMIC_DATA_GPIO5; 310762306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk DMIC3 on GPIO5 pin\n"); 310862306a36Sopenharmony_ci } 310962306a36Sopenharmony_ci 311062306a36Sopenharmony_ci if (rt5670_quirk & RT5670_JD_MODE1) { 311162306a36Sopenharmony_ci rt5670->jd_mode = 1; 311262306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk JD mode 1\n"); 311362306a36Sopenharmony_ci } 311462306a36Sopenharmony_ci if (rt5670_quirk & RT5670_JD_MODE2) { 311562306a36Sopenharmony_ci rt5670->jd_mode = 2; 311662306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk JD mode 2\n"); 311762306a36Sopenharmony_ci } 311862306a36Sopenharmony_ci if (rt5670_quirk & RT5670_JD_MODE3) { 311962306a36Sopenharmony_ci rt5670->jd_mode = 3; 312062306a36Sopenharmony_ci dev_info(&i2c->dev, "quirk JD mode 3\n"); 312162306a36Sopenharmony_ci } 312262306a36Sopenharmony_ci 312362306a36Sopenharmony_ci /* 312462306a36Sopenharmony_ci * Enable the emulated "DAC1 Playback Switch" by default to avoid 312562306a36Sopenharmony_ci * muting the output with older UCM profiles. 312662306a36Sopenharmony_ci */ 312762306a36Sopenharmony_ci rt5670->dac1_playback_switch_l = true; 312862306a36Sopenharmony_ci rt5670->dac1_playback_switch_r = true; 312962306a36Sopenharmony_ci /* The Power-On-Reset values for the DAC1 mixer have the DAC1 input enabled. */ 313062306a36Sopenharmony_ci rt5670->dac1_mixl_dac1_switch = true; 313162306a36Sopenharmony_ci rt5670->dac1_mixr_dac1_switch = true; 313262306a36Sopenharmony_ci 313362306a36Sopenharmony_ci rt5670->regmap = devm_regmap_init_i2c(i2c, &rt5670_regmap); 313462306a36Sopenharmony_ci if (IS_ERR(rt5670->regmap)) { 313562306a36Sopenharmony_ci ret = PTR_ERR(rt5670->regmap); 313662306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to allocate register map: %d\n", 313762306a36Sopenharmony_ci ret); 313862306a36Sopenharmony_ci return ret; 313962306a36Sopenharmony_ci } 314062306a36Sopenharmony_ci 314162306a36Sopenharmony_ci regmap_read(rt5670->regmap, RT5670_VENDOR_ID2, &val); 314262306a36Sopenharmony_ci if (val != RT5670_DEVICE_ID) { 314362306a36Sopenharmony_ci dev_err(&i2c->dev, 314462306a36Sopenharmony_ci "Device with ID register %#x is not rt5670/72\n", val); 314562306a36Sopenharmony_ci return -ENODEV; 314662306a36Sopenharmony_ci } 314762306a36Sopenharmony_ci 314862306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_RESET, 0); 314962306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1, 315062306a36Sopenharmony_ci RT5670_PWR_HP_L | RT5670_PWR_HP_R | 315162306a36Sopenharmony_ci RT5670_PWR_VREF2, RT5670_PWR_VREF2); 315262306a36Sopenharmony_ci msleep(100); 315362306a36Sopenharmony_ci 315462306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_RESET, 0); 315562306a36Sopenharmony_ci 315662306a36Sopenharmony_ci regmap_read(rt5670->regmap, RT5670_VENDOR_ID, &val); 315762306a36Sopenharmony_ci if (val >= 4) 315862306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_GPIO_CTRL3, 0x0980); 315962306a36Sopenharmony_ci else 316062306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_GPIO_CTRL3, 0x0d00); 316162306a36Sopenharmony_ci 316262306a36Sopenharmony_ci ret = regmap_register_patch(rt5670->regmap, init_list, 316362306a36Sopenharmony_ci ARRAY_SIZE(init_list)); 316462306a36Sopenharmony_ci if (ret != 0) 316562306a36Sopenharmony_ci dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); 316662306a36Sopenharmony_ci 316762306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_DIG_MISC, 316862306a36Sopenharmony_ci RT5670_MCLK_DET, RT5670_MCLK_DET); 316962306a36Sopenharmony_ci 317062306a36Sopenharmony_ci if (rt5670->in2_diff) 317162306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_IN2, 317262306a36Sopenharmony_ci RT5670_IN_DF2, RT5670_IN_DF2); 317362306a36Sopenharmony_ci 317462306a36Sopenharmony_ci if (rt5670->gpio1_is_irq) { 317562306a36Sopenharmony_ci /* for push button */ 317662306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_IL_CMD, 0x0000); 317762306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_IL_CMD2, 0x0010); 317862306a36Sopenharmony_ci regmap_write(rt5670->regmap, RT5670_IL_CMD3, 0x0014); 317962306a36Sopenharmony_ci /* for irq */ 318062306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1, 318162306a36Sopenharmony_ci RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_IRQ); 318262306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2, 318362306a36Sopenharmony_ci RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT); 318462306a36Sopenharmony_ci } 318562306a36Sopenharmony_ci 318662306a36Sopenharmony_ci if (rt5670->gpio1_is_ext_spk_en) { 318762306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1, 318862306a36Sopenharmony_ci RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_GPIO1); 318962306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2, 319062306a36Sopenharmony_ci RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT); 319162306a36Sopenharmony_ci } 319262306a36Sopenharmony_ci 319362306a36Sopenharmony_ci if (rt5670->jd_mode) { 319462306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GLB_CLK, 319562306a36Sopenharmony_ci RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_RCCLK); 319662306a36Sopenharmony_ci rt5670->sysclk = 0; 319762306a36Sopenharmony_ci rt5670->sysclk_src = RT5670_SCLK_S_RCCLK; 319862306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG1, 319962306a36Sopenharmony_ci RT5670_PWR_MB, RT5670_PWR_MB); 320062306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_PWR_ANLG2, 320162306a36Sopenharmony_ci RT5670_PWR_JD1, RT5670_PWR_JD1); 320262306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_IRQ_CTRL1, 320362306a36Sopenharmony_ci RT5670_JD1_1_EN_MASK, RT5670_JD1_1_EN); 320462306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_JD_CTRL3, 320562306a36Sopenharmony_ci RT5670_JD_TRI_CBJ_SEL_MASK | 320662306a36Sopenharmony_ci RT5670_JD_TRI_HPO_SEL_MASK, 320762306a36Sopenharmony_ci RT5670_JD_CBJ_JD1_1 | RT5670_JD_HPO_JD1_1); 320862306a36Sopenharmony_ci switch (rt5670->jd_mode) { 320962306a36Sopenharmony_ci case 1: 321062306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1, 321162306a36Sopenharmony_ci RT5670_JD1_MODE_MASK, 321262306a36Sopenharmony_ci RT5670_JD1_MODE_0); 321362306a36Sopenharmony_ci break; 321462306a36Sopenharmony_ci case 2: 321562306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1, 321662306a36Sopenharmony_ci RT5670_JD1_MODE_MASK, 321762306a36Sopenharmony_ci RT5670_JD1_MODE_1); 321862306a36Sopenharmony_ci break; 321962306a36Sopenharmony_ci case 3: 322062306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_A_JD_CTRL1, 322162306a36Sopenharmony_ci RT5670_JD1_MODE_MASK, 322262306a36Sopenharmony_ci RT5670_JD1_MODE_2); 322362306a36Sopenharmony_ci break; 322462306a36Sopenharmony_ci default: 322562306a36Sopenharmony_ci break; 322662306a36Sopenharmony_ci } 322762306a36Sopenharmony_ci } 322862306a36Sopenharmony_ci 322962306a36Sopenharmony_ci if (rt5670->dmic_en) { 323062306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1, 323162306a36Sopenharmony_ci RT5670_GP2_PIN_MASK, 323262306a36Sopenharmony_ci RT5670_GP2_PIN_DMIC1_SCL); 323362306a36Sopenharmony_ci 323462306a36Sopenharmony_ci switch (rt5670->dmic1_data_pin) { 323562306a36Sopenharmony_ci case RT5670_DMIC_DATA_IN2P: 323662306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1, 323762306a36Sopenharmony_ci RT5670_DMIC_1_DP_MASK, 323862306a36Sopenharmony_ci RT5670_DMIC_1_DP_IN2P); 323962306a36Sopenharmony_ci break; 324062306a36Sopenharmony_ci 324162306a36Sopenharmony_ci case RT5670_DMIC_DATA_GPIO6: 324262306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1, 324362306a36Sopenharmony_ci RT5670_DMIC_1_DP_MASK, 324462306a36Sopenharmony_ci RT5670_DMIC_1_DP_GPIO6); 324562306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1, 324662306a36Sopenharmony_ci RT5670_GP6_PIN_MASK, 324762306a36Sopenharmony_ci RT5670_GP6_PIN_DMIC1_SDA); 324862306a36Sopenharmony_ci break; 324962306a36Sopenharmony_ci 325062306a36Sopenharmony_ci case RT5670_DMIC_DATA_GPIO7: 325162306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1, 325262306a36Sopenharmony_ci RT5670_DMIC_1_DP_MASK, 325362306a36Sopenharmony_ci RT5670_DMIC_1_DP_GPIO7); 325462306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1, 325562306a36Sopenharmony_ci RT5670_GP7_PIN_MASK, 325662306a36Sopenharmony_ci RT5670_GP7_PIN_DMIC1_SDA); 325762306a36Sopenharmony_ci break; 325862306a36Sopenharmony_ci 325962306a36Sopenharmony_ci default: 326062306a36Sopenharmony_ci break; 326162306a36Sopenharmony_ci } 326262306a36Sopenharmony_ci 326362306a36Sopenharmony_ci switch (rt5670->dmic2_data_pin) { 326462306a36Sopenharmony_ci case RT5670_DMIC_DATA_IN3N: 326562306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1, 326662306a36Sopenharmony_ci RT5670_DMIC_2_DP_MASK, 326762306a36Sopenharmony_ci RT5670_DMIC_2_DP_IN3N); 326862306a36Sopenharmony_ci break; 326962306a36Sopenharmony_ci 327062306a36Sopenharmony_ci case RT5670_DMIC_DATA_GPIO8: 327162306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL1, 327262306a36Sopenharmony_ci RT5670_DMIC_2_DP_MASK, 327362306a36Sopenharmony_ci RT5670_DMIC_2_DP_GPIO8); 327462306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1, 327562306a36Sopenharmony_ci RT5670_GP8_PIN_MASK, 327662306a36Sopenharmony_ci RT5670_GP8_PIN_DMIC2_SDA); 327762306a36Sopenharmony_ci break; 327862306a36Sopenharmony_ci 327962306a36Sopenharmony_ci default: 328062306a36Sopenharmony_ci break; 328162306a36Sopenharmony_ci } 328262306a36Sopenharmony_ci 328362306a36Sopenharmony_ci switch (rt5670->dmic3_data_pin) { 328462306a36Sopenharmony_ci case RT5670_DMIC_DATA_GPIO5: 328562306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_DMIC_CTRL2, 328662306a36Sopenharmony_ci RT5670_DMIC_3_DP_MASK, 328762306a36Sopenharmony_ci RT5670_DMIC_3_DP_GPIO5); 328862306a36Sopenharmony_ci regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1, 328962306a36Sopenharmony_ci RT5670_GP5_PIN_MASK, 329062306a36Sopenharmony_ci RT5670_GP5_PIN_DMIC3_SDA); 329162306a36Sopenharmony_ci break; 329262306a36Sopenharmony_ci 329362306a36Sopenharmony_ci case RT5670_DMIC_DATA_GPIO9: 329462306a36Sopenharmony_ci case RT5670_DMIC_DATA_GPIO10: 329562306a36Sopenharmony_ci dev_err(&i2c->dev, 329662306a36Sopenharmony_ci "Always use GPIO5 as DMIC3 data pin\n"); 329762306a36Sopenharmony_ci break; 329862306a36Sopenharmony_ci 329962306a36Sopenharmony_ci default: 330062306a36Sopenharmony_ci break; 330162306a36Sopenharmony_ci } 330262306a36Sopenharmony_ci 330362306a36Sopenharmony_ci } 330462306a36Sopenharmony_ci 330562306a36Sopenharmony_ci pm_runtime_enable(&i2c->dev); 330662306a36Sopenharmony_ci pm_request_idle(&i2c->dev); 330762306a36Sopenharmony_ci 330862306a36Sopenharmony_ci ret = devm_snd_soc_register_component(&i2c->dev, 330962306a36Sopenharmony_ci &soc_component_dev_rt5670, 331062306a36Sopenharmony_ci rt5670_dai, ARRAY_SIZE(rt5670_dai)); 331162306a36Sopenharmony_ci if (ret < 0) 331262306a36Sopenharmony_ci goto err; 331362306a36Sopenharmony_ci 331462306a36Sopenharmony_ci return 0; 331562306a36Sopenharmony_cierr: 331662306a36Sopenharmony_ci pm_runtime_disable(&i2c->dev); 331762306a36Sopenharmony_ci 331862306a36Sopenharmony_ci return ret; 331962306a36Sopenharmony_ci} 332062306a36Sopenharmony_ci 332162306a36Sopenharmony_cistatic void rt5670_i2c_remove(struct i2c_client *i2c) 332262306a36Sopenharmony_ci{ 332362306a36Sopenharmony_ci pm_runtime_disable(&i2c->dev); 332462306a36Sopenharmony_ci} 332562306a36Sopenharmony_ci 332662306a36Sopenharmony_cistatic struct i2c_driver rt5670_i2c_driver = { 332762306a36Sopenharmony_ci .driver = { 332862306a36Sopenharmony_ci .name = "rt5670", 332962306a36Sopenharmony_ci .acpi_match_table = ACPI_PTR(rt5670_acpi_match), 333062306a36Sopenharmony_ci }, 333162306a36Sopenharmony_ci .probe = rt5670_i2c_probe, 333262306a36Sopenharmony_ci .remove = rt5670_i2c_remove, 333362306a36Sopenharmony_ci .id_table = rt5670_i2c_id, 333462306a36Sopenharmony_ci}; 333562306a36Sopenharmony_ci 333662306a36Sopenharmony_cimodule_i2c_driver(rt5670_i2c_driver); 333762306a36Sopenharmony_ci 333862306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT5670 driver"); 333962306a36Sopenharmony_ciMODULE_AUTHOR("Bard Liao <bardliao@realtek.com>"); 334062306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3341