Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * CS530x CODEC driver internal data
  4 *
  5 * Copyright (C) 2023-2024 Cirrus Logic, Inc. and
  6 *                         Cirrus Logic International Semiconductor Ltd.
  7 */
  8
  9#ifndef _CS530X_H
 10#define _CS530X_H
 11
 12#include <linux/device.h>
 13#include <linux/gpio/consumer.h>
 14#include <linux/regmap.h>
 15#include <linux/regulator/consumer.h>
 16
 17/* Devices */
 18#define CS530X_2CH_ADC_DEV_ID		 0x5302
 19#define CS530X_4CH_ADC_DEV_ID		 0x5304
 20#define CS530X_8CH_ADC_DEV_ID		 0x5308
 21
 22/* Registers */
 23
 24#define CS530X_DEVID			0x0000000
 25#define CS530X_REVID			0x0000004
 26#define CS530X_SW_RESET			0x0000022
 27
 28#define CS530X_CLK_CFG_0		0x0000040
 29#define CS530X_CLK_CFG_1		0x0000042
 30#define CS530X_CHIP_ENABLE		0x0000044
 31#define CS530X_ASP_CFG			0x0000048
 32#define CS530X_SIGNAL_PATH_CFG		0x0000050
 33#define CS530X_IN_ENABLES		0x0000080
 34#define CS530X_IN_RAMP_SUM		0x0000082
 35#define CS530X_IN_FILTER		0x0000086
 36#define CS530X_IN_HIZ			0x0000088
 37#define CS530X_IN_INV			0x000008A
 38#define CS530X_IN_VOL_CTRL1_0	        0x0000090
 39#define CS530X_IN_VOL_CTRL1_1	        0x0000092
 40#define CS530X_IN_VOL_CTRL2_0	        0x0000094
 41#define CS530X_IN_VOL_CTRL2_1	        0x0000096
 42#define CS530X_IN_VOL_CTRL3_0	        0x0000098
 43#define CS530X_IN_VOL_CTRL3_1	        0x000009A
 44#define CS530X_IN_VOL_CTRL4_0	        0x000009C
 45#define CS530X_IN_VOL_CTRL4_1	        0x000009E
 46#define CS530X_IN_VOL_CTRL5		0x00000A0
 47
 48#define CS530X_PAD_FN			0x0003D24
 49#define CS530X_PAD_LVL			0x0003D28
 50
 51#define CS530X_MAX_REGISTER		CS530X_PAD_LVL
 52
 53/* Register Fields */
 54
 55/* REVID */
 56#define CS530X_MTLREVID			GENMASK(3, 0)
 57#define CS530X_AREVID			GENMASK(7, 4)
 58
 59/* SW_RESET */
 60#define CS530X_SW_RST_SHIFT		8
 61#define CS530X_SW_RST_VAL		(0x5A << CS530X_SW_RST_SHIFT)
 62
 63/* CLK_CFG_0 */
 64#define CS530X_PLL_REFCLK_SRC_MASK	BIT(0)
 65#define CS530X_PLL_REFCLK_FREQ_MASK	GENMASK(5, 4)
 66#define CS530X_SYSCLK_SRC_MASK		BIT(12)
 67#define CS530X_SYSCLK_SRC_SHIFT		12
 68#define CS530X_REFCLK_2P822_3P072	0
 69#define CS530X_REFCLK_5P6448_6P144	0x10
 70#define CS530X_REFCLK_11P2896_12P288	0x20
 71#define CS530X_REFCLK_24P5792_24P576	0x30
 72
 73/* CLK_CFG_1 */
 74#define CS530X_SAMPLE_RATE_MASK		GENMASK(2, 0)
 75#define CS530X_FS_32K			0
 76#define CS530X_FS_48K_44P1K		1
 77#define CS530X_FS_96K_88P2K		2
 78#define CS530X_FS_192K_176P4K		3
 79#define CS530X_FS_384K_356P8K		4
 80#define CS530X_FS_768K_705P6K		5
 81
 82/* CHIP_ENABLE */
 83#define CS530X_GLOBAL_EN		BIT(0)
 84
 85/* ASP_CFG */
 86#define CS530X_ASP_BCLK_FREQ_MASK	GENMASK(1, 0)
 87#define CS530X_ASP_PRIMARY		BIT(5)
 88#define CS530X_ASP_BCLK_INV		BIT(6)
 89#define CS530X_BCLK_2P822_3P072		0
 90#define CS530X_BCLK_5P6448_6P144	1
 91#define CS530X_BCLK_11P2896_12P288	2
 92#define CS530X_BCLK_24P5792_24P576	3
 93
 94/* SIGNAL_PATH_CFG */
 95#define CS530X_ASP_FMT_MASK		GENMASK(2, 0)
 96#define CS530X_ASP_TDM_SLOT_MASK	GENMASK(5, 3)
 97#define CS530X_ASP_TDM_SLOT_SHIFT	3
 98#define CS530X_ASP_CH_REVERSE		BIT(9)
 99#define CS530X_TDM_EN_MASK		BIT(2)
