root/sound/soc/codecs/cs530x.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * CS530x CODEC driver internal data
 *
 * Copyright (C) 2023-2025 Cirrus Logic, Inc. and
 *                         Cirrus Logic International Semiconductor Ltd.
 */

#ifndef _CS530X_H
#define _CS530X_H

#include <linux/device.h>
#include <linux/gpio/consumer.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>

/* Devices */
#define CS530X_2CH_CODEC_DEV_ID          0x4282
#define CS530X_2CH_DAC_DEV_ID            0x4302
#define CS530X_4CH_DAC_DEV_ID            0x4304
#define CS530X_8CH_DAC_DEV_ID            0x4308
#define CS530X_2CH_ADC_DEV_ID            0x5302
#define CS530X_4CH_ADC_DEV_ID            0x5304
#define CS530X_8CH_ADC_DEV_ID            0x5308

/* Registers */

#define CS530X_DEVID                    0x0000000
#define CS530X_REVID                    0x0000004
#define CS530X_SW_RESET                 0x0000022

#define CS530X_CLK_CFG_0                0x0000040
#define CS530X_CLK_CFG_1                0x0000042
#define CS530X_CHIP_ENABLE              0x0000044
#define CS530X_ASP_CFG                  0x0000048
#define CS530X_SIGNAL_PATH_CFG          0x0000050
#define CS530X_IN_ENABLES               0x0000080
#define CS530X_IN_RAMP_SUM              0x0000082
#define CS530X_IN_FILTER                0x0000086
#define CS530X_IN_HIZ                   0x0000088
#define CS530X_IN_INV                   0x000008A
#define CS530X_IN_VOL_CTRL1_0           0x0000090
#define CS530X_IN_VOL_CTRL1_1           0x0000092
#define CS530X_IN_VOL_CTRL2_0           0x0000094
#define CS530X_IN_VOL_CTRL2_1           0x0000096
#define CS530X_IN_VOL_CTRL3_0           0x0000098
#define CS530X_IN_VOL_CTRL3_1           0x000009A
#define CS530X_IN_VOL_CTRL4_0           0x000009C
#define CS530X_IN_VOL_CTRL4_1           0x000009E
#define CS530X_IN_VOL_CTRL5             0x00000A0

#define CS530X_OUT_ENABLES              0x00000C0
#define CS530X_OUT_RAMP_SUM             0x00000C2
#define CS530X_OUT_DEEMPH               0x00000C4
#define CS530X_OUT_FILTER               0x00000C6
#define CS530X_OUT_INV                  0x00000CA
#define CS530X_OUT_VOL_CTRL1_0          0x00000D0
#define CS530X_OUT_VOL_CTRL1_1          0x00000D2
#define CS530X_OUT_VOL_CTRL2_0          0x00000D4
#define CS530X_OUT_VOL_CTRL2_1          0x00000D6
#define CS530X_OUT_VOL_CTRL3_0          0x00000D8
#define CS530X_OUT_VOL_CTRL3_1          0x00000DA
#define CS530X_OUT_VOL_CTRL4_0          0x00000DC
#define CS530X_OUT_VOL_CTRL4_1          0x00000DE
#define CS530X_OUT_VOL_CTRL5            0x00000E0

#define CS530X_PAD_FN                   0x0003D24
#define CS530X_PAD_LVL                  0x0003D28

#define CS530X_MAX_REGISTER             CS530X_PAD_LVL

/* Register Fields */

/* REVID */
#define CS530X_MTLREVID                 GENMASK(3, 0)
#define CS530X_AREVID                   GENMASK(7, 4)

/* SW_RESET */
#define CS530X_SW_RST_SHIFT             8
#define CS530X_SW_RST_VAL               (0x5A << CS530X_SW_RST_SHIFT)

