162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * ALSA SoC CS43130 codec driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2017 Cirrus Logic, Inc. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Author: Li Xu <li.xu@cirrus.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __CS43130_H__ 1162306a36Sopenharmony_ci#define __CS43130_H__ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/math.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci/* CS43130 registers addresses */ 1662306a36Sopenharmony_ci/* all reg address is shifted by a byte for control byte to be LSB */ 1762306a36Sopenharmony_ci#define CS43130_FIRSTREG 0x010000 1862306a36Sopenharmony_ci#define CS43130_LASTREG 0x190000 1962306a36Sopenharmony_ci#define CS43130_CHIP_ID 0x00043130 2062306a36Sopenharmony_ci#define CS4399_CHIP_ID 0x00043990 2162306a36Sopenharmony_ci#define CS43131_CHIP_ID 0x00043131 2262306a36Sopenharmony_ci#define CS43198_CHIP_ID 0x00043198 2362306a36Sopenharmony_ci#define CS43130_DEVID_AB 0x010000 /* Device ID A & B [RO] */ 2462306a36Sopenharmony_ci#define CS43130_DEVID_CD 0x010001 /* Device ID C & D [RO] */ 2562306a36Sopenharmony_ci#define CS43130_DEVID_E 0x010002 /* Device ID E [RO] */ 2662306a36Sopenharmony_ci#define CS43130_FAB_ID 0x010003 /* Fab ID [RO] */ 2762306a36Sopenharmony_ci#define CS43130_REV_ID 0x010004 /* Revision ID [RO] */ 2862306a36Sopenharmony_ci#define CS43130_SUBREV_ID 0x010005 /* Subrevision ID */ 2962306a36Sopenharmony_ci#define CS43130_SYS_CLK_CTL_1 0x010006 /* System Clocking Ctl 1 */ 3062306a36Sopenharmony_ci#define CS43130_SP_SRATE 0x01000B /* Serial Port Sample Rate */ 3162306a36Sopenharmony_ci#define CS43130_SP_BITSIZE 0x01000C /* Serial Port Bit Size */ 3262306a36Sopenharmony_ci#define CS43130_PAD_INT_CFG 0x01000D /* Pad Interface Config */ 3362306a36Sopenharmony_ci#define CS43130_DXD1 0x010010 /* DXD1 */ 3462306a36Sopenharmony_ci#define CS43130_DXD7 0x010025 /* DXD7 */ 3562306a36Sopenharmony_ci#define CS43130_DXD19 0x010026 /* DXD19 */ 3662306a36Sopenharmony_ci#define CS43130_DXD17 0x010027 /* DXD17 */ 3762306a36Sopenharmony_ci#define CS43130_DXD18 0x010028 /* DXD18 */ 3862306a36Sopenharmony_ci#define CS43130_DXD12 0x01002C /* DXD12 */ 3962306a36Sopenharmony_ci#define CS43130_DXD8 0x01002E /* DXD8 */ 4062306a36Sopenharmony_ci#define CS43130_PWDN_CTL 0x020000 /* Power Down Ctl */ 4162306a36Sopenharmony_ci#define CS43130_DXD2 0x020019 /* DXD2 */ 4262306a36Sopenharmony_ci#define CS43130_CRYSTAL_SET 0x020052 /* Crystal Setting */ 4362306a36Sopenharmony_ci#define CS43130_PLL_SET_1 0x030001 /* PLL Setting 1 */ 4462306a36Sopenharmony_ci#define CS43130_PLL_SET_2 0x030002 /* PLL Setting 2 */ 4562306a36Sopenharmony_ci#define CS43130_PLL_SET_3 0x030003 /* PLL Setting 3 */ 4662306a36Sopenharmony_ci#define CS43130_PLL_SET_4 0x030004 /* PLL Setting 4 */ 4762306a36Sopenharmony_ci#define CS43130_PLL_SET_5 0x030005 /* PLL Setting 5 */ 4862306a36Sopenharmony_ci#define CS43130_PLL_SET_6 0x030008 /* PLL Setting 6 */ 4962306a36Sopenharmony_ci#define CS43130_PLL_SET_7 0x03000A /* PLL Setting 7 */ 5062306a36Sopenharmony_ci#define CS43130_PLL_SET_8 0x03001B /* PLL Setting 8 */ 5162306a36Sopenharmony_ci#define CS43130_PLL_SET_9 0x040002 /* PLL Setting 9 */ 5262306a36Sopenharmony_ci#define CS43130_PLL_SET_10 0x040003 /* PLL Setting 10 */ 5362306a36Sopenharmony_ci#define CS43130_CLKOUT_CTL 0x040004 /* CLKOUT Ctl */ 5462306a36Sopenharmony_ci#define CS43130_ASP_NUM_1 0x040010 /* ASP Numerator 1 */ 5562306a36Sopenharmony_ci#define CS43130_ASP_NUM_2 0x040011 /* ASP Numerator 2 */ 5662306a36Sopenharmony_ci#define CS43130_ASP_DEN_1 0x040012 /* ASP Denominator 1 */ 5762306a36Sopenharmony_ci#define CS43130_ASP_DEN_2 0x040013 /* ASP Denominator 2 */ 5862306a36Sopenharmony_ci#define CS43130_ASP_LRCK_HI_TIME_1 0x040014 /* ASP LRCK High Time 1 */ 5962306a36Sopenharmony_ci#define CS43130_ASP_LRCK_HI_TIME_2 0x040015 /* ASP LRCK High Time 2 */ 6062306a36Sopenharmony_ci#define CS43130_ASP_LRCK_PERIOD_1 0x040016 /* ASP LRCK Period 1 */ 6162306a36Sopenharmony_ci#define CS43130_ASP_LRCK_PERIOD_2 0x040017 /* ASP LRCK Period 2 */ 6262306a36Sopenharmony_ci#define CS43130_ASP_CLOCK_CONF 0x040018 /* ASP Clock Config */ 6362306a36Sopenharmony_ci#define CS43130_ASP_FRAME_CONF 0x040019 /* ASP Frame Config */ 6462306a36Sopenharmony_ci#define CS43130_XSP_NUM_1 0x040020 /* XSP Numerator 1 */ 6562306a36Sopenharmony_ci#define CS43130_XSP_NUM_2 0x040021 /* XSP Numerator 2 */ 6662306a36Sopenharmony_ci#define CS43130_XSP_DEN_1 0x040022 /* XSP Denominator 1 */ 6762306a36Sopenharmony_ci#define CS43130_XSP_DEN_2 0x040023 /* XSP Denominator 2 */ 6862306a36Sopenharmony_ci#define CS43130_XSP_LRCK_HI_TIME_1 0x040024 /* XSP LRCK High Time 1 */ 6962306a36Sopenharmony_ci#define CS43130_XSP_LRCK_HI_TIME_2 0x040025 /* XSP LRCK High Time 2 */ 7062306a36Sopenharmony_ci#define CS43130_XSP_LRCK_PERIOD_1 0x040026 /* XSP LRCK Period 1 */ 7162306a36Sopenharmony_ci#define CS43130_XSP_LRCK_PERIOD_2 0x040027 /* XSP LRCK Period 2 */ 7262306a36Sopenharmony_ci#define CS43130_XSP_CLOCK_CONF 0x040028 /* XSP Clock Config */ 7362306a36Sopenharmony_ci#define CS43130_XSP_FRAME_CONF 0x040029 /* XSP Frame Config */ 7462306a36Sopenharmony_ci#define CS43130_ASP_CH_1_LOC 0x050000 /* ASP Chan 1 Location */ 7562306a36Sopenharmony_ci#define CS43130_ASP_CH_2_LOC 0x050001 /* ASP Chan 2 Location */ 7662306a36Sopenharmony_ci#define CS43130_ASP_CH_1_SZ_EN 0x05000A /* ASP Chan 1 Size, Enable */ 7762306a36Sopenharmony_ci#define CS43130_ASP_CH_2_SZ_EN 0x05000B /* ASP Chan 2 Size, Enable */ 7862306a36Sopenharmony_ci#define CS43130_XSP_CH_1_LOC 0x060000 /* XSP Chan 1 Location */ 7962306a36Sopenharmony_ci#define CS43130_XSP_CH_2_LOC 0x060001 /* XSP Chan 2 Location */ 8062306a36Sopenharmony_ci#define CS43130_XSP_CH_1_SZ_EN 0x06000A /* XSP Chan 1 Size, Enable */ 8162306a36Sopenharmony_ci#define CS43130_XSP_CH_2_SZ_EN 0x06000B /* XSP Chan 2 Size, Enable */ 8262306a36Sopenharmony_ci#define CS43130_DSD_VOL_B 0x070000 /* DSD Volume B */ 8362306a36Sopenharmony_ci#define CS43130_DSD_VOL_A 0x070001 /* DSD Volume A */ 8462306a36Sopenharmony_ci#define CS43130_DSD_PATH_CTL_1 0x070002 /* DSD Proc Path Sig Ctl 1 */ 8562306a36Sopenharmony_ci#define CS43130_DSD_INT_CFG 0x070003 /* DSD Interface Config */ 8662306a36Sopenharmony_ci#define CS43130_DSD_PATH_CTL_2 0x070004 /* DSD Proc Path Sig Ctl 2 */ 8762306a36Sopenharmony_ci#define CS43130_DSD_PCM_MIX_CTL 0x070005 /* DSD and PCM Mixing Ctl */ 8862306a36Sopenharmony_ci#define CS43130_DSD_PATH_CTL_3 0x070006 /* DSD Proc Path Sig Ctl 3 */ 8962306a36Sopenharmony_ci#define CS43130_HP_OUT_CTL_1 0x080000 /* HP Output Ctl 1 */ 9062306a36Sopenharmony_ci#define CS43130_DXD16 0x080024 /* DXD16 */ 9162306a36Sopenharmony_ci#define CS43130_DXD13 0x080032 /* DXD13 */ 9262306a36Sopenharmony_ci#define CS43130_PCM_FILT_OPT 0x090000 /* PCM Filter Option */ 9362306a36Sopenharmony_ci#define CS43130_PCM_VOL_B 0x090001 /* PCM Volume B */ 9462306a36Sopenharmony_ci#define CS43130_PCM_VOL_A 0x090002 /* PCM Volume A */ 9562306a36Sopenharmony_ci#define CS43130_PCM_PATH_CTL_1 0x090003 /* PCM Path Signal Ctl 1 */ 9662306a36Sopenharmony_ci#define CS43130_PCM_PATH_CTL_2 0x090004 /* PCM Path Signal Ctl 2 */ 9762306a36Sopenharmony_ci#define CS43130_DXD6 0x090097 /* DXD6 */ 9862306a36Sopenharmony_ci#define CS43130_CLASS_H_CTL 0x0B0000 /* Class H Ctl */ 9962306a36Sopenharmony_ci#define CS43130_DXD15 0x0B0005 /* DXD15 */ 10062306a36Sopenharmony_ci#define CS43130_DXD14 0x0B0006 /* DXD14 */ 10162306a36Sopenharmony_ci#define CS43130_DXD3 0x0C0002 /* DXD3 */ 10262306a36Sopenharmony_ci#define CS43130_DXD10 0x0C0003 /* DXD10 */ 10362306a36Sopenharmony_ci#define CS43130_DXD11 0x0C0005 /* DXD11 */ 10462306a36Sopenharmony_ci#define CS43130_DXD9 0x0C0006 /* DXD9 */ 10562306a36Sopenharmony_ci#define CS43130_DXD4 0x0C0009 /* DXD4 */ 10662306a36Sopenharmony_ci#define CS43130_DXD5 0x0C000E /* DXD5 */ 10762306a36Sopenharmony_ci#define CS43130_HP_DETECT 0x0D0000 /* HP Detect */ 10862306a36Sopenharmony_ci#define CS43130_HP_STATUS 0x0D0001 /* HP Status [RO] */ 10962306a36Sopenharmony_ci#define CS43130_HP_LOAD_1 0x0E0000 /* HP Load 1 */ 11062306a36Sopenharmony_ci#define CS43130_HP_MEAS_LOAD_1 0x0E0003 /* HP Load Measurement 1 */ 11162306a36Sopenharmony_ci#define CS43130_HP_MEAS_LOAD_2 0x0E0004 /* HP Load Measurement 2 */ 11262306a36Sopenharmony_ci#define CS43130_HP_DC_STAT_1 0x0E000D /* HP DC Load Status 0 [RO] */ 11362306a36Sopenharmony_ci#define CS43130_HP_DC_STAT_2 0x0E000E /* HP DC Load Status 1 [RO] */ 11462306a36Sopenharmony_ci#define CS43130_HP_AC_STAT_1 0x0E0010 /* HP AC Load Status 0 [RO] */ 11562306a36Sopenharmony_ci#define CS43130_HP_AC_STAT_2 0x0E0011 /* HP AC Load Status 1 [RO] */ 11662306a36Sopenharmony_ci#define CS43130_HP_LOAD_STAT 0x0E001A /* HP Load Status [RO] */ 11762306a36Sopenharmony_ci#define CS43130_INT_STATUS_1 0x0F0000 /* Interrupt Status 1 */ 11862306a36Sopenharmony_ci#define CS43130_INT_STATUS_2 0x0F0001 /* Interrupt Status 2 */ 11962306a36Sopenharmony_ci#define CS43130_INT_STATUS_3 0x0F0002 /* Interrupt Status 3 */ 12062306a36Sopenharmony_ci#define CS43130_INT_STATUS_4 0x0F0003 /* Interrupt Status 4 */ 12162306a36Sopenharmony_ci#define CS43130_INT_STATUS_5 0x0F0004 /* Interrupt Status 5 */ 12262306a36Sopenharmony_ci#define CS43130_INT_MASK_1 0x0F0010 /* Interrupt Mask 1 */ 12362306a36Sopenharmony_ci#define CS43130_INT_MASK_2 0x0F0011 /* Interrupt Mask 2 */ 12462306a36Sopenharmony_ci#define CS43130_INT_MASK_3 0x0F0012 /* Interrupt Mask 3 */ 12562306a36Sopenharmony_ci#define CS43130_INT_MASK_4 0x0F0013 /* Interrupt Mask 4 */ 12662306a36Sopenharmony_ci#define CS43130_INT_MASK_5 0x0F0014 /* Interrupt Mask 5 */ 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci#define CS43130_MCLK_SRC_SEL_MASK 0x03 12962306a36Sopenharmony_ci#define CS43130_MCLK_SRC_SEL_SHIFT 0 13062306a36Sopenharmony_ci#define CS43130_MCLK_INT_MASK 0x04 13162306a36Sopenharmony_ci#define CS43130_MCLK_INT_SHIFT 2 13262306a36Sopenharmony_ci#define CS43130_CH_BITSIZE_MASK 0x03 13362306a36Sopenharmony_ci#define CS43130_CH_EN_MASK 0x04 13462306a36Sopenharmony_ci#define CS43130_CH_EN_SHIFT 2 13562306a36Sopenharmony_ci#define CS43130_ASP_BITSIZE_MASK 0x03 13662306a36Sopenharmony_ci#define CS43130_XSP_BITSIZE_MASK 0x0C 13762306a36Sopenharmony_ci#define CS43130_XSP_BITSIZE_SHIFT 2 13862306a36Sopenharmony_ci#define CS43130_SP_BITSIZE_ASP_SHIFT 0 13962306a36Sopenharmony_ci#define CS43130_HP_DETECT_CTRL_SHIFT 6 14062306a36Sopenharmony_ci#define CS43130_HP_DETECT_CTRL_MASK (0x03 << CS43130_HP_DETECT_CTRL_SHIFT) 14162306a36Sopenharmony_ci#define CS43130_HP_DETECT_INV_SHIFT 5 14262306a36Sopenharmony_ci#define CS43130_HP_DETECT_INV_MASK (1 << CS43130_HP_DETECT_INV_SHIFT) 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci/* CS43130_INT_MASK_1 */ 14562306a36Sopenharmony_ci#define CS43130_HP_PLUG_INT_SHIFT 6 14662306a36Sopenharmony_ci#define CS43130_HP_PLUG_INT (1 << CS43130_HP_PLUG_INT_SHIFT) 14762306a36Sopenharmony_ci#define CS43130_HP_UNPLUG_INT_SHIFT 5 14862306a36Sopenharmony_ci#define CS43130_HP_UNPLUG_INT (1 << CS43130_HP_UNPLUG_INT_SHIFT) 14962306a36Sopenharmony_ci#define CS43130_XTAL_RDY_INT_SHIFT 4 15062306a36Sopenharmony_ci#define CS43130_XTAL_RDY_INT_MASK 0x10 15162306a36Sopenharmony_ci#define CS43130_XTAL_RDY_INT (1 << CS43130_XTAL_RDY_INT_SHIFT) 15262306a36Sopenharmony_ci#define CS43130_XTAL_ERR_INT_SHIFT 3 15362306a36Sopenharmony_ci#define CS43130_XTAL_ERR_INT (1 << CS43130_XTAL_ERR_INT_SHIFT) 15462306a36Sopenharmony_ci#define CS43130_PLL_RDY_INT_MASK 0x04 15562306a36Sopenharmony_ci#define CS43130_PLL_RDY_INT_SHIFT 2 15662306a36Sopenharmony_ci#define CS43130_PLL_RDY_INT (1 << CS43130_PLL_RDY_INT_SHIFT) 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci/* CS43130_INT_MASK_4 */ 15962306a36Sopenharmony_ci#define CS43130_INT_MASK_ALL 0xFF 16062306a36Sopenharmony_ci#define CS43130_HPLOAD_NO_DC_INT_SHIFT 7 16162306a36Sopenharmony_ci#define CS43130_HPLOAD_NO_DC_INT (1 << CS43130_HPLOAD_NO_DC_INT_SHIFT) 16262306a36Sopenharmony_ci#define CS43130_HPLOAD_UNPLUG_INT_SHIFT 6 16362306a36Sopenharmony_ci#define CS43130_HPLOAD_UNPLUG_INT (1 << CS43130_HPLOAD_UNPLUG_INT_SHIFT) 16462306a36Sopenharmony_ci#define CS43130_HPLOAD_OOR_INT_SHIFT 4 16562306a36Sopenharmony_ci#define CS43130_HPLOAD_OOR_INT (1 << CS43130_HPLOAD_OOR_INT_SHIFT) 16662306a36Sopenharmony_ci#define CS43130_HPLOAD_AC_INT_SHIFT 3 16762306a36Sopenharmony_ci#define CS43130_HPLOAD_AC_INT (1 << CS43130_HPLOAD_AC_INT_SHIFT) 16862306a36Sopenharmony_ci#define CS43130_HPLOAD_DC_INT_SHIFT 2 16962306a36Sopenharmony_ci#define CS43130_HPLOAD_DC_INT (1 << CS43130_HPLOAD_DC_INT_SHIFT) 17062306a36Sopenharmony_ci#define CS43130_HPLOAD_OFF_INT_SHIFT 1 17162306a36Sopenharmony_ci#define CS43130_HPLOAD_OFF_INT (1 << CS43130_HPLOAD_OFF_INT_SHIFT) 17262306a36Sopenharmony_ci#define CS43130_HPLOAD_ON_INT 1 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci/* CS43130_HP_LOAD_1 */ 17562306a36Sopenharmony_ci#define CS43130_HPLOAD_EN_SHIFT 7 17662306a36Sopenharmony_ci#define CS43130_HPLOAD_EN (1 << CS43130_HPLOAD_EN_SHIFT) 17762306a36Sopenharmony_ci#define CS43130_HPLOAD_CHN_SEL_SHIFT 4 17862306a36Sopenharmony_ci#define CS43130_HPLOAD_CHN_SEL (1 << CS43130_HPLOAD_CHN_SEL_SHIFT) 17962306a36Sopenharmony_ci#define CS43130_HPLOAD_AC_START_SHIFT 1 18062306a36Sopenharmony_ci#define CS43130_HPLOAD_AC_START (1 << CS43130_HPLOAD_AC_START_SHIFT) 18162306a36Sopenharmony_ci#define CS43130_HPLOAD_DC_START 1 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci/* Reg CS43130_SP_BITSIZE */ 18462306a36Sopenharmony_ci#define CS43130_SP_BIT_SIZE_8 0x03 18562306a36Sopenharmony_ci#define CS43130_SP_BIT_SIZE_16 0x02 18662306a36Sopenharmony_ci#define CS43130_SP_BIT_SIZE_24 0x01 18762306a36Sopenharmony_ci#define CS43130_SP_BIT_SIZE_32 0x00 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci/* Reg CS43130_SP_CH_SZ_EN */ 19062306a36Sopenharmony_ci#define CS43130_CH_BIT_SIZE_8 0x00 19162306a36Sopenharmony_ci#define CS43130_CH_BIT_SIZE_16 0x01 19262306a36Sopenharmony_ci#define CS43130_CH_BIT_SIZE_24 0x02 19362306a36Sopenharmony_ci#define CS43130_CH_BIT_SIZE_32 0x03 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci/* PLL */ 19662306a36Sopenharmony_ci#define CS43130_PLL_START_MASK 0x01 19762306a36Sopenharmony_ci#define CS43130_PLL_MODE_MASK 0x02 19862306a36Sopenharmony_ci#define CS43130_PLL_MODE_SHIFT 1 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci#define CS43130_PLL_REF_PREDIV_MASK 0x3 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci#define CS43130_SP_STP_MASK 0x10 20362306a36Sopenharmony_ci#define CS43130_SP_STP_SHIFT 4 20462306a36Sopenharmony_ci#define CS43130_SP_5050_MASK 0x08 20562306a36Sopenharmony_ci#define CS43130_SP_5050_SHIFT 3 20662306a36Sopenharmony_ci#define CS43130_SP_FSD_MASK 0x07 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci#define CS43130_SP_MODE_MASK 0x10 20962306a36Sopenharmony_ci#define CS43130_SP_MODE_SHIFT 4 21062306a36Sopenharmony_ci#define CS43130_SP_SCPOL_OUT_MASK 0x08 21162306a36Sopenharmony_ci#define CS43130_SP_SCPOL_OUT_SHIFT 3 21262306a36Sopenharmony_ci#define CS43130_SP_SCPOL_IN_MASK 0x04 21362306a36Sopenharmony_ci#define CS43130_SP_SCPOL_IN_SHIFT 2 21462306a36Sopenharmony_ci#define CS43130_SP_LCPOL_OUT_MASK 0x02 21562306a36Sopenharmony_ci#define CS43130_SP_LCPOL_OUT_SHIFT 1 21662306a36Sopenharmony_ci#define CS43130_SP_LCPOL_IN_MASK 0x01 21762306a36Sopenharmony_ci#define CS43130_SP_LCPOL_IN_SHIFT 0 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci/* Reg CS43130_PWDN_CTL */ 22062306a36Sopenharmony_ci#define CS43130_PDN_XSP_MASK 0x80 22162306a36Sopenharmony_ci#define CS43130_PDN_XSP_SHIFT 7 22262306a36Sopenharmony_ci#define CS43130_PDN_ASP_MASK 0x40 22362306a36Sopenharmony_ci#define CS43130_PDN_ASP_SHIFT 6 22462306a36Sopenharmony_ci#define CS43130_PDN_DSPIF_MASK 0x20 22562306a36Sopenharmony_ci#define CS43130_PDN_DSDIF_SHIFT 5 22662306a36Sopenharmony_ci#define CS43130_PDN_HP_MASK 0x10 22762306a36Sopenharmony_ci#define CS43130_PDN_HP_SHIFT 4 22862306a36Sopenharmony_ci#define CS43130_PDN_XTAL_MASK 0x08 22962306a36Sopenharmony_ci#define CS43130_PDN_XTAL_SHIFT 3 23062306a36Sopenharmony_ci#define CS43130_PDN_PLL_MASK 0x04 23162306a36Sopenharmony_ci#define CS43130_PDN_PLL_SHIFT 2 23262306a36Sopenharmony_ci#define CS43130_PDN_CLKOUT_MASK 0x02 23362306a36Sopenharmony_ci#define CS43130_PDN_CLKOUT_SHIFT 1 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci/* Reg CS43130_HP_OUT_CTL_1 */ 23662306a36Sopenharmony_ci#define CS43130_HP_IN_EN_SHIFT 3 23762306a36Sopenharmony_ci#define CS43130_HP_IN_EN_MASK 0x08 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci/* Reg CS43130_PAD_INT_CFG */ 24062306a36Sopenharmony_ci#define CS43130_ASP_3ST_MASK 0x01 24162306a36Sopenharmony_ci#define CS43130_XSP_3ST_MASK 0x02 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci/* Reg CS43130_PLL_SET_2 */ 24462306a36Sopenharmony_ci#define CS43130_PLL_DIV_DATA_MASK 0x000000FF 24562306a36Sopenharmony_ci#define CS43130_PLL_DIV_FRAC_0_DATA_SHIFT 0 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci/* Reg CS43130_PLL_SET_3 */ 24862306a36Sopenharmony_ci#define CS43130_PLL_DIV_FRAC_1_DATA_SHIFT 8 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci/* Reg CS43130_PLL_SET_4 */ 25162306a36Sopenharmony_ci#define CS43130_PLL_DIV_FRAC_2_DATA_SHIFT 16 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci/* Reg CS43130_SP_DEN_1 */ 25462306a36Sopenharmony_ci#define CS43130_SP_M_LSB_DATA_MASK 0x00FF 25562306a36Sopenharmony_ci#define CS43130_SP_M_LSB_DATA_SHIFT 0 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci/* Reg CS43130_SP_DEN_2 */ 25862306a36Sopenharmony_ci#define CS43130_SP_M_MSB_DATA_MASK 0xFF00 25962306a36Sopenharmony_ci#define CS43130_SP_M_MSB_DATA_SHIFT 8 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci/* Reg CS43130_SP_NUM_1 */ 26262306a36Sopenharmony_ci#define CS43130_SP_N_LSB_DATA_MASK 0x00FF 26362306a36Sopenharmony_ci#define CS43130_SP_N_LSB_DATA_SHIFT 0 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci/* Reg CS43130_SP_NUM_2 */ 26662306a36Sopenharmony_ci#define CS43130_SP_N_MSB_DATA_MASK 0xFF00 26762306a36Sopenharmony_ci#define CS43130_SP_N_MSB_DATA_SHIFT 8 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci/* Reg CS43130_SP_LRCK_HI_TIME_1 */ 27062306a36Sopenharmony_ci#define CS43130_SP_LCHI_DATA_MASK 0x00FF 27162306a36Sopenharmony_ci#define CS43130_SP_LCHI_LSB_DATA_SHIFT 0 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci/* Reg CS43130_SP_LRCK_HI_TIME_2 */ 27462306a36Sopenharmony_ci#define CS43130_SP_LCHI_MSB_DATA_SHIFT 8 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci/* Reg CS43130_SP_LRCK_PERIOD_1 */ 27762306a36Sopenharmony_ci#define CS43130_SP_LCPR_DATA_MASK 0x00FF 27862306a36Sopenharmony_ci#define CS43130_SP_LCPR_LSB_DATA_SHIFT 0 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/* Reg CS43130_SP_LRCK_PERIOD_2 */ 28162306a36Sopenharmony_ci#define CS43130_SP_LCPR_MSB_DATA_SHIFT 8 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci#define CS43130_PCM_FORMATS (SNDRV_PCM_FMTBIT_S8 | \ 28462306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S16_LE | \ 28562306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE | \ 28662306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S32_LE) 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci#define CS43130_DOP_FORMATS (SNDRV_PCM_FMTBIT_DSD_U16_LE | \ 28962306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_DSD_U16_BE | \ 29062306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE) 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci/* Reg CS43130_CRYSTAL_SET */ 29362306a36Sopenharmony_ci#define CS43130_XTAL_IBIAS_MASK 0x07 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci/* Reg CS43130_PATH_CTL_1 */ 29662306a36Sopenharmony_ci#define CS43130_MUTE_MASK 0x03 29762306a36Sopenharmony_ci#define CS43130_MUTE_EN 0x03 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci/* Reg CS43130_DSD_INT_CFG */ 30062306a36Sopenharmony_ci#define CS43130_DSD_MASTER 0x04 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci/* Reg CS43130_DSD_PATH_CTL_2 */ 30362306a36Sopenharmony_ci#define CS43130_DSD_SRC_MASK 0x60 30462306a36Sopenharmony_ci#define CS43130_DSD_SRC_SHIFT 5 30562306a36Sopenharmony_ci#define CS43130_DSD_EN_SHIFT 4 30662306a36Sopenharmony_ci#define CS43130_DSD_SPEED_MASK 0x04 30762306a36Sopenharmony_ci#define CS43130_DSD_SPEED_SHIFT 2 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci/* Reg CS43130_DSD_PCM_MIX_CTL */ 31062306a36Sopenharmony_ci#define CS43130_MIX_PCM_PREP_SHIFT 1 31162306a36Sopenharmony_ci#define CS43130_MIX_PCM_PREP_MASK 0x02 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci#define CS43130_MIX_PCM_DSD_SHIFT 0 31462306a36Sopenharmony_ci#define CS43130_MIX_PCM_DSD_MASK 0x01 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci/* Reg CS43130_HP_MEAS_LOAD */ 31762306a36Sopenharmony_ci#define CS43130_HP_MEAS_LOAD_MASK 0x000000FF 31862306a36Sopenharmony_ci#define CS43130_HP_MEAS_LOAD_1_SHIFT 0 31962306a36Sopenharmony_ci#define CS43130_HP_MEAS_LOAD_2_SHIFT 8 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci#define CS43130_MCLK_22M 22579200 32262306a36Sopenharmony_ci#define CS43130_MCLK_24M 24576000 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci#define CS43130_LINEOUT_LOAD 5000 32562306a36Sopenharmony_ci#define CS43130_JACK_LINEOUT (SND_JACK_MECHANICAL | SND_JACK_LINEOUT) 32662306a36Sopenharmony_ci#define CS43130_JACK_HEADPHONE (SND_JACK_MECHANICAL | \ 32762306a36Sopenharmony_ci SND_JACK_HEADPHONE) 32862306a36Sopenharmony_ci#define CS43130_JACK_MASK (SND_JACK_MECHANICAL | \ 32962306a36Sopenharmony_ci SND_JACK_LINEOUT | \ 33062306a36Sopenharmony_ci SND_JACK_HEADPHONE) 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cienum cs43130_dsd_src { 33362306a36Sopenharmony_ci CS43130_DSD_SRC_DSD = 0, 33462306a36Sopenharmony_ci CS43130_DSD_SRC_ASP = 2, 33562306a36Sopenharmony_ci CS43130_DSD_SRC_XSP = 3, 33662306a36Sopenharmony_ci}; 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cienum cs43130_asp_rate { 33962306a36Sopenharmony_ci CS43130_ASP_SPRATE_32K = 0, 34062306a36Sopenharmony_ci CS43130_ASP_SPRATE_44_1K, 34162306a36Sopenharmony_ci CS43130_ASP_SPRATE_48K, 34262306a36Sopenharmony_ci CS43130_ASP_SPRATE_88_2K, 34362306a36Sopenharmony_ci CS43130_ASP_SPRATE_96K, 34462306a36Sopenharmony_ci CS43130_ASP_SPRATE_176_4K, 34562306a36Sopenharmony_ci CS43130_ASP_SPRATE_192K, 34662306a36Sopenharmony_ci CS43130_ASP_SPRATE_352_8K, 34762306a36Sopenharmony_ci CS43130_ASP_SPRATE_384K, 34862306a36Sopenharmony_ci}; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cienum cs43130_mclk_src_sel { 35162306a36Sopenharmony_ci CS43130_MCLK_SRC_EXT = 0, 35262306a36Sopenharmony_ci CS43130_MCLK_SRC_PLL, 35362306a36Sopenharmony_ci CS43130_MCLK_SRC_RCO 35462306a36Sopenharmony_ci}; 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_cienum cs43130_mclk_int_freq { 35762306a36Sopenharmony_ci CS43130_MCLK_24P5 = 0, 35862306a36Sopenharmony_ci CS43130_MCLK_22P5, 35962306a36Sopenharmony_ci}; 36062306a36Sopenharmony_ci 36162306a36Sopenharmony_cienum cs43130_xtal_ibias { 36262306a36Sopenharmony_ci CS43130_XTAL_UNUSED = -1, 36362306a36Sopenharmony_ci CS43130_XTAL_IBIAS_15UA = 2, 36462306a36Sopenharmony_ci CS43130_XTAL_IBIAS_12_5UA = 4, 36562306a36Sopenharmony_ci CS43130_XTAL_IBIAS_7_5UA = 6, 36662306a36Sopenharmony_ci}; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cienum cs43130_dai_id { 36962306a36Sopenharmony_ci CS43130_ASP_PCM_DAI = 0, 37062306a36Sopenharmony_ci CS43130_ASP_DOP_DAI, 37162306a36Sopenharmony_ci CS43130_XSP_DOP_DAI, 37262306a36Sopenharmony_ci CS43130_XSP_DSD_DAI, 37362306a36Sopenharmony_ci CS43130_DAI_ID_MAX, 37462306a36Sopenharmony_ci}; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistruct cs43130_clk_gen { 37762306a36Sopenharmony_ci unsigned int mclk_int; 37862306a36Sopenharmony_ci int fs; 37962306a36Sopenharmony_ci struct u16_fract v; 38062306a36Sopenharmony_ci}; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci/* frm_size = 16 */ 38362306a36Sopenharmony_cistatic const struct cs43130_clk_gen cs43130_16_clk_gen[] = { 38462306a36Sopenharmony_ci { 22579200, 32000, .v = { 10, 441, }, }, 38562306a36Sopenharmony_ci { 22579200, 44100, .v = { 1, 32, }, }, 38662306a36Sopenharmony_ci { 22579200, 48000, .v = { 5, 147, }, }, 38762306a36Sopenharmony_ci { 22579200, 88200, .v = { 1, 16, }, }, 38862306a36Sopenharmony_ci { 22579200, 96000, .v = { 10, 147, }, }, 38962306a36Sopenharmony_ci { 22579200, 176400, .v = { 1, 8, }, }, 39062306a36Sopenharmony_ci { 22579200, 192000, .v = { 20, 147, }, }, 39162306a36Sopenharmony_ci { 22579200, 352800, .v = { 1, 4, }, }, 39262306a36Sopenharmony_ci { 22579200, 384000, .v = { 40, 147, }, }, 39362306a36Sopenharmony_ci { 24576000, 32000, .v = { 1, 48, }, }, 39462306a36Sopenharmony_ci { 24576000, 44100, .v = { 147, 5120, }, }, 39562306a36Sopenharmony_ci { 24576000, 48000, .v = { 1, 32, }, }, 39662306a36Sopenharmony_ci { 24576000, 88200, .v = { 147, 2560, }, }, 39762306a36Sopenharmony_ci { 24576000, 96000, .v = { 1, 16, }, }, 39862306a36Sopenharmony_ci { 24576000, 176400, .v = { 147, 1280, }, }, 39962306a36Sopenharmony_ci { 24576000, 192000, .v = { 1, 8, }, }, 40062306a36Sopenharmony_ci { 24576000, 352800, .v = { 147, 640, }, }, 40162306a36Sopenharmony_ci { 24576000, 384000, .v = { 1, 4, }, }, 40262306a36Sopenharmony_ci}; 40362306a36Sopenharmony_ci 40462306a36Sopenharmony_ci/* frm_size = 32 */ 40562306a36Sopenharmony_cistatic const struct cs43130_clk_gen cs43130_32_clk_gen[] = { 40662306a36Sopenharmony_ci { 22579200, 32000, .v = { 20, 441, }, }, 40762306a36Sopenharmony_ci { 22579200, 44100, .v = { 1, 16, }, }, 40862306a36Sopenharmony_ci { 22579200, 48000, .v = { 10, 147, }, }, 40962306a36Sopenharmony_ci { 22579200, 88200, .v = { 1, 8, }, }, 41062306a36Sopenharmony_ci { 22579200, 96000, .v = { 20, 147, }, }, 41162306a36Sopenharmony_ci { 22579200, 176400, .v = { 1, 4, }, }, 41262306a36Sopenharmony_ci { 22579200, 192000, .v = { 40, 147, }, }, 41362306a36Sopenharmony_ci { 22579200, 352800, .v = { 1, 2, }, }, 41462306a36Sopenharmony_ci { 22579200, 384000, .v = { 80, 147, }, }, 41562306a36Sopenharmony_ci { 24576000, 32000, .v = { 1, 24, }, }, 41662306a36Sopenharmony_ci { 24576000, 44100, .v = { 147, 2560, }, }, 41762306a36Sopenharmony_ci { 24576000, 48000, .v = { 1, 16, }, }, 41862306a36Sopenharmony_ci { 24576000, 88200, .v = { 147, 1280, }, }, 41962306a36Sopenharmony_ci { 24576000, 96000, .v = { 1, 8, }, }, 42062306a36Sopenharmony_ci { 24576000, 176400, .v = { 147, 640, }, }, 42162306a36Sopenharmony_ci { 24576000, 192000, .v = { 1, 4, }, }, 42262306a36Sopenharmony_ci { 24576000, 352800, .v = { 147, 320, }, }, 42362306a36Sopenharmony_ci { 24576000, 384000, .v = { 1, 2, }, }, 42462306a36Sopenharmony_ci}; 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci/* frm_size = 48 */ 42762306a36Sopenharmony_cistatic const struct cs43130_clk_gen cs43130_48_clk_gen[] = { 42862306a36Sopenharmony_ci { 22579200, 32000, .v = { 100, 147, }, }, 42962306a36Sopenharmony_ci { 22579200, 44100, .v = { 3, 32, }, }, 43062306a36Sopenharmony_ci { 22579200, 48000, .v = { 5, 49, }, }, 43162306a36Sopenharmony_ci { 22579200, 88200, .v = { 3, 16, }, }, 43262306a36Sopenharmony_ci { 22579200, 96000, .v = { 10, 49, }, }, 43362306a36Sopenharmony_ci { 22579200, 176400, .v = { 3, 8, }, }, 43462306a36Sopenharmony_ci { 22579200, 192000, .v = { 20, 49, }, }, 43562306a36Sopenharmony_ci { 22579200, 352800, .v = { 3, 4, }, }, 43662306a36Sopenharmony_ci { 22579200, 384000, .v = { 40, 49, }, }, 43762306a36Sopenharmony_ci { 24576000, 32000, .v = { 1, 16, }, }, 43862306a36Sopenharmony_ci { 24576000, 44100, .v = { 441, 5120, }, }, 43962306a36Sopenharmony_ci { 24576000, 48000, .v = { 3, 32, }, }, 44062306a36Sopenharmony_ci { 24576000, 88200, .v = { 441, 2560, }, }, 44162306a36Sopenharmony_ci { 24576000, 96000, .v = { 3, 16, }, }, 44262306a36Sopenharmony_ci { 24576000, 176400, .v = { 441, 1280, }, }, 44362306a36Sopenharmony_ci { 24576000, 192000, .v = { 3, 8, }, }, 44462306a36Sopenharmony_ci { 24576000, 352800, .v = { 441, 640, }, }, 44562306a36Sopenharmony_ci { 24576000, 384000, .v = { 3, 4, }, }, 44662306a36Sopenharmony_ci}; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci/* frm_size = 64 */ 44962306a36Sopenharmony_cistatic const struct cs43130_clk_gen cs43130_64_clk_gen[] = { 45062306a36Sopenharmony_ci { 22579200, 32000, .v = { 40, 441, }, }, 45162306a36Sopenharmony_ci { 22579200, 44100, .v = { 1, 8, }, }, 45262306a36Sopenharmony_ci { 22579200, 48000, .v = { 20, 147, }, }, 45362306a36Sopenharmony_ci { 22579200, 88200, .v = { 1, 4, }, }, 45462306a36Sopenharmony_ci { 22579200, 96000, .v = { 40, 147, }, }, 45562306a36Sopenharmony_ci { 22579200, 176400, .v = { 1, 2, }, }, 45662306a36Sopenharmony_ci { 22579200, 192000, .v = { 80, 147, }, }, 45762306a36Sopenharmony_ci { 22579200, 352800, .v = { 1, 1, }, }, 45862306a36Sopenharmony_ci { 24576000, 32000, .v = { 1, 12, }, }, 45962306a36Sopenharmony_ci { 24576000, 44100, .v = { 147, 1280, }, }, 46062306a36Sopenharmony_ci { 24576000, 48000, .v = { 1, 8, }, }, 46162306a36Sopenharmony_ci { 24576000, 88200, .v = { 147, 640, }, }, 46262306a36Sopenharmony_ci { 24576000, 96000, .v = { 1, 4, }, }, 46362306a36Sopenharmony_ci { 24576000, 176400, .v = { 147, 320, }, }, 46462306a36Sopenharmony_ci { 24576000, 192000, .v = { 1, 2, }, }, 46562306a36Sopenharmony_ci { 24576000, 352800, .v = { 147, 160, }, }, 46662306a36Sopenharmony_ci { 24576000, 384000, .v = { 1, 1, }, }, 46762306a36Sopenharmony_ci}; 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_cistruct cs43130_bitwidth_map { 47062306a36Sopenharmony_ci unsigned int bitwidth; 47162306a36Sopenharmony_ci u8 sp_bit; 47262306a36Sopenharmony_ci u8 ch_bit; 47362306a36Sopenharmony_ci}; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_cistruct cs43130_rate_map { 47662306a36Sopenharmony_ci int fs; 47762306a36Sopenharmony_ci int val; 47862306a36Sopenharmony_ci}; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci#define HP_LEFT 0 48162306a36Sopenharmony_ci#define HP_RIGHT 1 48262306a36Sopenharmony_ci#define CS43130_AC_FREQ 10 48362306a36Sopenharmony_ci#define CS43130_DC_THRESHOLD 2 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci#define CS43130_NUM_SUPPLIES 5 48662306a36Sopenharmony_cistatic const char *const cs43130_supply_names[CS43130_NUM_SUPPLIES] = { 48762306a36Sopenharmony_ci "VA", 48862306a36Sopenharmony_ci "VP", 48962306a36Sopenharmony_ci "VCP", 49062306a36Sopenharmony_ci "VD", 49162306a36Sopenharmony_ci "VL", 49262306a36Sopenharmony_ci}; 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci#define CS43130_NUM_INT 5 /* number of interrupt status reg */ 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cistruct cs43130_dai { 49762306a36Sopenharmony_ci unsigned int sclk; 49862306a36Sopenharmony_ci unsigned int dai_format; 49962306a36Sopenharmony_ci unsigned int dai_mode; 50062306a36Sopenharmony_ci}; 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_cistruct cs43130_private { 50362306a36Sopenharmony_ci struct snd_soc_component *component; 50462306a36Sopenharmony_ci struct regmap *regmap; 50562306a36Sopenharmony_ci struct regulator_bulk_data supplies[CS43130_NUM_SUPPLIES]; 50662306a36Sopenharmony_ci struct gpio_desc *reset_gpio; 50762306a36Sopenharmony_ci unsigned int dev_id; /* codec device ID */ 50862306a36Sopenharmony_ci int xtal_ibias; 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_ci /* shared by both DAIs */ 51162306a36Sopenharmony_ci struct mutex clk_mutex; 51262306a36Sopenharmony_ci int clk_req; 51362306a36Sopenharmony_ci bool pll_bypass; 51462306a36Sopenharmony_ci struct completion xtal_rdy; 51562306a36Sopenharmony_ci struct completion pll_rdy; 51662306a36Sopenharmony_ci unsigned int mclk; 51762306a36Sopenharmony_ci unsigned int mclk_int; 51862306a36Sopenharmony_ci int mclk_int_src; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci /* DAI specific */ 52162306a36Sopenharmony_ci struct cs43130_dai dais[CS43130_DAI_ID_MAX]; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci /* HP load specific */ 52462306a36Sopenharmony_ci bool dc_meas; 52562306a36Sopenharmony_ci bool ac_meas; 52662306a36Sopenharmony_ci bool hpload_done; 52762306a36Sopenharmony_ci struct completion hpload_evt; 52862306a36Sopenharmony_ci unsigned int hpload_stat; 52962306a36Sopenharmony_ci u16 hpload_dc[2]; 53062306a36Sopenharmony_ci u16 dc_threshold[CS43130_DC_THRESHOLD]; 53162306a36Sopenharmony_ci u16 ac_freq[CS43130_AC_FREQ]; 53262306a36Sopenharmony_ci u16 hpload_ac[CS43130_AC_FREQ][2]; 53362306a36Sopenharmony_ci struct workqueue_struct *wq; 53462306a36Sopenharmony_ci struct work_struct work; 53562306a36Sopenharmony_ci struct snd_soc_jack jack; 53662306a36Sopenharmony_ci}; 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_ci#endif /* __CS43130_H__ */ 539