cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

adau1372.c (37387B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Analog Devices ADAU1372 Audio Codec driver
      4 *
      5 * Copyright 2016 Analog Devices Inc.
      6 * Author: Lars-Peter Clausen <lars@metafoo.de>
      7 */
      8
      9#include <linux/clk.h>
     10#include <linux/delay.h>
     11#include <linux/gcd.h>
     12#include <linux/gpio/consumer.h>
     13#include <linux/init.h>
     14#include <linux/module.h>
     15#include <linux/pm.h>
     16#include <linux/slab.h>
     17
     18#include <sound/core.h>
     19#include <sound/pcm.h>
     20#include <sound/pcm_params.h>
     21#include <sound/tlv.h>
     22#include <sound/soc.h>
     23
     24#include "adau1372.h"
     25#include "adau-utils.h"
     26
     27struct adau1372 {
     28	struct clk *clk;
     29	struct regmap *regmap;
     30	void (*switch_mode)(struct device *dev);
     31	bool use_pll;
     32	bool enabled;
     33	bool clock_provider;
     34
     35	struct snd_pcm_hw_constraint_list rate_constraints;
     36	unsigned int slot_width;
     37
     38	struct clk *mclk;
     39	struct gpio_desc *pd_gpio;
     40	struct device *dev;
     41};
     42
     43#define ADAU1372_REG_CLK_CTRL		0x00
     44#define ADAU1372_REG_PLL(x)		(0x01 + (x))
     45#define ADAU1372_REG_DAC_SOURCE		0x11
     46#define ADAU1372_REG_SOUT_SOURCE_0_1	0x13
     47#define ADAU1372_REG_SOUT_SOURCE_2_3	0x14
     48#define ADAU1372_REG_SOUT_SOURCE_4_5	0x15
     49#define ADAU1372_REG_SOUT_SOURCE_6_7	0x16
     50#define ADAU1372_REG_ADC_SDATA_CH	0x17
     51#define ADAU1372_REG_ASRCO_SOURCE_0_1	0x18
     52#define ADAU1372_REG_ASRCO_SOURCE_2_3	0x19
     53#define ADAU1372_REG_ASRC_MODE		0x1a
     54#define ADAU1372_REG_ADC_CTRL0		0x1b
     55#define ADAU1372_REG_ADC_CTRL1		0x1c
     56#define ADAU1372_REG_ADC_CTRL2		0x1d
     57#define ADAU1372_REG_ADC_CTRL3		0x1e
     58#define ADAU1372_REG_ADC_VOL(x)		(0x1f + (x))
     59#define ADAU1372_REG_PGA_CTRL(x)	(0x23 + (x))
     60#define ADAU1372_REG_PGA_BOOST		0x28
     61#define ADAU1372_REG_MICBIAS		0x2d
     62#define ADAU1372_REG_DAC_CTRL		0x2e
     63#define ADAU1372_REG_DAC_VOL(x)		(0x2f + (x))
     64#define ADAU1372_REG_OP_STAGE_MUTE	0x31
     65#define ADAU1372_REG_SAI0		0x32
     66#define ADAU1372_REG_SAI1		0x33
     67#define ADAU1372_REG_SOUT_CTRL		0x34
     68#define ADAU1372_REG_MODE_MP(x)		(0x38 + (x))
     69#define ADAU1372_REG_OP_STAGE_CTRL	0x43
     70#define ADAU1372_REG_DECIM_PWR		0x44
     71#define ADAU1372_REG_INTERP_PWR		0x45
     72#define ADAU1372_REG_BIAS_CTRL0		0x46
     73#define ADAU1372_REG_BIAS_CTRL1		0x47
     74
     75#define ADAU1372_CLK_CTRL_PLL_EN	BIT(7)
     76#define ADAU1372_CLK_CTRL_XTAL_DIS	BIT(4)
     77#define ADAU1372_CLK_CTRL_CLKSRC	BIT(3)
     78#define ADAU1372_CLK_CTRL_CC_MDIV	BIT(1)
     79#define ADAU1372_CLK_CTRL_MCLK_EN	BIT(0)
     80
     81#define ADAU1372_SAI0_DELAY1		(0x0 << 6)
     82#define ADAU1372_SAI0_DELAY0		(0x1 << 6)
     83#define ADAU1372_SAI0_DELAY_MASK	(0x3 << 6)
     84#define ADAU1372_SAI0_SAI_I2S		(0x0 << 4)
     85#define ADAU1372_SAI0_SAI_TDM2		(0x1 << 4)
     86#define ADAU1372_SAI0_SAI_TDM4		(0x2 << 4)
     87#define ADAU1372_SAI0_SAI_TDM8		(0x3 << 4)
     88#define ADAU1372_SAI0_SAI_MASK		(0x3 << 4)
     89#define ADAU1372_SAI0_FS_48		0x0
     90#define ADAU1372_SAI0_FS_8		0x1
     91#define ADAU1372_SAI0_FS_12		0x2
     92#define ADAU1372_SAI0_FS_16		0x3
     93#define ADAU1372_SAI0_FS_24		0x4
     94#define ADAU1372_SAI0_FS_32		0x5
     95#define ADAU1372_SAI0_FS_96		0x6
     96#define ADAU1372_SAI0_FS_192		0x7
     97#define ADAU1372_SAI0_FS_MASK		0xf
     98
     99#define ADAU1372_SAI1_TDM_TS		BIT(7)
    100#define ADAU1372_SAI1_BCLK_TDMC		BIT(6)
    101#define ADAU1372_SAI1_LR_MODE		BIT(5)
    102#define ADAU1372_SAI1_LR_POL		BIT(4)
    103#define ADAU1372_SAI1_BCLKRATE		BIT(2)
    104#define ADAU1372_SAI1_BCLKEDGE		BIT(1)
    105#define ADAU1372_SAI1_MS		BIT(0)
    106
    107static const unsigned int adau1372_rates[] = {
    108	[ADAU1372_SAI0_FS_8] = 8000,
    109	[ADAU1372_SAI0_FS_12] = 12000,
    110	[ADAU1372_SAI0_FS_16] = 16000,
    111	[ADAU1372_SAI0_FS_24] = 24000,
    112	[ADAU1372_SAI0_FS_32] = 32000,
    113	[ADAU1372_SAI0_FS_48] = 48000,
    114	[ADAU1372_SAI0_FS_96] = 96000,
    115	[ADAU1372_SAI0_FS_192] = 192000,
    116};
    117
    118/* 8k, 12k, 24k, 48k */
    119#define ADAU1372_RATE_MASK_TDM8 0x17
    120/* + 16k, 96k */
    121#define ADAU1372_RATE_MASK_TDM4_MASTER (ADAU1372_RATE_MASK_TDM8 | 0x48 | 0x20)
    122/* +32k */
    123#define ADAU1372_RATE_MASK_TDM4 (ADAU1372_RATE_MASK_TDM4_MASTER | 0x20)
    124/* + 192k */
    125#define ADAU1372_RATE_MASK_TDM2 (ADAU1372_RATE_MASK_TDM4 | 0x80)
    126
    127static const DECLARE_TLV_DB_MINMAX(adau1372_digital_tlv, -9563, 0);
    128static const DECLARE_TLV_DB_SCALE(adau1372_pga_tlv, -1200, 75, 0);
    129static const DECLARE_TLV_DB_SCALE(adau1372_pga_boost_tlv, 0, 1000, 0);
    130
    131static const char * const adau1372_bias_text[] = {
    132	"Normal operation", "Extreme power saving", "Enhanced performance",
    133	"Power saving",
    134};
    135
    136static const unsigned int adau1372_bias_adc_values[] = {
    137	0, 2, 3,
    138};
    139
    140static const char * const adau1372_bias_adc_text[] = {
    141	"Normal operation", "Enhanced performance", "Power saving",
    142};
    143
    144static const char * const adau1372_bias_dac_text[] = {
    145	"Normal operation", "Power saving", "Superior performance",
    146	"Enhanced performance",
    147};
    148
    149static SOC_ENUM_SINGLE_DECL(adau1372_bias_hp_enum,
    150	ADAU1372_REG_BIAS_CTRL0, 6, adau1372_bias_text);
    151static SOC_ENUM_SINGLE_DECL(adau1372_bias_afe0_1_enum,
    152	ADAU1372_REG_BIAS_CTRL0, 4, adau1372_bias_text);
    153static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_bias_adc2_3_enum,
    154	ADAU1372_REG_BIAS_CTRL0, 2, 0x3, adau1372_bias_adc_text,
    155	adau1372_bias_adc_values);
    156static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_bias_adc0_1_enum,
    157	ADAU1372_REG_BIAS_CTRL0, 0, 0x3, adau1372_bias_adc_text,
    158	adau1372_bias_adc_values);
    159static SOC_ENUM_SINGLE_DECL(adau1372_bias_afe2_3_enum,
    160	ADAU1372_REG_BIAS_CTRL1, 4, adau1372_bias_text);
    161static SOC_ENUM_SINGLE_DECL(adau1372_bias_mic_enum,
    162	ADAU1372_REG_BIAS_CTRL1, 2, adau1372_bias_text);
    163static SOC_ENUM_SINGLE_DECL(adau1372_bias_dac_enum,
    164	ADAU1372_REG_BIAS_CTRL1, 0, adau1372_bias_dac_text);
    165
    166static const char * const adau1372_hpf_text[] = {
    167	"Off",
    168	"1 Hz",
    169	"4 Hz",
    170	"8 Hz",
    171};
    172
    173static SOC_ENUM_SINGLE_DECL(adau1372_hpf0_1_enum, ADAU1372_REG_ADC_CTRL2, 5,
    174			    adau1372_hpf_text);
    175static SOC_ENUM_SINGLE_DECL(adau1372_hpf2_3_enum, ADAU1372_REG_ADC_CTRL3, 5,
    176			    adau1372_hpf_text);
    177static const struct snd_kcontrol_new adau1372_controls[] = {
    178	SOC_SINGLE_TLV("ADC 0 Capture Volume", ADAU1372_REG_ADC_VOL(0),
    179		       0, 0xff, 1, adau1372_digital_tlv),
    180	SOC_SINGLE_TLV("ADC 1 Capture Volume", ADAU1372_REG_ADC_VOL(1),
    181		       0, 0xff, 1, adau1372_digital_tlv),
    182	SOC_SINGLE_TLV("ADC 2 Capture Volume", ADAU1372_REG_ADC_VOL(2),
    183		       0, 0xff, 1, adau1372_digital_tlv),
    184	SOC_SINGLE_TLV("ADC 3 Capture Volume", ADAU1372_REG_ADC_VOL(3),
    185		       0, 0xff, 1, adau1372_digital_tlv),
    186	SOC_SINGLE("ADC 0 Capture Switch", ADAU1372_REG_ADC_CTRL0, 3, 1, 1),
    187	SOC_SINGLE("ADC 1 Capture Switch", ADAU1372_REG_ADC_CTRL0, 4, 1, 1),
    188	SOC_SINGLE("ADC 2 Capture Switch", ADAU1372_REG_ADC_CTRL1, 3, 1, 1),
    189	SOC_SINGLE("ADC 3 Capture Switch", ADAU1372_REG_ADC_CTRL1, 4, 1, 1),
    190
    191	SOC_ENUM("ADC 0+1 High-Pass-Filter", adau1372_hpf0_1_enum),
    192	SOC_ENUM("ADC 2+3 High-Pass-Filter", adau1372_hpf2_3_enum),
    193
    194	SOC_SINGLE_TLV("PGA 0 Capture Volume", ADAU1372_REG_PGA_CTRL(0),
    195		       0, 0x3f, 0, adau1372_pga_tlv),
    196	SOC_SINGLE_TLV("PGA 1 Capture Volume", ADAU1372_REG_PGA_CTRL(1),
    197		       0, 0x3f, 0, adau1372_pga_tlv),
    198	SOC_SINGLE_TLV("PGA 2 Capture Volume", ADAU1372_REG_PGA_CTRL(2),
    199		       0, 0x3f, 0, adau1372_pga_tlv),
    200	SOC_SINGLE_TLV("PGA 3 Capture Volume", ADAU1372_REG_PGA_CTRL(3),
    201		       0, 0x3f, 0, adau1372_pga_tlv),
    202	SOC_SINGLE_TLV("PGA 0 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
    203		       0, 1, 0, adau1372_pga_boost_tlv),
    204	SOC_SINGLE_TLV("PGA 1 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
    205		       1, 1, 0, adau1372_pga_boost_tlv),
    206	SOC_SINGLE_TLV("PGA 2 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
    207		       2, 1, 0, adau1372_pga_boost_tlv),
    208	SOC_SINGLE_TLV("PGA 3 Boost Capture Volume", ADAU1372_REG_PGA_BOOST,
    209		       3, 1, 0, adau1372_pga_boost_tlv),
    210	SOC_SINGLE("PGA 0 Capture Switch", ADAU1372_REG_PGA_CTRL(0), 7, 1, 1),
    211	SOC_SINGLE("PGA 1 Capture Switch", ADAU1372_REG_PGA_CTRL(1), 7, 1, 1),
    212	SOC_SINGLE("PGA 2 Capture Switch", ADAU1372_REG_PGA_CTRL(2), 7, 1, 1),
    213	SOC_SINGLE("PGA 3 Capture Switch", ADAU1372_REG_PGA_CTRL(3), 7, 1, 1),
    214
    215	SOC_SINGLE_TLV("DAC 0 Playback Volume", ADAU1372_REG_DAC_VOL(0),
    216		       0, 0xff, 1, adau1372_digital_tlv),
    217	SOC_SINGLE_TLV("DAC 1 Playback Volume", ADAU1372_REG_DAC_VOL(1),
    218		       0, 0xff, 1, adau1372_digital_tlv),
    219	SOC_SINGLE("DAC 0 Playback Switch", ADAU1372_REG_DAC_CTRL, 3, 1, 1),
    220	SOC_SINGLE("DAC 1 Playback Switch", ADAU1372_REG_DAC_CTRL, 4, 1, 1),
    221
    222	SOC_ENUM("Headphone Bias", adau1372_bias_hp_enum),
    223	SOC_ENUM("Microphone Bias", adau1372_bias_mic_enum),
    224	SOC_ENUM("AFE 0+1 Bias", adau1372_bias_afe0_1_enum),
    225	SOC_ENUM("AFE 2+3 Bias", adau1372_bias_afe2_3_enum),
    226	SOC_ENUM("ADC 0+1 Bias", adau1372_bias_adc0_1_enum),
    227	SOC_ENUM("ADC 2+3 Bias", adau1372_bias_adc2_3_enum),
    228	SOC_ENUM("DAC 0+1 Bias", adau1372_bias_dac_enum),
    229};
    230
    231static const char * const adau1372_decimator_mux_text[] = {
    232	"ADC",
    233	"DMIC",
    234};
    235
    236static SOC_ENUM_SINGLE_DECL(adau1372_decimator0_1_mux_enum, ADAU1372_REG_ADC_CTRL2,
    237			    2, adau1372_decimator_mux_text);
    238
    239static const struct snd_kcontrol_new adau1372_decimator0_1_mux_control =
    240	SOC_DAPM_ENUM("Decimator 0+1 Capture Mux", adau1372_decimator0_1_mux_enum);
    241
    242static SOC_ENUM_SINGLE_DECL(adau1372_decimator2_3_mux_enum, ADAU1372_REG_ADC_CTRL3,
    243			    2, adau1372_decimator_mux_text);
    244
    245static const struct snd_kcontrol_new adau1372_decimator2_3_mux_control =
    246	SOC_DAPM_ENUM("Decimator 2+3 Capture Mux", adau1372_decimator2_3_mux_enum);
    247
    248static const unsigned int adau1372_asrco_mux_values[] = {
    249	4, 5, 6, 7,
    250};
    251
    252static const char * const adau1372_asrco_mux_text[] = {
    253	"Decimator0",
    254	"Decimator1",
    255	"Decimator2",
    256	"Decimator3",
    257};
    258
    259static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco0_mux_enum, ADAU1372_REG_ASRCO_SOURCE_0_1,
    260				  0, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
    261static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco1_mux_enum, ADAU1372_REG_ASRCO_SOURCE_0_1,
    262				  4, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
    263static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco2_mux_enum, ADAU1372_REG_ASRCO_SOURCE_2_3,
    264				  0, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
    265static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_asrco3_mux_enum, ADAU1372_REG_ASRCO_SOURCE_2_3,
    266				  4, 0xf, adau1372_asrco_mux_text, adau1372_asrco_mux_values);
    267
    268static const struct snd_kcontrol_new adau1372_asrco0_mux_control =
    269	SOC_DAPM_ENUM("Output ASRC0 Capture Mux", adau1372_asrco0_mux_enum);
    270static const struct snd_kcontrol_new adau1372_asrco1_mux_control =
    271	SOC_DAPM_ENUM("Output ASRC1 Capture Mux", adau1372_asrco1_mux_enum);
    272static const struct snd_kcontrol_new adau1372_asrco2_mux_control =
    273	SOC_DAPM_ENUM("Output ASRC2 Capture Mux", adau1372_asrco2_mux_enum);
    274static const struct snd_kcontrol_new adau1372_asrco3_mux_control =
    275	SOC_DAPM_ENUM("Output ASRC3 Capture Mux", adau1372_asrco3_mux_enum);
    276
    277static const unsigned int adau1372_sout_mux_values[] = {
    278	4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
    279};
    280
    281static const char * const adau1372_sout_mux_text[] = {
    282	"Output ASRC0",
    283	"Output ASRC1",
    284	"Output ASRC2",
    285	"Output ASRC3",
    286	"Serial Input 0",
    287	"Serial Input 1",
    288	"Serial Input 2",
    289	"Serial Input 3",
    290	"Serial Input 4",
    291	"Serial Input 5",
    292	"Serial Input 6",
    293	"Serial Input 7",
    294};
    295
    296static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout0_mux_enum, ADAU1372_REG_SOUT_SOURCE_0_1,
    297				  0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    298static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout1_mux_enum, ADAU1372_REG_SOUT_SOURCE_0_1,
    299				  4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    300static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout2_mux_enum, ADAU1372_REG_SOUT_SOURCE_2_3,
    301				  0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    302static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout3_mux_enum, ADAU1372_REG_SOUT_SOURCE_2_3,
    303				  4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    304static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout4_mux_enum, ADAU1372_REG_SOUT_SOURCE_4_5,
    305				  0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    306static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout5_mux_enum, ADAU1372_REG_SOUT_SOURCE_4_5,
    307				  4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    308static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout6_mux_enum, ADAU1372_REG_SOUT_SOURCE_6_7,
    309				  0, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    310static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_sout7_mux_enum, ADAU1372_REG_SOUT_SOURCE_6_7,
    311				  4, 0xf, adau1372_sout_mux_text, adau1372_sout_mux_values);
    312
    313static const struct snd_kcontrol_new adau1372_sout0_mux_control =
    314	SOC_DAPM_ENUM("Serial Output 0 Capture Mux", adau1372_sout0_mux_enum);
    315static const struct snd_kcontrol_new adau1372_sout1_mux_control =
    316	SOC_DAPM_ENUM("Serial Output 1 Capture Mux", adau1372_sout1_mux_enum);
    317static const struct snd_kcontrol_new adau1372_sout2_mux_control =
    318	SOC_DAPM_ENUM("Serial Output 2 Capture Mux", adau1372_sout2_mux_enum);
    319static const struct snd_kcontrol_new adau1372_sout3_mux_control =
    320	SOC_DAPM_ENUM("Serial Output 3 Capture Mux", adau1372_sout3_mux_enum);
    321static const struct snd_kcontrol_new adau1372_sout4_mux_control =
    322	SOC_DAPM_ENUM("Serial Output 4 Capture Mux", adau1372_sout4_mux_enum);
    323static const struct snd_kcontrol_new adau1372_sout5_mux_control =
    324	SOC_DAPM_ENUM("Serial Output 5 Capture Mux", adau1372_sout5_mux_enum);
    325static const struct snd_kcontrol_new adau1372_sout6_mux_control =
    326	SOC_DAPM_ENUM("Serial Output 6 Capture Mux", adau1372_sout6_mux_enum);
    327static const struct snd_kcontrol_new adau1372_sout7_mux_control =
    328	SOC_DAPM_ENUM("Serial Output 7 Capture Mux", adau1372_sout7_mux_enum);
    329
    330static const char * const adau1372_asrci_mux_text[] = {
    331	"Serial Input 0+1",
    332	"Serial Input 2+3",
    333	"Serial Input 4+5",
    334	"Serial Input 6+7",
    335};
    336
    337static SOC_ENUM_SINGLE_DECL(adau1372_asrci_mux_enum,
    338	ADAU1372_REG_ASRC_MODE, 2, adau1372_asrci_mux_text);
    339
    340static const struct snd_kcontrol_new adau1372_asrci_mux_control =
    341	SOC_DAPM_ENUM("Input ASRC Playback Mux", adau1372_asrci_mux_enum);
    342
    343static const unsigned int adau1372_dac_mux_values[] = {
    344	12, 13
    345};
    346
    347static const char * const adau1372_dac_mux_text[] = {
    348	"Input ASRC0",
    349	"Input ASRC1",
    350};
    351
    352static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_dac0_mux_enum, ADAU1372_REG_DAC_SOURCE,
    353				  0, 0xf, adau1372_dac_mux_text, adau1372_dac_mux_values);
    354static SOC_VALUE_ENUM_SINGLE_DECL(adau1372_dac1_mux_enum, ADAU1372_REG_DAC_SOURCE,
    355				  4, 0xf, adau1372_dac_mux_text, adau1372_dac_mux_values);
    356
    357static const struct snd_kcontrol_new adau1372_dac0_mux_control =
    358	SOC_DAPM_ENUM("DAC 0 Playback Mux", adau1372_dac0_mux_enum);
    359static const struct snd_kcontrol_new adau1372_dac1_mux_control =
    360	SOC_DAPM_ENUM("DAC 1 Playback Mux", adau1372_dac1_mux_enum);
    361
    362static const struct snd_soc_dapm_widget adau1372_dapm_widgets[] = {
    363	SND_SOC_DAPM_INPUT("AIN0"),
    364	SND_SOC_DAPM_INPUT("AIN1"),
    365	SND_SOC_DAPM_INPUT("AIN2"),
    366	SND_SOC_DAPM_INPUT("AIN3"),
    367	SND_SOC_DAPM_INPUT("DMIC0_1"),
    368	SND_SOC_DAPM_INPUT("DMIC2_3"),
    369
    370	SND_SOC_DAPM_SUPPLY("MICBIAS0", ADAU1372_REG_MICBIAS, 4, 0, NULL, 0),
    371	SND_SOC_DAPM_SUPPLY("MICBIAS1", ADAU1372_REG_MICBIAS, 5, 0, NULL, 0),
    372
    373	SND_SOC_DAPM_PGA("PGA0", ADAU1372_REG_PGA_CTRL(0), 6, 0, NULL, 0),
    374	SND_SOC_DAPM_PGA("PGA1", ADAU1372_REG_PGA_CTRL(1), 6, 0, NULL, 0),
    375	SND_SOC_DAPM_PGA("PGA2", ADAU1372_REG_PGA_CTRL(2), 6, 0, NULL, 0),
    376	SND_SOC_DAPM_PGA("PGA3", ADAU1372_REG_PGA_CTRL(3), 6, 0, NULL, 0),
    377	SND_SOC_DAPM_ADC("ADC0", NULL, ADAU1372_REG_ADC_CTRL2, 0, 0),
    378	SND_SOC_DAPM_ADC("ADC1", NULL, ADAU1372_REG_ADC_CTRL2, 1, 0),
    379	SND_SOC_DAPM_ADC("ADC2", NULL, ADAU1372_REG_ADC_CTRL3, 0, 0),
    380	SND_SOC_DAPM_ADC("ADC3", NULL, ADAU1372_REG_ADC_CTRL3, 1, 0),
    381
    382	SND_SOC_DAPM_SUPPLY("ADC0 Filter", ADAU1372_REG_DECIM_PWR, 0, 0, NULL, 0),
    383	SND_SOC_DAPM_SUPPLY("ADC1 Filter", ADAU1372_REG_DECIM_PWR, 1, 0, NULL, 0),
    384	SND_SOC_DAPM_SUPPLY("ADC2 Filter", ADAU1372_REG_DECIM_PWR, 2, 0, NULL, 0),
    385	SND_SOC_DAPM_SUPPLY("ADC3 Filter", ADAU1372_REG_DECIM_PWR, 3, 0, NULL, 0),
    386	SND_SOC_DAPM_SUPPLY("Output ASRC0 Decimator", ADAU1372_REG_DECIM_PWR, 4, 0, NULL, 0),
    387	SND_SOC_DAPM_SUPPLY("Output ASRC1 Decimator", ADAU1372_REG_DECIM_PWR, 5, 0, NULL, 0),
    388	SND_SOC_DAPM_SUPPLY("Output ASRC2 Decimator", ADAU1372_REG_DECIM_PWR, 6, 0, NULL, 0),
    389	SND_SOC_DAPM_SUPPLY("Output ASRC3 Decimator", ADAU1372_REG_DECIM_PWR, 7, 0, NULL, 0),
    390
    391	SND_SOC_DAPM_MUX("Decimator0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator0_1_mux_control),
    392	SND_SOC_DAPM_MUX("Decimator1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator0_1_mux_control),
    393	SND_SOC_DAPM_MUX("Decimator2 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator2_3_mux_control),
    394	SND_SOC_DAPM_MUX("Decimator3 Mux", SND_SOC_NOPM, 0, 0, &adau1372_decimator2_3_mux_control),
    395
    396	SND_SOC_DAPM_MUX("Output ASRC0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco0_mux_control),
    397	SND_SOC_DAPM_MUX("Output ASRC1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco1_mux_control),
    398	SND_SOC_DAPM_MUX("Output ASRC2 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco2_mux_control),
    399	SND_SOC_DAPM_MUX("Output ASRC3 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrco3_mux_control),
    400	SND_SOC_DAPM_MUX("Serial Output 0 Capture Mux", SND_SOC_NOPM, 0, 0,
    401			 &adau1372_sout0_mux_control),
    402	SND_SOC_DAPM_MUX("Serial Output 1 Capture Mux", SND_SOC_NOPM, 0, 0,
    403			 &adau1372_sout1_mux_control),
    404	SND_SOC_DAPM_MUX("Serial Output 2 Capture Mux", SND_SOC_NOPM, 0, 0,
    405			 &adau1372_sout2_mux_control),
    406	SND_SOC_DAPM_MUX("Serial Output 3 Capture Mux", SND_SOC_NOPM, 0, 0,
    407			 &adau1372_sout3_mux_control),
    408	SND_SOC_DAPM_MUX("Serial Output 4 Capture Mux", SND_SOC_NOPM, 0, 0,
    409			 &adau1372_sout4_mux_control),
    410	SND_SOC_DAPM_MUX("Serial Output 5 Capture Mux", SND_SOC_NOPM, 0, 0,
    411			 &adau1372_sout5_mux_control),
    412	SND_SOC_DAPM_MUX("Serial Output 6 Capture Mux", SND_SOC_NOPM, 0, 0,
    413			 &adau1372_sout6_mux_control),
    414	SND_SOC_DAPM_MUX("Serial Output 7 Capture Mux", SND_SOC_NOPM, 0, 0,
    415			 &adau1372_sout7_mux_control),
    416
    417	SND_SOC_DAPM_AIF_IN("Serial Input 0", NULL, 0, SND_SOC_NOPM, 0, 0),
    418	SND_SOC_DAPM_AIF_IN("Serial Input 1", NULL, 1, SND_SOC_NOPM, 0, 0),
    419	SND_SOC_DAPM_AIF_IN("Serial Input 2", NULL, 2, SND_SOC_NOPM, 0, 0),
    420	SND_SOC_DAPM_AIF_IN("Serial Input 3", NULL, 3, SND_SOC_NOPM, 0, 0),
    421	SND_SOC_DAPM_AIF_IN("Serial Input 4", NULL, 4, SND_SOC_NOPM, 0, 0),
    422	SND_SOC_DAPM_AIF_IN("Serial Input 5", NULL, 5, SND_SOC_NOPM, 0, 0),
    423	SND_SOC_DAPM_AIF_IN("Serial Input 6", NULL, 6, SND_SOC_NOPM, 0, 0),
    424	SND_SOC_DAPM_AIF_IN("Serial Input 7", NULL, 7, SND_SOC_NOPM, 0, 0),
    425
    426	SND_SOC_DAPM_AIF_OUT("Serial Output 0", NULL, 0, SND_SOC_NOPM, 0, 0),
    427	SND_SOC_DAPM_AIF_OUT("Serial Output 1", NULL, 1, SND_SOC_NOPM, 0, 0),
    428	SND_SOC_DAPM_AIF_OUT("Serial Output 2", NULL, 2, SND_SOC_NOPM, 0, 0),
    429	SND_SOC_DAPM_AIF_OUT("Serial Output 3", NULL, 3, SND_SOC_NOPM, 0, 0),
    430	SND_SOC_DAPM_AIF_OUT("Serial Output 4", NULL, 4, SND_SOC_NOPM, 0, 0),
    431	SND_SOC_DAPM_AIF_OUT("Serial Output 5", NULL, 5, SND_SOC_NOPM, 0, 0),
    432	SND_SOC_DAPM_AIF_OUT("Serial Output 6", NULL, 6, SND_SOC_NOPM, 0, 0),
    433	SND_SOC_DAPM_AIF_OUT("Serial Output 7", NULL, 7, SND_SOC_NOPM, 0, 0),
    434
    435	SND_SOC_DAPM_SUPPLY("Output ASRC Supply", ADAU1372_REG_ASRC_MODE, 1, 0, NULL, 0),
    436	SND_SOC_DAPM_SUPPLY("Input ASRC Supply", ADAU1372_REG_ASRC_MODE, 0, 0, NULL, 0),
    437
    438	SND_SOC_DAPM_SUPPLY("DAC1 Modulator", ADAU1372_REG_INTERP_PWR, 3, 0, NULL, 0),
    439	SND_SOC_DAPM_SUPPLY("DAC0 Modulator", ADAU1372_REG_INTERP_PWR, 2, 0, NULL, 0),
    440	SND_SOC_DAPM_SUPPLY("Input ASRC1 Interpolator", ADAU1372_REG_INTERP_PWR, 1, 0, NULL, 0),
    441	SND_SOC_DAPM_SUPPLY("Input ASRC0 Interpolator", ADAU1372_REG_INTERP_PWR, 0, 0, NULL, 0),
    442
    443	SND_SOC_DAPM_MUX("Input ASRC0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrci_mux_control),
    444	SND_SOC_DAPM_MUX("Input ASRC1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_asrci_mux_control),
    445
    446	SND_SOC_DAPM_MUX("DAC 0 Mux", SND_SOC_NOPM, 0, 0, &adau1372_dac0_mux_control),
    447	SND_SOC_DAPM_MUX("DAC 1 Mux", SND_SOC_NOPM, 0, 0, &adau1372_dac1_mux_control),
    448
    449	SND_SOC_DAPM_DAC("DAC0", NULL, ADAU1372_REG_DAC_CTRL, 0, 0),
    450	SND_SOC_DAPM_DAC("DAC1", NULL, ADAU1372_REG_DAC_CTRL, 1, 0),
    451
    452	SND_SOC_DAPM_OUT_DRV("OP_STAGE_LP", ADAU1372_REG_OP_STAGE_CTRL, 0, 1, NULL, 0),
    453	SND_SOC_DAPM_OUT_DRV("OP_STAGE_LN", ADAU1372_REG_OP_STAGE_CTRL, 1, 1, NULL, 0),
    454	SND_SOC_DAPM_OUT_DRV("OP_STAGE_RP", ADAU1372_REG_OP_STAGE_CTRL, 2, 1, NULL, 0),
    455	SND_SOC_DAPM_OUT_DRV("OP_STAGE_RN", ADAU1372_REG_OP_STAGE_CTRL, 3, 1, NULL, 0),
    456
    457	SND_SOC_DAPM_OUTPUT("HPOUTL"),
    458	SND_SOC_DAPM_OUTPUT("HPOUTR"),
    459};
    460
    461#define ADAU1372_SOUT_ROUTES(x) \
    462	{ "Serial Output " #x " Capture Mux", "Output ASRC0", "Output ASRC0 Mux" }, \
    463	{ "Serial Output " #x " Capture Mux", "Output ASRC1", "Output ASRC1 Mux" }, \
    464	{ "Serial Output " #x " Capture Mux", "Output ASRC2", "Output ASRC2 Mux" }, \
    465	{ "Serial Output " #x " Capture Mux", "Output ASRC3", "Output ASRC3 Mux" }, \
    466	{ "Serial Output " #x " Capture Mux", "Serial Input 0", "Serial Input 0" }, \
    467	{ "Serial Output " #x " Capture Mux", "Serial Input 1", "Serial Input 1" }, \
    468	{ "Serial Output " #x " Capture Mux", "Serial Input 2", "Serial Input 2" }, \
    469	{ "Serial Output " #x " Capture Mux", "Serial Input 3", "Serial Input 3" }, \
    470	{ "Serial Output " #x " Capture Mux", "Serial Input 4", "Serial Input 4" }, \
    471	{ "Serial Output " #x " Capture Mux", "Serial Input 5", "Serial Input 5" }, \
    472	{ "Serial Output " #x " Capture Mux", "Serial Input 6", "Serial Input 6" }, \
    473	{ "Serial Output " #x " Capture Mux", "Serial Input 7", "Serial Input 7" }, \
    474	{ "Serial Output " #x, NULL, "Serial Output " #x " Capture Mux" }, \
    475	{ "Capture", NULL, "Serial Output " #x }
    476
    477#define ADAU1372_ASRCO_ROUTES(x) \
    478	{ "Output ASRC" #x " Mux", "Decimator0", "Decimator0 Mux" }, \
    479	{ "Output ASRC" #x " Mux", "Decimator1", "Decimator1 Mux" }, \
    480	{ "Output ASRC" #x " Mux", "Decimator2", "Decimator2 Mux" }, \
    481	{ "Output ASRC" #x " Mux", "Decimator3", "Decimator3 Mux" }
    482
    483static const struct snd_soc_dapm_route adau1372_dapm_routes[] = {
    484	{ "PGA0", NULL, "AIN0" },
    485	{ "PGA1", NULL, "AIN1" },
    486	{ "PGA2", NULL, "AIN2" },
    487	{ "PGA3", NULL, "AIN3" },
    488
    489	{ "ADC0", NULL, "PGA0" },
    490	{ "ADC1", NULL, "PGA1" },
    491	{ "ADC2", NULL, "PGA2" },
    492	{ "ADC3", NULL, "PGA3" },
    493
    494	{ "Decimator0 Mux", "ADC", "ADC0" },
    495	{ "Decimator1 Mux", "ADC", "ADC1" },
    496	{ "Decimator2 Mux", "ADC", "ADC2" },
    497	{ "Decimator3 Mux", "ADC", "ADC3" },
    498
    499	{ "Decimator0 Mux", "DMIC", "DMIC0_1" },
    500	{ "Decimator1 Mux", "DMIC", "DMIC0_1" },
    501	{ "Decimator2 Mux", "DMIC", "DMIC2_3" },
    502	{ "Decimator3 Mux", "DMIC", "DMIC2_3" },
    503
    504	{ "Decimator0 Mux", NULL, "ADC0 Filter" },
    505	{ "Decimator1 Mux", NULL, "ADC1 Filter" },
    506	{ "Decimator2 Mux", NULL, "ADC2 Filter" },
    507	{ "Decimator3 Mux", NULL, "ADC3 Filter" },
    508
    509	{ "Output ASRC0 Mux", NULL, "Output ASRC Supply" },
    510	{ "Output ASRC1 Mux", NULL, "Output ASRC Supply" },
    511	{ "Output ASRC2 Mux", NULL, "Output ASRC Supply" },
    512	{ "Output ASRC3 Mux", NULL, "Output ASRC Supply" },
    513	{ "Output ASRC0 Mux", NULL, "Output ASRC0 Decimator" },
    514	{ "Output ASRC1 Mux", NULL, "Output ASRC1 Decimator" },
    515	{ "Output ASRC2 Mux", NULL, "Output ASRC2 Decimator" },
    516	{ "Output ASRC3 Mux", NULL, "Output ASRC3 Decimator" },
    517
    518	ADAU1372_ASRCO_ROUTES(0),
    519	ADAU1372_ASRCO_ROUTES(1),
    520	ADAU1372_ASRCO_ROUTES(2),
    521	ADAU1372_ASRCO_ROUTES(3),
    522
    523	ADAU1372_SOUT_ROUTES(0),
    524	ADAU1372_SOUT_ROUTES(1),
    525	ADAU1372_SOUT_ROUTES(2),
    526	ADAU1372_SOUT_ROUTES(3),
    527	ADAU1372_SOUT_ROUTES(4),
    528	ADAU1372_SOUT_ROUTES(5),
    529	ADAU1372_SOUT_ROUTES(6),
    530	ADAU1372_SOUT_ROUTES(7),
    531
    532	{ "Serial Input 0", NULL, "Playback" },
    533	{ "Serial Input 1", NULL, "Playback" },
    534	{ "Serial Input 2", NULL, "Playback" },
    535	{ "Serial Input 3", NULL, "Playback" },
    536	{ "Serial Input 4", NULL, "Playback" },
    537	{ "Serial Input 5", NULL, "Playback" },
    538	{ "Serial Input 6", NULL, "Playback" },
    539	{ "Serial Input 7", NULL, "Playback" },
    540
    541	{ "Input ASRC0 Mux", "Serial Input 0+1", "Serial Input 0" },
    542	{ "Input ASRC1 Mux", "Serial Input 0+1", "Serial Input 1" },
    543	{ "Input ASRC0 Mux", "Serial Input 2+3", "Serial Input 2" },
    544	{ "Input ASRC1 Mux", "Serial Input 2+3", "Serial Input 3" },
    545	{ "Input ASRC0 Mux", "Serial Input 4+5", "Serial Input 4" },
    546	{ "Input ASRC1 Mux", "Serial Input 4+5", "Serial Input 5" },
    547	{ "Input ASRC0 Mux", "Serial Input 6+7", "Serial Input 6" },
    548	{ "Input ASRC1 Mux", "Serial Input 6+7", "Serial Input 7" },
    549	{ "Input ASRC0 Mux", NULL, "Input ASRC Supply" },
    550	{ "Input ASRC1 Mux", NULL, "Input ASRC Supply" },
    551	{ "Input ASRC0 Mux", NULL, "Input ASRC0 Interpolator" },
    552	{ "Input ASRC1 Mux", NULL, "Input ASRC1 Interpolator" },
    553
    554	{ "DAC 0 Mux", "Input ASRC0", "Input ASRC0 Mux" },
    555	{ "DAC 0 Mux", "Input ASRC1", "Input ASRC1 Mux" },
    556	{ "DAC 1 Mux", "Input ASRC0", "Input ASRC0 Mux" },
    557	{ "DAC 1 Mux", "Input ASRC1", "Input ASRC1 Mux" },
    558
    559	{ "DAC0", NULL, "DAC 0 Mux" },
    560	{ "DAC1", NULL, "DAC 1 Mux" },
    561	{ "DAC0", NULL, "DAC0 Modulator" },
    562	{ "DAC1", NULL, "DAC1 Modulator" },
    563
    564	{ "OP_STAGE_LP", NULL, "DAC0" },
    565	{ "OP_STAGE_LN", NULL, "DAC0" },
    566	{ "OP_STAGE_RP", NULL, "DAC1" },
    567	{ "OP_STAGE_RN", NULL, "DAC1" },
    568
    569	{ "HPOUTL", NULL, "OP_STAGE_LP" },
    570	{ "HPOUTL", NULL, "OP_STAGE_LN" },
    571	{ "HPOUTR", NULL, "OP_STAGE_RP" },
    572	{ "HPOUTR", NULL, "OP_STAGE_RN" },
    573};
    574
    575static int adau1372_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
    576{
    577	struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
    578	unsigned int sai0 = 0, sai1 = 0;
    579	bool invert_lrclk = false;
    580
    581	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
    582	case SND_SOC_DAIFMT_CBP_CFP:
    583		adau1372->clock_provider = true;
    584		sai1 |= ADAU1372_SAI1_MS;
    585		break;
    586	case SND_SOC_DAIFMT_CBC_CFC:
    587		adau1372->clock_provider = false;
    588		break;
    589	default:
    590		return -EINVAL;
    591	}
    592
    593	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
    594	case SND_SOC_DAIFMT_NB_NF:
    595		invert_lrclk = false;
    596		break;
    597	case SND_SOC_DAIFMT_NB_IF:
    598		invert_lrclk = true;
    599		break;
    600	case SND_SOC_DAIFMT_IB_NF:
    601		invert_lrclk = false;
    602		sai1 |= ADAU1372_SAI1_BCLKEDGE;
    603		break;
    604	case SND_SOC_DAIFMT_IB_IF:
    605		invert_lrclk = true;
    606		sai1 |= ADAU1372_SAI1_BCLKEDGE;
    607		break;
    608	}
    609
    610	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
    611	case SND_SOC_DAIFMT_I2S:
    612		sai0 |= ADAU1372_SAI0_DELAY1;
    613		break;
    614	case SND_SOC_DAIFMT_LEFT_J:
    615		sai0 |= ADAU1372_SAI0_DELAY0;
    616		invert_lrclk = !invert_lrclk;
    617		break;
    618	case SND_SOC_DAIFMT_DSP_A:
    619		sai0 |= ADAU1372_SAI0_DELAY1;
    620		sai1 |= ADAU1372_SAI1_LR_MODE;
    621		break;
    622	case SND_SOC_DAIFMT_DSP_B:
    623		sai0 |= ADAU1372_SAI0_DELAY0;
    624		sai1 |= ADAU1372_SAI1_LR_MODE;
    625		break;
    626	}
    627
    628	if (invert_lrclk)
    629		sai1 |= ADAU1372_SAI1_LR_POL;
    630
    631	regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0, ADAU1372_SAI0_DELAY_MASK, sai0);
    632	regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1,
    633			   ADAU1372_SAI1_MS | ADAU1372_SAI1_BCLKEDGE |
    634			   ADAU1372_SAI1_LR_MODE | ADAU1372_SAI1_LR_POL, sai1);
    635
    636	return 0;
    637}
    638
    639static int adau1372_hw_params(struct snd_pcm_substream *substream,
    640			      struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
    641{
    642	struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
    643	unsigned int rate = params_rate(params);
    644	unsigned int slot_width;
    645	unsigned int sai0, sai1;
    646	unsigned int i;
    647
    648	for (i = 0; i < ARRAY_SIZE(adau1372_rates); i++) {
    649		if (rate == adau1372_rates[i])
    650			break;
    651	}
    652
    653	if (i == ARRAY_SIZE(adau1372_rates))
    654		return -EINVAL;
    655
    656	sai0 = i;
    657
    658	slot_width = adau1372->slot_width;
    659	if (slot_width == 0)
    660		slot_width = params_width(params);
    661
    662	switch (slot_width) {
    663	case 16:
    664		sai1 = ADAU1372_SAI1_BCLKRATE;
    665		break;
    666	case 32:
    667		sai1 = 0;
    668		break;
    669	default:
    670		return -EINVAL;
    671	}
    672
    673	regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0, ADAU1372_SAI0_FS_MASK, sai0);
    674	regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1, ADAU1372_SAI1_BCLKRATE, sai1);
    675
    676	return 0;
    677}
    678
    679static int adau1372_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
    680				 unsigned int rx_mask, int slots, int width)
    681{
    682	struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
    683	unsigned int sai0, sai1;
    684
    685	/* I2S mode */
    686	if (slots == 0) {
    687		/* The other settings dont matter in I2S mode */
    688		regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0,
    689				   ADAU1372_SAI0_SAI_MASK, ADAU1372_SAI0_SAI_I2S);
    690		adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM2;
    691		adau1372->slot_width = 0;
    692		return 0;
    693	}
    694
    695	/* We have 8 channels anything outside that is not supported */
    696	if ((tx_mask & ~0xff) != 0 || (rx_mask & ~0xff) != 0)
    697		return -EINVAL;
    698
    699	switch (width) {
    700	case 16:
    701		sai1 = ADAU1372_SAI1_BCLK_TDMC;
    702		break;
    703	case 32:
    704		sai1 = 0;
    705		break;
    706	default:
    707		return -EINVAL;
    708	}
    709
    710	switch (slots) {
    711	case 2:
    712		sai0 = ADAU1372_SAI0_SAI_TDM2;
    713		adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM2;
    714		break;
    715	case 4:
    716		sai0 = ADAU1372_SAI0_SAI_TDM4;
    717		if (adau1372->clock_provider)
    718			adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM4_MASTER;
    719		else
    720			adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM4;
    721		break;
    722	case 8:
    723		sai0 = ADAU1372_SAI0_SAI_TDM8;
    724		adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM8;
    725		break;
    726	default:
    727		return -EINVAL;
    728	}
    729
    730	adau1372->slot_width = width;
    731
    732	regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI0, ADAU1372_SAI0_SAI_MASK, sai0);
    733	regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1, ADAU1372_SAI1_BCLK_TDMC, sai1);
    734
    735	/* Mask is inverted in hardware */
    736	regmap_write(adau1372->regmap, ADAU1372_REG_SOUT_CTRL, ~tx_mask);
    737
    738	return 0;
    739}
    740
    741static int adau1372_set_tristate(struct snd_soc_dai *dai, int tristate)
    742{
    743	struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
    744	unsigned int sai1;
    745
    746	if (tristate)
    747		sai1 = ADAU1372_SAI1_TDM_TS;
    748	else
    749		sai1 = 0;
    750
    751	return regmap_update_bits(adau1372->regmap, ADAU1372_REG_SAI1, ADAU1372_SAI1_TDM_TS, sai1);
    752}
    753
    754static int adau1372_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
    755{
    756	struct adau1372 *adau1372 = snd_soc_dai_get_drvdata(dai);
    757
    758	snd_pcm_hw_constraint_list(substream->runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
    759				   &adau1372->rate_constraints);
    760
    761	return 0;
    762}
    763
    764static void adau1372_enable_pll(struct adau1372 *adau1372)
    765{
    766	unsigned int val, timeout = 0;
    767	int ret;
    768
    769	regmap_update_bits(adau1372->regmap, ADAU1372_REG_CLK_CTRL,
    770			   ADAU1372_CLK_CTRL_PLL_EN, ADAU1372_CLK_CTRL_PLL_EN);
    771	do {
    772		/* Takes about 1ms to lock */
    773		usleep_range(1000, 2000);
    774		ret = regmap_read(adau1372->regmap, ADAU1372_REG_PLL(5), &val);
    775		if (ret)
    776			break;
    777		timeout++;
    778	} while (!(val & 1) && timeout < 3);
    779
    780	if (ret < 0 || !(val & 1))
    781		dev_err(adau1372->dev, "Failed to lock PLL\n");
    782}
    783
    784static void adau1372_set_power(struct adau1372 *adau1372, bool enable)
    785{
    786	if (adau1372->enabled == enable)
    787		return;
    788
    789	if (enable) {
    790		unsigned int clk_ctrl = ADAU1372_CLK_CTRL_MCLK_EN;
    791
    792		clk_prepare_enable(adau1372->mclk);
    793		if (adau1372->pd_gpio)
    794			gpiod_set_value(adau1372->pd_gpio, 0);
    795
    796		if (adau1372->switch_mode)
    797			adau1372->switch_mode(adau1372->dev);
    798
    799		regcache_cache_only(adau1372->regmap, false);
    800
    801		/*
    802		 * Clocks needs to be enabled before any other register can be
    803		 * accessed.
    804		 */
    805		if (adau1372->use_pll) {
    806			adau1372_enable_pll(adau1372);
    807			clk_ctrl |= ADAU1372_CLK_CTRL_CLKSRC;
    808		}
    809
    810		regmap_update_bits(adau1372->regmap, ADAU1372_REG_CLK_CTRL,
    811				   ADAU1372_CLK_CTRL_MCLK_EN | ADAU1372_CLK_CTRL_CLKSRC, clk_ctrl);
    812		regcache_sync(adau1372->regmap);
    813	} else {
    814		if (adau1372->pd_gpio) {
    815			/*
    816			 * This will turn everything off and reset the register
    817			 * map. No need to do any register writes to manually
    818			 * turn things off.
    819			 */
    820			gpiod_set_value(adau1372->pd_gpio, 1);
    821			regcache_mark_dirty(adau1372->regmap);
    822		} else {
    823			regmap_update_bits(adau1372->regmap, ADAU1372_REG_CLK_CTRL,
    824					   ADAU1372_CLK_CTRL_MCLK_EN | ADAU1372_CLK_CTRL_PLL_EN, 0);
    825		}
    826		clk_disable_unprepare(adau1372->mclk);
    827		regcache_cache_only(adau1372->regmap, true);
    828	}
    829
    830	adau1372->enabled = enable;
    831}
    832
    833static int adau1372_set_bias_level(struct snd_soc_component *component,
    834				   enum snd_soc_bias_level level)
    835{
    836	struct adau1372 *adau1372 = snd_soc_component_get_drvdata(component);
    837
    838	switch (level) {
    839	case SND_SOC_BIAS_ON:
    840		break;
    841	case SND_SOC_BIAS_PREPARE:
    842		break;
    843	case SND_SOC_BIAS_STANDBY:
    844		adau1372_set_power(adau1372, true);
    845		break;
    846	case SND_SOC_BIAS_OFF:
    847		adau1372_set_power(adau1372, false);
    848		break;
    849	}
    850
    851	return 0;
    852}
    853
    854static const struct snd_soc_component_driver adau1372_driver = {
    855	.set_bias_level = adau1372_set_bias_level,
    856	.controls = adau1372_controls,
    857	.num_controls = ARRAY_SIZE(adau1372_controls),
    858	.dapm_widgets = adau1372_dapm_widgets,
    859	.num_dapm_widgets = ARRAY_SIZE(adau1372_dapm_widgets),
    860	.dapm_routes = adau1372_dapm_routes,
    861	.num_dapm_routes = ARRAY_SIZE(adau1372_dapm_routes),
    862	.endianness = 1,
    863};
    864
    865static const struct snd_soc_dai_ops adau1372_dai_ops = {
    866	.set_fmt = adau1372_set_dai_fmt,
    867	.set_tdm_slot = adau1372_set_tdm_slot,
    868	.set_tristate = adau1372_set_tristate,
    869	.hw_params = adau1372_hw_params,
    870	.startup = adau1372_startup,
    871};
    872
    873#define ADAU1372_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |	SNDRV_PCM_FMTBIT_S32_LE)
    874
    875static struct snd_soc_dai_driver adau1372_dai_driver = {
    876	.name = "adau1372",
    877	.playback = {
    878		.stream_name = "Playback",
    879		.channels_min = 2,
    880		.channels_max = 8,
    881		.rates = SNDRV_PCM_RATE_KNOT,
    882		.formats = ADAU1372_FORMATS,
    883		.sig_bits = 24,
    884	},
    885	.capture = {
    886		.stream_name = "Capture",
    887		.channels_min = 2,
    888		.channels_max = 8,
    889		.rates = SNDRV_PCM_RATE_KNOT,
    890		.formats = ADAU1372_FORMATS,
    891		.sig_bits = 24,
    892	},
    893	.ops = &adau1372_dai_ops,
    894	.symmetric_rate = 1,
    895};
    896
    897static int adau1372_setup_pll(struct adau1372 *adau1372, unsigned int rate)
    898{
    899	u8 regs[5];
    900	unsigned int i;
    901	int ret;
    902
    903	ret = adau_calc_pll_cfg(rate, 49152000, regs);
    904	if (ret < 0)
    905		return ret;
    906
    907	for (i = 0; i < ARRAY_SIZE(regs); i++)
    908		regmap_write(adau1372->regmap, ADAU1372_REG_PLL(i), regs[i]);
    909
    910	return 0;
    911}
    912
    913int adau1372_probe(struct device *dev, struct regmap *regmap,
    914		   void (*switch_mode)(struct device *dev))
    915{
    916	struct adau1372 *adau1372;
    917	unsigned int clk_ctrl;
    918	unsigned long rate;
    919	int ret;
    920
    921	if (IS_ERR(regmap))
    922		return PTR_ERR(regmap);
    923
    924	adau1372 = devm_kzalloc(dev, sizeof(*adau1372), GFP_KERNEL);
    925	if (!adau1372)
    926		return -ENOMEM;
    927
    928	adau1372->clk = devm_clk_get(dev, "mclk");
    929	if (IS_ERR(adau1372->clk))
    930		return PTR_ERR(adau1372->clk);
    931
    932	adau1372->pd_gpio = devm_gpiod_get_optional(dev, "powerdown", GPIOD_OUT_HIGH);
    933	if (IS_ERR(adau1372->pd_gpio))
    934		return PTR_ERR(adau1372->pd_gpio);
    935
    936	adau1372->regmap = regmap;
    937	adau1372->switch_mode = switch_mode;
    938	adau1372->dev = dev;
    939	adau1372->rate_constraints.list = adau1372_rates;
    940	adau1372->rate_constraints.count = ARRAY_SIZE(adau1372_rates);
    941	adau1372->rate_constraints.mask = ADAU1372_RATE_MASK_TDM2;
    942
    943	dev_set_drvdata(dev, adau1372);
    944
    945	/*
    946	 * The datasheet says that the internal MCLK always needs to run at
    947	 * 12.288MHz. Automatically choose a valid configuration from the
    948	 * external clock.
    949	 */
    950	rate = clk_get_rate(adau1372->clk);
    951
    952	switch (rate) {
    953	case 12288000:
    954		clk_ctrl = ADAU1372_CLK_CTRL_CC_MDIV;
    955		break;
    956	case 24576000:
    957		clk_ctrl = 0;
    958		break;
    959	default:
    960		clk_ctrl = 0;
    961		ret = adau1372_setup_pll(adau1372, rate);
    962		if (ret < 0)
    963			return ret;
    964		adau1372->use_pll = true;
    965		break;
    966	}
    967
    968	/*
    969	 * Most of the registers are inaccessible unless the internal clock is
    970	 * enabled.
    971	 */
    972	regcache_cache_only(regmap, true);
    973
    974	regmap_update_bits(regmap, ADAU1372_REG_CLK_CTRL, ADAU1372_CLK_CTRL_CC_MDIV, clk_ctrl);
    975
    976	/*
    977	 * No pinctrl support yet, put the multi-purpose pins in the most
    978	 * sensible mode for general purpose CODEC operation.
    979	 */
    980	regmap_write(regmap, ADAU1372_REG_MODE_MP(1), 0x00); /* SDATA OUT */
    981	regmap_write(regmap, ADAU1372_REG_MODE_MP(6), 0x12); /* CLOCKOUT */
    982
    983	regmap_write(regmap, ADAU1372_REG_OP_STAGE_MUTE, 0x0);
    984
    985	regmap_write(regmap, 0x7, 0x01); /* CLOCK OUT */
    986
    987	return  devm_snd_soc_register_component(dev, &adau1372_driver, &adau1372_dai_driver, 1);
    988}
    989EXPORT_SYMBOL(adau1372_probe);
    990
    991static const struct reg_default adau1372_reg_defaults[] = {
    992	{ ADAU1372_REG_CLK_CTRL,		0x00 },
    993	{ ADAU1372_REG_PLL(0),			0x00 },
    994	{ ADAU1372_REG_PLL(1),			0x00 },
    995	{ ADAU1372_REG_PLL(2),			0x00 },
    996	{ ADAU1372_REG_PLL(3),			0x00 },
    997	{ ADAU1372_REG_PLL(4),			0x00 },
    998	{ ADAU1372_REG_PLL(5),			0x00 },
    999	{ ADAU1372_REG_DAC_SOURCE,		0x10 },
   1000	{ ADAU1372_REG_SOUT_SOURCE_0_1,		0x54 },
   1001	{ ADAU1372_REG_SOUT_SOURCE_2_3,		0x76 },
   1002	{ ADAU1372_REG_SOUT_SOURCE_4_5,		0x54 },
   1003	{ ADAU1372_REG_SOUT_SOURCE_6_7,		0x76 },
   1004	{ ADAU1372_REG_ADC_SDATA_CH,		0x04 },
   1005	{ ADAU1372_REG_ASRCO_SOURCE_0_1,	0x10 },
   1006	{ ADAU1372_REG_ASRCO_SOURCE_2_3,	0x32 },
   1007	{ ADAU1372_REG_ASRC_MODE,		0x00 },
   1008	{ ADAU1372_REG_ADC_CTRL0,		0x19 },
   1009	{ ADAU1372_REG_ADC_CTRL1,		0x19 },
   1010	{ ADAU1372_REG_ADC_CTRL2,		0x00 },
   1011	{ ADAU1372_REG_ADC_CTRL3,		0x00 },
   1012	{ ADAU1372_REG_ADC_VOL(0),		0x00 },
   1013	{ ADAU1372_REG_ADC_VOL(1),		0x00 },
   1014	{ ADAU1372_REG_ADC_VOL(2),		0x00 },
   1015	{ ADAU1372_REG_ADC_VOL(3),		0x00 },
   1016	{ ADAU1372_REG_PGA_CTRL(0),		0x40 },
   1017	{ ADAU1372_REG_PGA_CTRL(1),		0x40 },
   1018	{ ADAU1372_REG_PGA_CTRL(2),		0x40 },
   1019	{ ADAU1372_REG_PGA_CTRL(3),		0x40 },
   1020	{ ADAU1372_REG_PGA_BOOST,		0x00 },
   1021	{ ADAU1372_REG_MICBIAS,			0x00 },
   1022	{ ADAU1372_REG_DAC_CTRL,		0x18 },
   1023	{ ADAU1372_REG_DAC_VOL(0),		0x00 },
   1024	{ ADAU1372_REG_DAC_VOL(1),		0x00 },
   1025	{ ADAU1372_REG_OP_STAGE_MUTE,		0x0f },
   1026	{ ADAU1372_REG_SAI0,			0x00 },
   1027	{ ADAU1372_REG_SAI1,			0x00 },
   1028	{ ADAU1372_REG_SOUT_CTRL,		0x00 },
   1029	{ ADAU1372_REG_MODE_MP(0),		0x00 },
   1030	{ ADAU1372_REG_MODE_MP(1),		0x10 },
   1031	{ ADAU1372_REG_MODE_MP(4),		0x00 },
   1032	{ ADAU1372_REG_MODE_MP(5),		0x00 },
   1033	{ ADAU1372_REG_MODE_MP(6),		0x11 },
   1034	{ ADAU1372_REG_OP_STAGE_CTRL,		0x0f },
   1035	{ ADAU1372_REG_DECIM_PWR,		0x00 },
   1036	{ ADAU1372_REG_INTERP_PWR,		0x00 },
   1037	{ ADAU1372_REG_BIAS_CTRL0,		0x00 },
   1038	{ ADAU1372_REG_BIAS_CTRL1,		0x00 },
   1039};
   1040
   1041static bool adau1372_volatile_register(struct device *dev, unsigned int reg)
   1042{
   1043	if (reg == ADAU1372_REG_PLL(5))
   1044		return true;
   1045
   1046	return false;
   1047}
   1048
   1049const struct regmap_config adau1372_regmap_config = {
   1050	.val_bits = 8,
   1051	.reg_bits = 16,
   1052	.max_register = 0x4d,
   1053
   1054	.reg_defaults = adau1372_reg_defaults,
   1055	.num_reg_defaults = ARRAY_SIZE(adau1372_reg_defaults),
   1056	.volatile_reg = adau1372_volatile_register,
   1057	.cache_type = REGCACHE_RBTREE,
   1058};
   1059EXPORT_SYMBOL_GPL(adau1372_regmap_config);
   1060
   1061MODULE_DESCRIPTION("ASoC ADAU1372 CODEC driver");
   1062MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
   1063MODULE_LICENSE("GPL v2");