/* CLK_CFG_0 */
#define CS530X_PLL_REFCLK_SRC_MASK      BIT(0)
#define CS530X_PLL_REFCLK_FREQ_MASK     GENMASK(5, 4)
#define CS530X_SYSCLK_SRC_MASK          BIT(12)
#define CS530X_SYSCLK_SRC_SHIFT         12
#define CS530X_REFCLK_2P822_3P072       0
#define CS530X_REFCLK_5P6448_6P144      0x10
#define CS530X_REFCLK_11P2896_12P288    0x20
#define CS530X_REFCLK_24P5792_24P576    0x30

/* CLK_CFG_1 */
#define CS530X_SAMPLE_RATE_MASK         GENMASK(2, 0)
#define CS530X_FS_32K                   0
#define CS530X_FS_44P1K_48K             1
#define CS530X_FS_88P2K_96K             2
#define CS530X_FS_176P4K_192K           3
#define CS530X_FS_356P8K_384K           4
#define CS530X_FS_705P6K_768K           5

/* CHIP_ENABLE */
#define CS530X_GLOBAL_EN                BIT(0)

/* ASP_CFG */
#define CS530X_ASP_BCLK_FREQ_MASK       GENMASK(1, 0)
#define CS530X_ASP_PRIMARY              BIT(5)
#define CS530X_ASP_BCLK_INV             BIT(6)
#define CS530X_BCLK_2P822_3P072         0
#define CS530X_BCLK_5P6448_6P144        1
#define CS530X_BCLK_11P2896_12P288      2
#define CS530X_BCLK_24P5792_24P576      3

/* SIGNAL_PATH_CFG */
#define CS530X_ASP_FMT_MASK             GENMASK(2, 0)
#define CS530X_ASP_TDM_SLOT_MASK        GENMASK(5, 3)
#define CS530X_ASP_TDM_SLOT_SHIFT       3
#define CS530X_ASP_CH_REVERSE           BIT(9)
#define CS530X_TDM_EN_MASK              BIT(2)
#define CS530X_ASP_FMT_I2S              0
#define CS530X_ASP_FMT_LJ               1
#define CS530X_ASP_FMT_DSP_A            6

/* TDM Slots */
#define CS530X_0_1_TDM_SLOT_MASK        GENMASK(1, 0)
#define CS530X_0_3_TDM_SLOT_MASK        GENMASK(3, 0)
#define CS530X_0_7_TDM_SLOT_MASK        GENMASK(7, 0)
#define CS530X_0_7_TDM_SLOT_VAL         0

#define CS530X_2_3_TDM_SLOT_MASK        GENMASK(3, 2)
#define CS530X_2_3_TDM_SLOT_VAL         1

#define CS530X_4_5_TDM_SLOT_MASK        GENMASK(5, 4)
#define CS530X_4_7_TDM_SLOT_MASK        GENMASK(7, 4)
#define CS530X_4_7_TDM_SLOT_VAL         2

#define CS530X_6_7_TDM_SLOT_MASK        GENMASK(7, 6)
#define CS530X_6_7_TDM_SLOT_VAL         3

#define CS530X_8_9_TDM_SLOT_MASK        GENMASK(9, 8)
#define CS530X_8_11_TDM_SLOT_MASK       GENMASK(11, 8)
#define CS530X_8_15_TDM_SLOT_MASK       GENMASK(15, 8)
#define CS530X_8_15_TDM_SLOT_VAL        4

#define CS530X_10_11_TDM_SLOT_MASK      GENMASK(11, 10)
#define CS530X_10_11_TDM_SLOT_VAL       5

#define CS530X_12_13_TDM_SLOT_MASK      GENMASK(13, 12)
#define CS530X_12_15_TDM_SLOT_MASK      GENMASK(15, 12)
#define CS530X_12_15_TDM_SLOT_VAL       6

#define CS530X_14_15_TDM_SLOT_MASK      GENMASK(15, 14)
#define CS530X_14_15_TDM_SLOT_VAL       7

/* IN_RAMP_SUM and OUT_RAMP_SUM */
#define CS530X_RAMP_RATE_INC_SHIFT      0
#define CS530X_RAMP_RATE_DEC_SHIFT      4
#define CS530X_INOUT_SUM_MODE_SHIFT     13