100#define CS530X_ASP_FMT_I2S		0
101#define CS530X_ASP_FMT_LJ		1
102#define CS530X_ASP_FMT_DSP_A		0x6
103
104/* TDM Slots */
105#define CS530X_0_1_TDM_SLOT_MASK	GENMASK(1, 0)
106#define CS530X_0_3_TDM_SLOT_MASK	GENMASK(3, 0)
107#define CS530X_0_7_TDM_SLOT_MASK	GENMASK(7, 0)
108#define CS530X_0_7_TDM_SLOT_VAL		0
109
110#define CS530X_2_3_TDM_SLOT_MASK	GENMASK(3, 2)
111#define CS530X_2_3_TDM_SLOT_VAL		1
112
113#define CS530X_4_5_TDM_SLOT_MASK	GENMASK(5, 4)
114#define CS530X_4_7_TDM_SLOT_MASK	GENMASK(7, 4)
115#define CS530X_4_7_TDM_SLOT_VAL		2
116
117#define CS530X_6_7_TDM_SLOT_MASK	GENMASK(7, 6)
118#define CS530X_6_7_TDM_SLOT_VAL		3
119
120#define CS530X_8_9_TDM_SLOT_MASK	GENMASK(9, 8)
121#define CS530X_8_11_TDM_SLOT_MASK	GENMASK(11, 8)
122#define CS530X_8_15_TDM_SLOT_MASK	GENMASK(15, 8)
123#define CS530X_8_15_TDM_SLOT_VAL	4
124
125#define CS530X_10_11_TDM_SLOT_MASK	GENMASK(11, 10)
126#define CS530X_10_11_TDM_SLOT_VAL	5
127
128#define CS530X_12_13_TDM_SLOT_MASK	GENMASK(13, 12)
129#define CS530X_12_15_TDM_SLOT_MASK	GENMASK(15, 12)
130#define CS530X_12_15_TDM_SLOT_VAL	6
131
132#define CS530X_14_15_TDM_SLOT_MASK	GENMASK(15, 14)
133#define CS530X_14_15_TDM_SLOT_VAL	7
134
135/* IN_RAMP_SUM */
136#define CS530X_RAMP_RATE_INC_SHIFT	0
137#define CS530X_RAMP_RATE_DEC_SHIFT	4
138#define CS530X_IN_SUM_MODE_SHIFT	13
139
140/* IN_FILTER */
141#define CS530X_IN_FILTER_SHIFT		8
142#define CS530X_IN_HPF_EN_SHIFT		12
143
144/* IN_HIZ */
145#define CS530X_IN12_HIZ			BIT(0)
146#define CS530X_IN34_HIZ			BIT(1)
147#define CS530X_IN56_HIZ			BIT(2)
148#define CS530X_IN78_HIZ			BIT(3)
149
150/* IN_INV */
151#define CS530X_IN1_INV_SHIFT		0
152#define CS530X_IN2_INV_SHIFT		1
153#define CS530X_IN3_INV_SHIFT		2
154#define CS530X_IN4_INV_SHIFT		3
155#define CS530X_IN5_INV_SHIFT		4
156#define CS530X_IN6_INV_SHIFT		5
157#define CS530X_IN7_INV_SHIFT		6
158#define CS530X_IN8_INV_SHIFT		7
159
160/* IN_VOL_CTLy_z */
161#define CS530X_IN_MUTE			BIT(15)
162
163/* IN_VOL_CTL5 */
164#define CS530X_IN_VU			BIT(0)
165
166/* PAD_FN */
167#define CS530X_DOUT2_FN			BIT(0)
168#define CS530X_DOUT3_FN			BIT(1)
169#define CS530X_DOUT4_FN			BIT(2)
170#define CS530X_SPI_CS_FN		BIT(3)
171#define CS530X_CONFIG2_FN		BIT(6)
172#define CS530X_CONFIG3_FN		BIT(7)
173#define CS530X_CONFIG4_FN		BIT(8)
174#define CS530X_CONFIG5_FN		BIT(9)
175
176/* PAD_LVL */
177#define CS530X_CONFIG2_LVL		BIT(6)
178#define CS530X_CONFIG3_LVL		BIT(7)
179#define CS530X_CONFIG4_LVL		BIT(8)
180#define CS530X_CONFIG5_LVL		BIT(9)
181
182/* System Clock Source */
183#define CS530X_SYSCLK_SRC_MCLK		0
184#define CS530X_SYSCLK_SRC_PLL		1
185
186/* PLL Reference Clock Source */
187#define CS530X_PLL_SRC_BCLK		0
188#define CS530X_PLL_SRC_MCLK		1
189
190#define CS530X_NUM_SUPPLIES		2
191
192enum cs530x_type {
193	CS5302,
194	CS5304,
195	CS5308,
196};
197
198/* codec private data */
199struct cs530x_priv {
200	struct regmap *regmap;
201	struct device *dev;
202	struct snd_soc_dai_driver *dev_dai;
203
204	enum cs530x_type devtype;
205	int num_adcs;
206	int num_dacs;
207
208	struct regulator_bulk_data supplies[CS530X_NUM_SUPPLIES];
209
210	unsigned int mclk_rate;
211
212	int tdm_width;
213	int tdm_slots;
214	int fs;
215	int adc_pairs_count;
216
217	struct gpio_desc *reset_gpio;
218};
219
220extern const struct regmap_config cs530x_regmap;
221int cs530x_probe(struct cs530x_priv *cs530x);
222
223#endif