/* IN_FILTER and OUT_FILTER */
#define CS530X_INOUT_FILTER_SHIFT               8
#define CS530X_INOUT_HPF_EN_SHIFT               12

/* IN_HIZ */
#define CS530X_IN12_HIZ                 BIT(0)
#define CS530X_IN34_HIZ                 BIT(1)
#define CS530X_IN56_HIZ                 BIT(2)
#define CS530X_IN78_HIZ                 BIT(3)

/* IN_INV and OUT_INV */
#define CS530X_INOUT1_INV_SHIFT         0
#define CS530X_INOUT2_INV_SHIFT         1
#define CS530X_INOUT3_INV_SHIFT         2
#define CS530X_INOUT4_INV_SHIFT         3
#define CS530X_INOUT5_INV_SHIFT         4
#define CS530X_INOUT6_INV_SHIFT         5
#define CS530X_INOUT7_INV_SHIFT         6
#define CS530X_INOUT8_INV_SHIFT         7

/* IN_VOL_CTLy_z and OUT_VOL_CTLy_z */
#define CS530X_INOUT_MUTE                       BIT(15)

/* IN_VOL_CTL5 */
#define CS530X_IN_VU                    BIT(0)

/* PAD_FN */
#define CS530X_DOUT2_FN                 BIT(0)
#define CS530X_DOUT3_FN                 BIT(1)
#define CS530X_DOUT4_FN                 BIT(2)
#define CS530X_SPI_CS_FN                BIT(3)
#define CS530X_CONFIG2_FN               BIT(6)
#define CS530X_CONFIG3_FN               BIT(7)
#define CS530X_CONFIG4_FN               BIT(8)
#define CS530X_CONFIG5_FN               BIT(9)

/* PAD_LVL */
#define CS530X_CONFIG2_LVL              BIT(6)
#define CS530X_CONFIG3_LVL              BIT(7)
#define CS530X_CONFIG4_LVL              BIT(8)
#define CS530X_CONFIG5_LVL              BIT(9)
/* IN_VOL_CTL5 and OUT_VOL_CTL5 */
#define CS530X_INOUT_VU                 BIT(0)

/* MCLK Reference Source Frequency */
/* 41KHz related */
#define CS530X_SYSCLK_REF_45_1MHZ       45158400
/* 48KHz related */
#define CS530X_SYSCLK_REF_49_1MHZ       49152000

/* System Clock Source */
#define CS530X_SYSCLK_SRC_MCLK          0
#define CS530X_SYSCLK_SRC_PLL           1

/* PLL Reference Clock Source */
#define CS530X_PLL_SRC_BCLK             0
#define CS530X_PLL_SRC_MCLK             1

#define CS530X_NUM_SUPPLIES             2

enum cs530x_type {
        CS4282 = CS530X_2CH_CODEC_DEV_ID,
        CS4302 = CS530X_2CH_DAC_DEV_ID,
        CS4304 = CS530X_4CH_DAC_DEV_ID,
        CS4308 = CS530X_8CH_DAC_DEV_ID,
        CS5302 = CS530X_2CH_ADC_DEV_ID,
        CS5304 = CS530X_4CH_ADC_DEV_ID,
        CS5308 = CS530X_8CH_ADC_DEV_ID,
};

/* codec private data */
struct cs530x_priv {
        struct regmap *regmap;
        struct device *dev;
        struct snd_soc_dai_driver *dev_dai;

        enum cs530x_type devtype;
        int num_adcs;
        int num_dacs;

        struct regulator_bulk_data supplies[CS530X_NUM_SUPPLIES];

        int tdm_width;
        int tdm_slots;
        int adc_pairs_count;
        int dac_pairs_count;

        struct gpio_desc *reset_gpio;
};

extern const struct regmap_config cs530x_regmap_i2c;
extern const struct regmap_config cs530x_regmap_spi;
int cs530x_probe(struct cs530x_priv *cs530x);

#endif