xref: /linux/sound/soc/codecs/sta350.c (revision 33e02dc69afbd8f1b85a51d74d72f139ba4ca623)
1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   * Codec driver for ST STA350 2.1-channel high-efficiency digital audio system
4   *
5   * Copyright: 2014 Raumfeld GmbH
6   * Author: Sven Brandau <info@brandau.biz>
7   *
8   * based on code from:
9   *	Raumfeld GmbH
10   *	  Johannes Stezenbach <js@sig21.net>
11   *	Wolfson Microelectronics PLC.
12   *	  Mark Brown <broonie@opensource.wolfsonmicro.com>
13   *	Freescale Semiconductor, Inc.
14   *	  Timur Tabi <timur@freescale.com>
15   */
16  
17  #define pr_fmt(fmt) KBUILD_MODNAME ":%s:%d: " fmt, __func__, __LINE__
18  
19  #include <linux/module.h>
20  #include <linux/moduleparam.h>
21  #include <linux/init.h>
22  #include <linux/delay.h>
23  #include <linux/pm.h>
24  #include <linux/i2c.h>
25  #include <linux/of.h>
26  #include <linux/regmap.h>
27  #include <linux/regulator/consumer.h>
28  #include <linux/gpio/consumer.h>
29  #include <linux/slab.h>
30  #include <sound/core.h>
31  #include <sound/pcm.h>
32  #include <sound/pcm_params.h>
33  #include <sound/soc.h>
34  #include <sound/soc-dapm.h>
35  #include <sound/initval.h>
36  #include <sound/tlv.h>
37  
38  #include <sound/sta350.h>
39  #include "sta350.h"
40  
41  #define STA350_RATES (SNDRV_PCM_RATE_32000 | \
42  		      SNDRV_PCM_RATE_44100 | \
43  		      SNDRV_PCM_RATE_48000 | \
44  		      SNDRV_PCM_RATE_88200 | \
45  		      SNDRV_PCM_RATE_96000 | \
46  		      SNDRV_PCM_RATE_176400 | \
47  		      SNDRV_PCM_RATE_192000)
48  
49  #define STA350_FORMATS \
50  	(SNDRV_PCM_FMTBIT_S16_LE  | SNDRV_PCM_FMTBIT_S18_3LE | \
51  	 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_3LE | \
52  	 SNDRV_PCM_FMTBIT_S24_LE  | SNDRV_PCM_FMTBIT_S32_LE)
53  
54  /* Power-up register defaults */
55  static const struct reg_default sta350_regs[] = {
56  	{  0x0, 0x63 },
57  	{  0x1, 0x80 },
58  	{  0x2, 0xdf },
59  	{  0x3, 0x40 },
60  	{  0x4, 0xc2 },
61  	{  0x5, 0x5c },
62  	{  0x6, 0x00 },
63  	{  0x7, 0xff },
64  	{  0x8, 0x60 },
65  	{  0x9, 0x60 },
66  	{  0xa, 0x60 },
67  	{  0xb, 0x00 },
68  	{  0xc, 0x00 },
69  	{  0xd, 0x00 },
70  	{  0xe, 0x00 },
71  	{  0xf, 0x40 },
72  	{ 0x10, 0x80 },
73  	{ 0x11, 0x77 },
74  	{ 0x12, 0x6a },
75  	{ 0x13, 0x69 },
76  	{ 0x14, 0x6a },
77  	{ 0x15, 0x69 },
78  	{ 0x16, 0x00 },
79  	{ 0x17, 0x00 },
80  	{ 0x18, 0x00 },
81  	{ 0x19, 0x00 },
82  	{ 0x1a, 0x00 },
83  	{ 0x1b, 0x00 },
84  	{ 0x1c, 0x00 },
85  	{ 0x1d, 0x00 },
86  	{ 0x1e, 0x00 },
87  	{ 0x1f, 0x00 },
88  	{ 0x20, 0x00 },
89  	{ 0x21, 0x00 },
90  	{ 0x22, 0x00 },
91  	{ 0x23, 0x00 },
92  	{ 0x24, 0x00 },
93  	{ 0x25, 0x00 },
94  	{ 0x26, 0x00 },
95  	{ 0x27, 0x2a },
96  	{ 0x28, 0xc0 },
97  	{ 0x29, 0xf3 },
98  	{ 0x2a, 0x33 },
99  	{ 0x2b, 0x00 },
100  	{ 0x2c, 0x0c },
101  	{ 0x31, 0x00 },
102  	{ 0x36, 0x00 },
103  	{ 0x37, 0x00 },
104  	{ 0x38, 0x00 },
105  	{ 0x39, 0x01 },
106  	{ 0x3a, 0xee },
107  	{ 0x3b, 0xff },
108  	{ 0x3c, 0x7e },
109  	{ 0x3d, 0xc0 },
110  	{ 0x3e, 0x26 },
111  	{ 0x3f, 0x00 },
112  	{ 0x48, 0x00 },
113  	{ 0x49, 0x00 },
114  	{ 0x4a, 0x00 },
115  	{ 0x4b, 0x04 },
116  	{ 0x4c, 0x00 },
117  };
118  
119  static const struct regmap_range sta350_write_regs_range[] = {
120  	regmap_reg_range(STA350_CONFA,  STA350_AUTO2),
121  	regmap_reg_range(STA350_C1CFG,  STA350_FDRC2),
122  	regmap_reg_range(STA350_EQCFG,  STA350_EVOLRES),
123  	regmap_reg_range(STA350_NSHAPE, STA350_MISC2),
124  };
125  
126  static const struct regmap_range sta350_read_regs_range[] = {
127  	regmap_reg_range(STA350_CONFA,  STA350_AUTO2),
128  	regmap_reg_range(STA350_C1CFG,  STA350_STATUS),
129  	regmap_reg_range(STA350_EQCFG,  STA350_EVOLRES),
130  	regmap_reg_range(STA350_NSHAPE, STA350_MISC2),
131  };
132  
133  static const struct regmap_range sta350_volatile_regs_range[] = {
134  	regmap_reg_range(STA350_CFADDR2, STA350_CFUD),
135  	regmap_reg_range(STA350_STATUS,  STA350_STATUS),
136  };
137  
138  static const struct regmap_access_table sta350_write_regs = {
139  	.yes_ranges =	sta350_write_regs_range,
140  	.n_yes_ranges =	ARRAY_SIZE(sta350_write_regs_range),
141  };
142  
143  static const struct regmap_access_table sta350_read_regs = {
144  	.yes_ranges =	sta350_read_regs_range,
145  	.n_yes_ranges =	ARRAY_SIZE(sta350_read_regs_range),
146  };
147  
148  static const struct regmap_access_table sta350_volatile_regs = {
149  	.yes_ranges =	sta350_volatile_regs_range,
150  	.n_yes_ranges =	ARRAY_SIZE(sta350_volatile_regs_range),
151  };
152  
153  /* regulator power supply names */
154  static const char * const sta350_supply_names[] = {
155  	"vdd-dig",	/* digital supply, 3.3V */
156  	"vdd-pll",	/* pll supply, 3.3V */
157  	"vcc"		/* power amp supply, 5V - 26V */
158  };
159  
160  /* codec private data */
161  struct sta350_priv {
162  	struct regmap *regmap;
163  	struct regulator_bulk_data supplies[ARRAY_SIZE(sta350_supply_names)];
164  	struct sta350_platform_data *pdata;
165  
166  	unsigned int mclk;
167  	unsigned int format;
168  
169  	u32 coef_shadow[STA350_COEF_COUNT];
170  	int shutdown;
171  
172  	struct gpio_desc *gpiod_nreset;
173  	struct gpio_desc *gpiod_power_down;
174  
175  	struct mutex coeff_lock;
176  };
177  
178  static const DECLARE_TLV_DB_SCALE(mvol_tlv, -12750, 50, 1);
179  static const DECLARE_TLV_DB_SCALE(chvol_tlv, -7950, 50, 1);
180  static const DECLARE_TLV_DB_SCALE(tone_tlv, -1200, 200, 0);
181  
182  static const char * const sta350_drc_ac[] = {
183  	"Anti-Clipping", "Dynamic Range Compression"
184  };
185  static const char * const sta350_auto_gc_mode[] = {
186  	"User", "AC no clipping", "AC limited clipping (10%)",
187  	"DRC nighttime listening mode"
188  };
189  static const char * const sta350_auto_xo_mode[] = {
190  	"User", "80Hz", "100Hz", "120Hz", "140Hz", "160Hz", "180Hz",
191  	"200Hz", "220Hz", "240Hz", "260Hz", "280Hz", "300Hz", "320Hz",
192  	"340Hz", "360Hz"
193  };
194  static const char * const sta350_binary_output[] = {
195  	"FFX 3-state output - normal operation", "Binary output"
196  };
197  static const char * const sta350_limiter_select[] = {
198  	"Limiter Disabled", "Limiter #1", "Limiter #2"
199  };
200  static const char * const sta350_limiter_attack_rate[] = {
201  	"3.1584", "2.7072", "2.2560", "1.8048", "1.3536", "0.9024",
202  	"0.4512", "0.2256", "0.1504", "0.1123", "0.0902", "0.0752",
203  	"0.0645", "0.0564", "0.0501", "0.0451"
204  };
205  static const char * const sta350_limiter_release_rate[] = {
206  	"0.5116", "0.1370", "0.0744", "0.0499", "0.0360", "0.0299",
207  	"0.0264", "0.0208", "0.0198", "0.0172", "0.0147", "0.0137",
208  	"0.0134", "0.0117", "0.0110", "0.0104"
209  };
210  static const char * const sta350_noise_shaper_type[] = {
211  	"Third order", "Fourth order"
212  };
213  
214  static DECLARE_TLV_DB_RANGE(sta350_limiter_ac_attack_tlv,
215  	0, 7, TLV_DB_SCALE_ITEM(-1200, 200, 0),
216  	8, 16, TLV_DB_SCALE_ITEM(300, 100, 0),
217  );
218  
219  static DECLARE_TLV_DB_RANGE(sta350_limiter_ac_release_tlv,
220  	0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 0),
221  	1, 1, TLV_DB_SCALE_ITEM(-2900, 0, 0),
222  	2, 2, TLV_DB_SCALE_ITEM(-2000, 0, 0),
223  	3, 8, TLV_DB_SCALE_ITEM(-1400, 200, 0),
224  	8, 16, TLV_DB_SCALE_ITEM(-700, 100, 0),
225  );
226  
227  static DECLARE_TLV_DB_RANGE(sta350_limiter_drc_attack_tlv,
228  	0, 7, TLV_DB_SCALE_ITEM(-3100, 200, 0),
229  	8, 13, TLV_DB_SCALE_ITEM(-1600, 100, 0),
230  	14, 16, TLV_DB_SCALE_ITEM(-1000, 300, 0),
231  );
232  
233  static DECLARE_TLV_DB_RANGE(sta350_limiter_drc_release_tlv,
234  	0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 0),
235  	1, 2, TLV_DB_SCALE_ITEM(-3800, 200, 0),
236  	3, 4, TLV_DB_SCALE_ITEM(-3300, 200, 0),
237  	5, 12, TLV_DB_SCALE_ITEM(-3000, 200, 0),
238  	13, 16, TLV_DB_SCALE_ITEM(-1500, 300, 0),
239  );
240  
241  static SOC_ENUM_SINGLE_DECL(sta350_drc_ac_enum,
242  			    STA350_CONFD, STA350_CONFD_DRC_SHIFT,
243  			    sta350_drc_ac);
244  static SOC_ENUM_SINGLE_DECL(sta350_noise_shaper_enum,
245  			    STA350_CONFE, STA350_CONFE_NSBW_SHIFT,
246  			    sta350_noise_shaper_type);
247  static SOC_ENUM_SINGLE_DECL(sta350_auto_gc_enum,
248  			    STA350_AUTO1, STA350_AUTO1_AMGC_SHIFT,
249  			    sta350_auto_gc_mode);
250  static SOC_ENUM_SINGLE_DECL(sta350_auto_xo_enum,
251  			    STA350_AUTO2, STA350_AUTO2_XO_SHIFT,
252  			    sta350_auto_xo_mode);
253  static SOC_ENUM_SINGLE_DECL(sta350_binary_output_ch1_enum,
254  			    STA350_C1CFG, STA350_CxCFG_BO_SHIFT,
255  			    sta350_binary_output);
256  static SOC_ENUM_SINGLE_DECL(sta350_binary_output_ch2_enum,
257  			    STA350_C2CFG, STA350_CxCFG_BO_SHIFT,
258  			    sta350_binary_output);
259  static SOC_ENUM_SINGLE_DECL(sta350_binary_output_ch3_enum,
260  			    STA350_C3CFG, STA350_CxCFG_BO_SHIFT,
261  			    sta350_binary_output);
262  static SOC_ENUM_SINGLE_DECL(sta350_limiter_ch1_enum,
263  			    STA350_C1CFG, STA350_CxCFG_LS_SHIFT,
264  			    sta350_limiter_select);
265  static SOC_ENUM_SINGLE_DECL(sta350_limiter_ch2_enum,
266  			    STA350_C2CFG, STA350_CxCFG_LS_SHIFT,
267  			    sta350_limiter_select);
268  static SOC_ENUM_SINGLE_DECL(sta350_limiter_ch3_enum,
269  			    STA350_C3CFG, STA350_CxCFG_LS_SHIFT,
270  			    sta350_limiter_select);
271  static SOC_ENUM_SINGLE_DECL(sta350_limiter1_attack_rate_enum,
272  			    STA350_L1AR, STA350_LxA_SHIFT,
273  			    sta350_limiter_attack_rate);
274  static SOC_ENUM_SINGLE_DECL(sta350_limiter2_attack_rate_enum,
275  			    STA350_L2AR, STA350_LxA_SHIFT,
276  			    sta350_limiter_attack_rate);
277  static SOC_ENUM_SINGLE_DECL(sta350_limiter1_release_rate_enum,
278  			    STA350_L1AR, STA350_LxR_SHIFT,
279  			    sta350_limiter_release_rate);
280  static SOC_ENUM_SINGLE_DECL(sta350_limiter2_release_rate_enum,
281  			    STA350_L2AR, STA350_LxR_SHIFT,
282  			    sta350_limiter_release_rate);
283  
284  /*
285   * byte array controls for setting biquad, mixer, scaling coefficients;
286   * for biquads all five coefficients need to be set in one go,
287   * mixer and pre/postscale coefs can be set individually;
288   * each coef is 24bit, the bytes are ordered in the same way
289   * as given in the STA350 data sheet (big endian; b1, b2, a1, a2, b0)
290   */
291  
sta350_coefficient_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)292  static int sta350_coefficient_info(struct snd_kcontrol *kcontrol,
293  				   struct snd_ctl_elem_info *uinfo)
294  {
295  	int numcoef = kcontrol->private_value >> 16;
296  	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
297  	uinfo->count = 3 * numcoef;
298  	return 0;
299  }
300  
sta350_coefficient_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)301  static int sta350_coefficient_get(struct snd_kcontrol *kcontrol,
302  				  struct snd_ctl_elem_value *ucontrol)
303  {
304  	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
305  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
306  	int numcoef = kcontrol->private_value >> 16;
307  	int index = kcontrol->private_value & 0xffff;
308  	unsigned int cfud, val;
309  	int i, ret = 0;
310  
311  	mutex_lock(&sta350->coeff_lock);
312  
313  	/* preserve reserved bits in STA350_CFUD */
314  	regmap_read(sta350->regmap, STA350_CFUD, &cfud);
315  	cfud &= 0xf0;
316  	/*
317  	 * chip documentation does not say if the bits are self clearing,
318  	 * so do it explicitly
319  	 */
320  	regmap_write(sta350->regmap, STA350_CFUD, cfud);
321  
322  	regmap_write(sta350->regmap, STA350_CFADDR2, index);
323  	if (numcoef == 1) {
324  		regmap_write(sta350->regmap, STA350_CFUD, cfud | 0x04);
325  	} else if (numcoef == 5) {
326  		regmap_write(sta350->regmap, STA350_CFUD, cfud | 0x08);
327  	} else {
328  		ret = -EINVAL;
329  		goto exit_unlock;
330  	}
331  
332  	for (i = 0; i < 3 * numcoef; i++) {
333  		regmap_read(sta350->regmap, STA350_B1CF1 + i, &val);
334  		ucontrol->value.bytes.data[i] = val;
335  	}
336  
337  exit_unlock:
338  	mutex_unlock(&sta350->coeff_lock);
339  
340  	return ret;
341  }
342  
sta350_coefficient_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)343  static int sta350_coefficient_put(struct snd_kcontrol *kcontrol,
344  				  struct snd_ctl_elem_value *ucontrol)
345  {
346  	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
347  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
348  	int numcoef = kcontrol->private_value >> 16;
349  	int index = kcontrol->private_value & 0xffff;
350  	unsigned int cfud;
351  	int i;
352  
353  	/* preserve reserved bits in STA350_CFUD */
354  	regmap_read(sta350->regmap, STA350_CFUD, &cfud);
355  	cfud &= 0xf0;
356  	/*
357  	 * chip documentation does not say if the bits are self clearing,
358  	 * so do it explicitly
359  	 */
360  	regmap_write(sta350->regmap, STA350_CFUD, cfud);
361  
362  	regmap_write(sta350->regmap, STA350_CFADDR2, index);
363  	for (i = 0; i < numcoef && (index + i < STA350_COEF_COUNT); i++)
364  		sta350->coef_shadow[index + i] =
365  			  (ucontrol->value.bytes.data[3 * i] << 16)
366  			| (ucontrol->value.bytes.data[3 * i + 1] << 8)
367  			| (ucontrol->value.bytes.data[3 * i + 2]);
368  	for (i = 0; i < 3 * numcoef; i++)
369  		regmap_write(sta350->regmap, STA350_B1CF1 + i,
370  			     ucontrol->value.bytes.data[i]);
371  	if (numcoef == 1)
372  		regmap_write(sta350->regmap, STA350_CFUD, cfud | 0x01);
373  	else if (numcoef == 5)
374  		regmap_write(sta350->regmap, STA350_CFUD, cfud | 0x02);
375  	else
376  		return -EINVAL;
377  
378  	return 0;
379  }
380  
sta350_sync_coef_shadow(struct snd_soc_component * component)381  static int sta350_sync_coef_shadow(struct snd_soc_component *component)
382  {
383  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
384  	unsigned int cfud;
385  	int i;
386  
387  	/* preserve reserved bits in STA350_CFUD */
388  	regmap_read(sta350->regmap, STA350_CFUD, &cfud);
389  	cfud &= 0xf0;
390  
391  	for (i = 0; i < STA350_COEF_COUNT; i++) {
392  		regmap_write(sta350->regmap, STA350_CFADDR2, i);
393  		regmap_write(sta350->regmap, STA350_B1CF1,
394  			     (sta350->coef_shadow[i] >> 16) & 0xff);
395  		regmap_write(sta350->regmap, STA350_B1CF2,
396  			     (sta350->coef_shadow[i] >> 8) & 0xff);
397  		regmap_write(sta350->regmap, STA350_B1CF3,
398  			     (sta350->coef_shadow[i]) & 0xff);
399  		/*
400  		 * chip documentation does not say if the bits are
401  		 * self-clearing, so do it explicitly
402  		 */
403  		regmap_write(sta350->regmap, STA350_CFUD, cfud);
404  		regmap_write(sta350->regmap, STA350_CFUD, cfud | 0x01);
405  	}
406  	return 0;
407  }
408  
sta350_cache_sync(struct snd_soc_component * component)409  static int sta350_cache_sync(struct snd_soc_component *component)
410  {
411  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
412  	unsigned int mute;
413  	int rc;
414  
415  	/* mute during register sync */
416  	regmap_read(sta350->regmap, STA350_CFUD, &mute);
417  	regmap_write(sta350->regmap, STA350_MMUTE, mute | STA350_MMUTE_MMUTE);
418  	sta350_sync_coef_shadow(component);
419  	rc = regcache_sync(sta350->regmap);
420  	regmap_write(sta350->regmap, STA350_MMUTE, mute);
421  	return rc;
422  }
423  
424  #define SINGLE_COEF(xname, index) \
425  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
426  	.info = sta350_coefficient_info, \
427  	.get = sta350_coefficient_get,\
428  	.put = sta350_coefficient_put, \
429  	.private_value = index | (1 << 16) }
430  
431  #define BIQUAD_COEFS(xname, index) \
432  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
433  	.info = sta350_coefficient_info, \
434  	.get = sta350_coefficient_get,\
435  	.put = sta350_coefficient_put, \
436  	.private_value = index | (5 << 16) }
437  
438  static const struct snd_kcontrol_new sta350_snd_controls[] = {
439  SOC_SINGLE_TLV("Master Volume", STA350_MVOL, 0, 0xff, 1, mvol_tlv),
440  /* VOL */
441  SOC_SINGLE_TLV("Ch1 Volume", STA350_C1VOL, 0, 0xff, 1, chvol_tlv),
442  SOC_SINGLE_TLV("Ch2 Volume", STA350_C2VOL, 0, 0xff, 1, chvol_tlv),
443  SOC_SINGLE_TLV("Ch3 Volume", STA350_C3VOL, 0, 0xff, 1, chvol_tlv),
444  /* CONFD */
445  SOC_SINGLE("High Pass Filter Bypass Switch",
446  	   STA350_CONFD, STA350_CONFD_HPB_SHIFT, 1, 1),
447  SOC_SINGLE("De-emphasis Filter Switch",
448  	   STA350_CONFD, STA350_CONFD_DEMP_SHIFT, 1, 0),
449  SOC_SINGLE("DSP Bypass Switch",
450  	   STA350_CONFD, STA350_CONFD_DSPB_SHIFT, 1, 0),
451  SOC_SINGLE("Post-scale Link Switch",
452  	   STA350_CONFD, STA350_CONFD_PSL_SHIFT, 1, 0),
453  SOC_SINGLE("Biquad Coefficient Link Switch",
454  	   STA350_CONFD, STA350_CONFD_BQL_SHIFT, 1, 0),
455  SOC_ENUM("Compressor/Limiter Switch", sta350_drc_ac_enum),
456  SOC_ENUM("Noise Shaper Bandwidth", sta350_noise_shaper_enum),
457  SOC_SINGLE("Zero-detect Mute Enable Switch",
458  	   STA350_CONFD, STA350_CONFD_ZDE_SHIFT, 1, 0),
459  SOC_SINGLE("Submix Mode Switch",
460  	   STA350_CONFD, STA350_CONFD_SME_SHIFT, 1, 0),
461  /* CONFE */
462  SOC_SINGLE("Zero Cross Switch", STA350_CONFE, STA350_CONFE_ZCE_SHIFT, 1, 0),
463  SOC_SINGLE("Soft Ramp Switch", STA350_CONFE, STA350_CONFE_SVE_SHIFT, 1, 0),
464  /* MUTE */
465  SOC_SINGLE("Master Switch", STA350_MMUTE, STA350_MMUTE_MMUTE_SHIFT, 1, 1),
466  SOC_SINGLE("Ch1 Switch", STA350_MMUTE, STA350_MMUTE_C1M_SHIFT, 1, 1),
467  SOC_SINGLE("Ch2 Switch", STA350_MMUTE, STA350_MMUTE_C2M_SHIFT, 1, 1),
468  SOC_SINGLE("Ch3 Switch", STA350_MMUTE, STA350_MMUTE_C3M_SHIFT, 1, 1),
469  /* AUTOx */
470  SOC_ENUM("Automode GC", sta350_auto_gc_enum),
471  SOC_ENUM("Automode XO", sta350_auto_xo_enum),
472  /* CxCFG */
473  SOC_SINGLE("Ch1 Tone Control Bypass Switch",
474  	   STA350_C1CFG, STA350_CxCFG_TCB_SHIFT, 1, 0),
475  SOC_SINGLE("Ch2 Tone Control Bypass Switch",
476  	   STA350_C2CFG, STA350_CxCFG_TCB_SHIFT, 1, 0),
477  SOC_SINGLE("Ch1 EQ Bypass Switch",
478  	   STA350_C1CFG, STA350_CxCFG_EQBP_SHIFT, 1, 0),
479  SOC_SINGLE("Ch2 EQ Bypass Switch",
480  	   STA350_C2CFG, STA350_CxCFG_EQBP_SHIFT, 1, 0),
481  SOC_SINGLE("Ch1 Master Volume Bypass Switch",
482  	   STA350_C1CFG, STA350_CxCFG_VBP_SHIFT, 1, 0),
483  SOC_SINGLE("Ch2 Master Volume Bypass Switch",
484  	   STA350_C1CFG, STA350_CxCFG_VBP_SHIFT, 1, 0),
485  SOC_SINGLE("Ch3 Master Volume Bypass Switch",
486  	   STA350_C1CFG, STA350_CxCFG_VBP_SHIFT, 1, 0),
487  SOC_ENUM("Ch1 Binary Output Select", sta350_binary_output_ch1_enum),
488  SOC_ENUM("Ch2 Binary Output Select", sta350_binary_output_ch2_enum),
489  SOC_ENUM("Ch3 Binary Output Select", sta350_binary_output_ch3_enum),
490  SOC_ENUM("Ch1 Limiter Select", sta350_limiter_ch1_enum),
491  SOC_ENUM("Ch2 Limiter Select", sta350_limiter_ch2_enum),
492  SOC_ENUM("Ch3 Limiter Select", sta350_limiter_ch3_enum),
493  /* TONE */
494  SOC_SINGLE_RANGE_TLV("Bass Tone Control Volume",
495  		     STA350_TONE, STA350_TONE_BTC_SHIFT, 1, 13, 0, tone_tlv),
496  SOC_SINGLE_RANGE_TLV("Treble Tone Control Volume",
497  		     STA350_TONE, STA350_TONE_TTC_SHIFT, 1, 13, 0, tone_tlv),
498  SOC_ENUM("Limiter1 Attack Rate (dB/ms)", sta350_limiter1_attack_rate_enum),
499  SOC_ENUM("Limiter2 Attack Rate (dB/ms)", sta350_limiter2_attack_rate_enum),
500  SOC_ENUM("Limiter1 Release Rate (dB/ms)", sta350_limiter1_release_rate_enum),
501  SOC_ENUM("Limiter2 Release Rate (dB/ms)", sta350_limiter2_release_rate_enum),
502  
503  /*
504   * depending on mode, the attack/release thresholds have
505   * two different enum definitions; provide both
506   */
507  SOC_SINGLE_TLV("Limiter1 Attack Threshold (AC Mode)",
508  	       STA350_L1ATRT, STA350_LxA_SHIFT,
509  	       16, 0, sta350_limiter_ac_attack_tlv),
510  SOC_SINGLE_TLV("Limiter2 Attack Threshold (AC Mode)",
511  	       STA350_L2ATRT, STA350_LxA_SHIFT,
512  	       16, 0, sta350_limiter_ac_attack_tlv),
513  SOC_SINGLE_TLV("Limiter1 Release Threshold (AC Mode)",
514  	       STA350_L1ATRT, STA350_LxR_SHIFT,
515  	       16, 0, sta350_limiter_ac_release_tlv),
516  SOC_SINGLE_TLV("Limiter2 Release Threshold (AC Mode)",
517  	       STA350_L2ATRT, STA350_LxR_SHIFT,
518  	       16, 0, sta350_limiter_ac_release_tlv),
519  SOC_SINGLE_TLV("Limiter1 Attack Threshold (DRC Mode)",
520  	       STA350_L1ATRT, STA350_LxA_SHIFT,
521  	       16, 0, sta350_limiter_drc_attack_tlv),
522  SOC_SINGLE_TLV("Limiter2 Attack Threshold (DRC Mode)",
523  	       STA350_L2ATRT, STA350_LxA_SHIFT,
524  	       16, 0, sta350_limiter_drc_attack_tlv),
525  SOC_SINGLE_TLV("Limiter1 Release Threshold (DRC Mode)",
526  	       STA350_L1ATRT, STA350_LxR_SHIFT,
527  	       16, 0, sta350_limiter_drc_release_tlv),
528  SOC_SINGLE_TLV("Limiter2 Release Threshold (DRC Mode)",
529  	       STA350_L2ATRT, STA350_LxR_SHIFT,
530  	       16, 0, sta350_limiter_drc_release_tlv),
531  
532  BIQUAD_COEFS("Ch1 - Biquad 1", 0),
533  BIQUAD_COEFS("Ch1 - Biquad 2", 5),
534  BIQUAD_COEFS("Ch1 - Biquad 3", 10),
535  BIQUAD_COEFS("Ch1 - Biquad 4", 15),
536  BIQUAD_COEFS("Ch2 - Biquad 1", 20),
537  BIQUAD_COEFS("Ch2 - Biquad 2", 25),
538  BIQUAD_COEFS("Ch2 - Biquad 3", 30),
539  BIQUAD_COEFS("Ch2 - Biquad 4", 35),
540  BIQUAD_COEFS("High-pass", 40),
541  BIQUAD_COEFS("Low-pass", 45),
542  SINGLE_COEF("Ch1 - Prescale", 50),
543  SINGLE_COEF("Ch2 - Prescale", 51),
544  SINGLE_COEF("Ch1 - Postscale", 52),
545  SINGLE_COEF("Ch2 - Postscale", 53),
546  SINGLE_COEF("Ch3 - Postscale", 54),
547  SINGLE_COEF("Thermal warning - Postscale", 55),
548  SINGLE_COEF("Ch1 - Mix 1", 56),
549  SINGLE_COEF("Ch1 - Mix 2", 57),
550  SINGLE_COEF("Ch2 - Mix 1", 58),
551  SINGLE_COEF("Ch2 - Mix 2", 59),
552  SINGLE_COEF("Ch3 - Mix 1", 60),
553  SINGLE_COEF("Ch3 - Mix 2", 61),
554  };
555  
556  static const struct snd_soc_dapm_widget sta350_dapm_widgets[] = {
557  SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
558  SND_SOC_DAPM_OUTPUT("LEFT"),
559  SND_SOC_DAPM_OUTPUT("RIGHT"),
560  SND_SOC_DAPM_OUTPUT("SUB"),
561  };
562  
563  static const struct snd_soc_dapm_route sta350_dapm_routes[] = {
564  	{ "LEFT", NULL, "DAC" },
565  	{ "RIGHT", NULL, "DAC" },
566  	{ "SUB", NULL, "DAC" },
567  	{ "DAC", NULL, "Playback" },
568  };
569  
570  /* MCLK interpolation ratio per fs */
571  static struct {
572  	int fs;
573  	int ir;
574  } interpolation_ratios[] = {
575  	{ 32000, 0 },
576  	{ 44100, 0 },
577  	{ 48000, 0 },
578  	{ 88200, 1 },
579  	{ 96000, 1 },
580  	{ 176400, 2 },
581  	{ 192000, 2 },
582  };
583  
584  /* MCLK to fs clock ratios */
585  static int mcs_ratio_table[3][6] = {
586  	{ 768, 512, 384, 256, 128, 576 },
587  	{ 384, 256, 192, 128,  64,   0 },
588  	{ 192, 128,  96,  64,  32,   0 },
589  };
590  
591  /**
592   * sta350_set_dai_sysclk - configure MCLK
593   * @codec_dai: the codec DAI
594   * @clk_id: the clock ID (ignored)
595   * @freq: the MCLK input frequency
596   * @dir: the clock direction (ignored)
597   *
598   * The value of MCLK is used to determine which sample rates are supported
599   * by the STA350, based on the mcs_ratio_table.
600   *
601   * This function must be called by the machine driver's 'startup' function,
602   * otherwise the list of supported sample rates will not be available in
603   * time for ALSA.
604   */
sta350_set_dai_sysclk(struct snd_soc_dai * codec_dai,int clk_id,unsigned int freq,int dir)605  static int sta350_set_dai_sysclk(struct snd_soc_dai *codec_dai,
606  				 int clk_id, unsigned int freq, int dir)
607  {
608  	struct snd_soc_component *component = codec_dai->component;
609  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
610  
611  	dev_dbg(component->dev, "mclk=%u\n", freq);
612  	sta350->mclk = freq;
613  
614  	return 0;
615  }
616  
617  /**
618   * sta350_set_dai_fmt - configure the codec for the selected audio format
619   * @codec_dai: the codec DAI
620   * @fmt: a SND_SOC_DAIFMT_x value indicating the data format
621   *
622   * This function takes a bitmask of SND_SOC_DAIFMT_x bits and programs the
623   * codec accordingly.
624   */
sta350_set_dai_fmt(struct snd_soc_dai * codec_dai,unsigned int fmt)625  static int sta350_set_dai_fmt(struct snd_soc_dai *codec_dai,
626  			      unsigned int fmt)
627  {
628  	struct snd_soc_component *component = codec_dai->component;
629  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
630  	unsigned int confb = 0;
631  
632  	switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
633  	case SND_SOC_DAIFMT_CBC_CFC:
634  		break;
635  	default:
636  		return -EINVAL;
637  	}
638  
639  	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
640  	case SND_SOC_DAIFMT_I2S:
641  	case SND_SOC_DAIFMT_RIGHT_J:
642  	case SND_SOC_DAIFMT_LEFT_J:
643  		sta350->format = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
644  		break;
645  	default:
646  		return -EINVAL;
647  	}
648  
649  	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
650  	case SND_SOC_DAIFMT_NB_NF:
651  		confb |= STA350_CONFB_C2IM;
652  		break;
653  	case SND_SOC_DAIFMT_NB_IF:
654  		confb |= STA350_CONFB_C1IM;
655  		break;
656  	default:
657  		return -EINVAL;
658  	}
659  
660  	return regmap_update_bits(sta350->regmap, STA350_CONFB,
661  				  STA350_CONFB_C1IM | STA350_CONFB_C2IM, confb);
662  }
663  
664  /**
665   * sta350_hw_params - program the STA350 with the given hardware parameters.
666   * @substream: the audio stream
667   * @params: the hardware parameters to set
668   * @dai: the SOC DAI (ignored)
669   *
670   * This function programs the hardware with the values provided.
671   * Specifically, the sample rate and the data format.
672   */
sta350_hw_params(struct snd_pcm_substream * substream,struct snd_pcm_hw_params * params,struct snd_soc_dai * dai)673  static int sta350_hw_params(struct snd_pcm_substream *substream,
674  			    struct snd_pcm_hw_params *params,
675  			    struct snd_soc_dai *dai)
676  {
677  	struct snd_soc_component *component = dai->component;
678  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
679  	int i, mcs = -EINVAL, ir = -EINVAL;
680  	unsigned int confa, confb;
681  	unsigned int rate, ratio;
682  	int ret;
683  
684  	if (!sta350->mclk) {
685  		dev_err(component->dev,
686  			"sta350->mclk is unset. Unable to determine ratio\n");
687  		return -EIO;
688  	}
689  
690  	rate = params_rate(params);
691  	ratio = sta350->mclk / rate;
692  	dev_dbg(component->dev, "rate: %u, ratio: %u\n", rate, ratio);
693  
694  	for (i = 0; i < ARRAY_SIZE(interpolation_ratios); i++) {
695  		if (interpolation_ratios[i].fs == rate) {
696  			ir = interpolation_ratios[i].ir;
697  			break;
698  		}
699  	}
700  
701  	if (ir < 0) {
702  		dev_err(component->dev, "Unsupported samplerate: %u\n", rate);
703  		return -EINVAL;
704  	}
705  
706  	for (i = 0; i < 6; i++) {
707  		if (mcs_ratio_table[ir][i] == ratio) {
708  			mcs = i;
709  			break;
710  		}
711  	}
712  
713  	if (mcs < 0) {
714  		dev_err(component->dev, "Unresolvable ratio: %u\n", ratio);
715  		return -EINVAL;
716  	}
717  
718  	confa = (ir << STA350_CONFA_IR_SHIFT) |
719  		(mcs << STA350_CONFA_MCS_SHIFT);
720  	confb = 0;
721  
722  	switch (params_width(params)) {
723  	case 24:
724  		dev_dbg(component->dev, "24bit\n");
725  		fallthrough;
726  	case 32:
727  		dev_dbg(component->dev, "24bit or 32bit\n");
728  		switch (sta350->format) {
729  		case SND_SOC_DAIFMT_I2S:
730  			confb |= 0x0;
731  			break;
732  		case SND_SOC_DAIFMT_LEFT_J:
733  			confb |= 0x1;
734  			break;
735  		case SND_SOC_DAIFMT_RIGHT_J:
736  			confb |= 0x2;
737  			break;
738  		}
739  
740  		break;
741  	case 20:
742  		dev_dbg(component->dev, "20bit\n");
743  		switch (sta350->format) {
744  		case SND_SOC_DAIFMT_I2S:
745  			confb |= 0x4;
746  			break;
747  		case SND_SOC_DAIFMT_LEFT_J:
748  			confb |= 0x5;
749  			break;
750  		case SND_SOC_DAIFMT_RIGHT_J:
751  			confb |= 0x6;
752  			break;
753  		}
754  
755  		break;
756  	case 18:
757  		dev_dbg(component->dev, "18bit\n");
758  		switch (sta350->format) {
759  		case SND_SOC_DAIFMT_I2S:
760  			confb |= 0x8;
761  			break;
762  		case SND_SOC_DAIFMT_LEFT_J:
763  			confb |= 0x9;
764  			break;
765  		case SND_SOC_DAIFMT_RIGHT_J:
766  			confb |= 0xa;
767  			break;
768  		}
769  
770  		break;
771  	case 16:
772  		dev_dbg(component->dev, "16bit\n");
773  		switch (sta350->format) {
774  		case SND_SOC_DAIFMT_I2S:
775  			confb |= 0x0;
776  			break;
777  		case SND_SOC_DAIFMT_LEFT_J:
778  			confb |= 0xd;
779  			break;
780  		case SND_SOC_DAIFMT_RIGHT_J:
781  			confb |= 0xe;
782  			break;
783  		}
784  
785  		break;
786  	default:
787  		return -EINVAL;
788  	}
789  
790  	ret = regmap_update_bits(sta350->regmap, STA350_CONFA,
791  				 STA350_CONFA_MCS_MASK | STA350_CONFA_IR_MASK,
792  				 confa);
793  	if (ret < 0)
794  		return ret;
795  
796  	ret = regmap_update_bits(sta350->regmap, STA350_CONFB,
797  				 STA350_CONFB_SAI_MASK | STA350_CONFB_SAIFB,
798  				 confb);
799  	if (ret < 0)
800  		return ret;
801  
802  	return 0;
803  }
804  
sta350_startup_sequence(struct sta350_priv * sta350)805  static int sta350_startup_sequence(struct sta350_priv *sta350)
806  {
807  	if (sta350->gpiod_power_down)
808  		gpiod_set_value(sta350->gpiod_power_down, 1);
809  
810  	if (sta350->gpiod_nreset) {
811  		gpiod_set_value(sta350->gpiod_nreset, 0);
812  		mdelay(1);
813  		gpiod_set_value(sta350->gpiod_nreset, 1);
814  		mdelay(1);
815  	}
816  
817  	return 0;
818  }
819  
820  /**
821   * sta350_set_bias_level - DAPM callback
822   * @component: the component device
823   * @level: DAPM power level
824   *
825   * This is called by ALSA to put the component into low power mode
826   * or to wake it up.  If the component is powered off completely
827   * all registers must be restored after power on.
828   */
sta350_set_bias_level(struct snd_soc_component * component,enum snd_soc_bias_level level)829  static int sta350_set_bias_level(struct snd_soc_component *component,
830  				 enum snd_soc_bias_level level)
831  {
832  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
833  	int ret;
834  
835  	dev_dbg(component->dev, "level = %d\n", level);
836  	switch (level) {
837  	case SND_SOC_BIAS_ON:
838  		break;
839  
840  	case SND_SOC_BIAS_PREPARE:
841  		/* Full power on */
842  		regmap_update_bits(sta350->regmap, STA350_CONFF,
843  				   STA350_CONFF_PWDN | STA350_CONFF_EAPD,
844  				   STA350_CONFF_PWDN | STA350_CONFF_EAPD);
845  		break;
846  
847  	case SND_SOC_BIAS_STANDBY:
848  		if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) {
849  			ret = regulator_bulk_enable(
850  				ARRAY_SIZE(sta350->supplies),
851  				sta350->supplies);
852  			if (ret < 0) {
853  				dev_err(component->dev,
854  					"Failed to enable supplies: %d\n",
855  					ret);
856  				return ret;
857  			}
858  			sta350_startup_sequence(sta350);
859  			sta350_cache_sync(component);
860  		}
861  
862  		/* Power down */
863  		regmap_update_bits(sta350->regmap, STA350_CONFF,
864  				   STA350_CONFF_PWDN | STA350_CONFF_EAPD,
865  				   0);
866  
867  		break;
868  
869  	case SND_SOC_BIAS_OFF:
870  		/* The chip runs through the power down sequence for us */
871  		regmap_update_bits(sta350->regmap, STA350_CONFF,
872  				   STA350_CONFF_PWDN | STA350_CONFF_EAPD, 0);
873  
874  		/* power down: low */
875  		if (sta350->gpiod_power_down)
876  			gpiod_set_value(sta350->gpiod_power_down, 0);
877  
878  		if (sta350->gpiod_nreset)
879  			gpiod_set_value(sta350->gpiod_nreset, 0);
880  
881  		regulator_bulk_disable(ARRAY_SIZE(sta350->supplies),
882  				       sta350->supplies);
883  		break;
884  	}
885  	return 0;
886  }
887  
888  static const struct snd_soc_dai_ops sta350_dai_ops = {
889  	.hw_params	= sta350_hw_params,
890  	.set_sysclk	= sta350_set_dai_sysclk,
891  	.set_fmt	= sta350_set_dai_fmt,
892  };
893  
894  static struct snd_soc_dai_driver sta350_dai = {
895  	.name = "sta350-hifi",
896  	.playback = {
897  		.stream_name = "Playback",
898  		.channels_min = 2,
899  		.channels_max = 2,
900  		.rates = STA350_RATES,
901  		.formats = STA350_FORMATS,
902  	},
903  	.ops = &sta350_dai_ops,
904  };
905  
sta350_probe(struct snd_soc_component * component)906  static int sta350_probe(struct snd_soc_component *component)
907  {
908  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
909  	struct sta350_platform_data *pdata = sta350->pdata;
910  	int i, ret = 0, thermal = 0;
911  
912  	ret = regulator_bulk_enable(ARRAY_SIZE(sta350->supplies),
913  				    sta350->supplies);
914  	if (ret < 0) {
915  		dev_err(component->dev, "Failed to enable supplies: %d\n", ret);
916  		return ret;
917  	}
918  
919  	ret = sta350_startup_sequence(sta350);
920  	if (ret < 0) {
921  		dev_err(component->dev, "Failed to startup device\n");
922  		return ret;
923  	}
924  
925  	/* CONFA */
926  	if (!pdata->thermal_warning_recovery)
927  		thermal |= STA350_CONFA_TWAB;
928  	if (!pdata->thermal_warning_adjustment)
929  		thermal |= STA350_CONFA_TWRB;
930  	if (!pdata->fault_detect_recovery)
931  		thermal |= STA350_CONFA_FDRB;
932  	regmap_update_bits(sta350->regmap, STA350_CONFA,
933  			   STA350_CONFA_TWAB | STA350_CONFA_TWRB |
934  			   STA350_CONFA_FDRB,
935  			   thermal);
936  
937  	/* CONFC */
938  	regmap_update_bits(sta350->regmap, STA350_CONFC,
939  			   STA350_CONFC_OM_MASK,
940  			   pdata->ffx_power_output_mode
941  				<< STA350_CONFC_OM_SHIFT);
942  	regmap_update_bits(sta350->regmap, STA350_CONFC,
943  			   STA350_CONFC_CSZ_MASK,
944  			   pdata->drop_compensation_ns
945  				<< STA350_CONFC_CSZ_SHIFT);
946  	regmap_update_bits(sta350->regmap,
947  			   STA350_CONFC,
948  			   STA350_CONFC_OCRB,
949  			   pdata->oc_warning_adjustment ?
950  				STA350_CONFC_OCRB : 0);
951  
952  	/* CONFE */
953  	regmap_update_bits(sta350->regmap, STA350_CONFE,
954  			   STA350_CONFE_MPCV,
955  			   pdata->max_power_use_mpcc ?
956  				STA350_CONFE_MPCV : 0);
957  	regmap_update_bits(sta350->regmap, STA350_CONFE,
958  			   STA350_CONFE_MPC,
959  			   pdata->max_power_correction ?
960  				STA350_CONFE_MPC : 0);
961  	regmap_update_bits(sta350->regmap, STA350_CONFE,
962  			   STA350_CONFE_AME,
963  			   pdata->am_reduction_mode ?
964  				STA350_CONFE_AME : 0);
965  	regmap_update_bits(sta350->regmap, STA350_CONFE,
966  			   STA350_CONFE_PWMS,
967  			   pdata->odd_pwm_speed_mode ?
968  				STA350_CONFE_PWMS : 0);
969  	regmap_update_bits(sta350->regmap, STA350_CONFE,
970  			   STA350_CONFE_DCCV,
971  			   pdata->distortion_compensation ?
972  				STA350_CONFE_DCCV : 0);
973  	/*  CONFF */
974  	regmap_update_bits(sta350->regmap, STA350_CONFF,
975  			   STA350_CONFF_IDE,
976  			   pdata->invalid_input_detect_mute ?
977  				STA350_CONFF_IDE : 0);
978  	regmap_update_bits(sta350->regmap, STA350_CONFF,
979  			   STA350_CONFF_OCFG_MASK,
980  			   pdata->output_conf
981  				<< STA350_CONFF_OCFG_SHIFT);
982  
983  	/* channel to output mapping */
984  	regmap_update_bits(sta350->regmap, STA350_C1CFG,
985  			   STA350_CxCFG_OM_MASK,
986  			   pdata->ch1_output_mapping
987  				<< STA350_CxCFG_OM_SHIFT);
988  	regmap_update_bits(sta350->regmap, STA350_C2CFG,
989  			   STA350_CxCFG_OM_MASK,
990  			   pdata->ch2_output_mapping
991  				<< STA350_CxCFG_OM_SHIFT);
992  	regmap_update_bits(sta350->regmap, STA350_C3CFG,
993  			   STA350_CxCFG_OM_MASK,
994  			   pdata->ch3_output_mapping
995  				<< STA350_CxCFG_OM_SHIFT);
996  
997  	/* miscellaneous registers */
998  	regmap_update_bits(sta350->regmap, STA350_MISC1,
999  			   STA350_MISC1_CPWMEN,
1000  			   pdata->activate_mute_output ?
1001  				STA350_MISC1_CPWMEN : 0);
1002  	regmap_update_bits(sta350->regmap, STA350_MISC1,
1003  			   STA350_MISC1_BRIDGOFF,
1004  			   pdata->bridge_immediate_off ?
1005  				STA350_MISC1_BRIDGOFF : 0);
1006  	regmap_update_bits(sta350->regmap, STA350_MISC1,
1007  			   STA350_MISC1_NSHHPEN,
1008  			   pdata->noise_shape_dc_cut ?
1009  				STA350_MISC1_NSHHPEN : 0);
1010  	regmap_update_bits(sta350->regmap, STA350_MISC1,
1011  			   STA350_MISC1_RPDNEN,
1012  			   pdata->powerdown_master_vol ?
1013  				STA350_MISC1_RPDNEN: 0);
1014  
1015  	regmap_update_bits(sta350->regmap, STA350_MISC2,
1016  			   STA350_MISC2_PNDLSL_MASK,
1017  			   pdata->powerdown_delay_divider
1018  				<< STA350_MISC2_PNDLSL_SHIFT);
1019  
1020  	/* initialize coefficient shadow RAM with reset values */
1021  	for (i = 4; i <= 49; i += 5)
1022  		sta350->coef_shadow[i] = 0x400000;
1023  	for (i = 50; i <= 54; i++)
1024  		sta350->coef_shadow[i] = 0x7fffff;
1025  	sta350->coef_shadow[55] = 0x5a9df7;
1026  	sta350->coef_shadow[56] = 0x7fffff;
1027  	sta350->coef_shadow[59] = 0x7fffff;
1028  	sta350->coef_shadow[60] = 0x400000;
1029  	sta350->coef_shadow[61] = 0x400000;
1030  
1031  	snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY);
1032  	/* Bias level configuration will have done an extra enable */
1033  	regulator_bulk_disable(ARRAY_SIZE(sta350->supplies), sta350->supplies);
1034  
1035  	return 0;
1036  }
1037  
sta350_remove(struct snd_soc_component * component)1038  static void sta350_remove(struct snd_soc_component *component)
1039  {
1040  	struct sta350_priv *sta350 = snd_soc_component_get_drvdata(component);
1041  
1042  	regulator_bulk_disable(ARRAY_SIZE(sta350->supplies), sta350->supplies);
1043  }
1044  
1045  static const struct snd_soc_component_driver sta350_component = {
1046  	.probe			= sta350_probe,
1047  	.remove			= sta350_remove,
1048  	.set_bias_level		= sta350_set_bias_level,
1049  	.controls		= sta350_snd_controls,
1050  	.num_controls		= ARRAY_SIZE(sta350_snd_controls),
1051  	.dapm_widgets		= sta350_dapm_widgets,
1052  	.num_dapm_widgets	= ARRAY_SIZE(sta350_dapm_widgets),
1053  	.dapm_routes		= sta350_dapm_routes,
1054  	.num_dapm_routes	= ARRAY_SIZE(sta350_dapm_routes),
1055  	.suspend_bias_off	= 1,
1056  	.idle_bias_on		= 1,
1057  	.use_pmdown_time	= 1,
1058  	.endianness		= 1,
1059  };
1060  
1061  static const struct regmap_config sta350_regmap = {
1062  	.reg_bits =		8,
1063  	.val_bits =		8,
1064  	.max_register =		STA350_MISC2,
1065  	.reg_defaults =		sta350_regs,
1066  	.num_reg_defaults =	ARRAY_SIZE(sta350_regs),
1067  	.cache_type =		REGCACHE_MAPLE,
1068  	.wr_table =		&sta350_write_regs,
1069  	.rd_table =		&sta350_read_regs,
1070  	.volatile_table =	&sta350_volatile_regs,
1071  };
1072  
1073  #ifdef CONFIG_OF
1074  static const struct of_device_id st350_dt_ids[] = {
1075  	{ .compatible = "st,sta350", },
1076  	{ }
1077  };
1078  MODULE_DEVICE_TABLE(of, st350_dt_ids);
1079  
1080  static const char * const sta350_ffx_modes[] = {
1081  	[STA350_FFX_PM_DROP_COMP]		= "drop-compensation",
1082  	[STA350_FFX_PM_TAPERED_COMP]		= "tapered-compensation",
1083  	[STA350_FFX_PM_FULL_POWER]		= "full-power-mode",
1084  	[STA350_FFX_PM_VARIABLE_DROP_COMP]	= "variable-drop-compensation",
1085  };
1086  
sta350_probe_dt(struct device * dev,struct sta350_priv * sta350)1087  static int sta350_probe_dt(struct device *dev, struct sta350_priv *sta350)
1088  {
1089  	struct device_node *np = dev->of_node;
1090  	struct sta350_platform_data *pdata;
1091  	const char *ffx_power_mode;
1092  	u16 tmp;
1093  	u8 tmp8;
1094  
1095  	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
1096  	if (!pdata)
1097  		return -ENOMEM;
1098  
1099  	of_property_read_u8(np, "st,output-conf",
1100  			    &pdata->output_conf);
1101  	of_property_read_u8(np, "st,ch1-output-mapping",
1102  			    &pdata->ch1_output_mapping);
1103  	of_property_read_u8(np, "st,ch2-output-mapping",
1104  			    &pdata->ch2_output_mapping);
1105  	of_property_read_u8(np, "st,ch3-output-mapping",
1106  			    &pdata->ch3_output_mapping);
1107  
1108  	pdata->thermal_warning_recovery =
1109  		of_property_read_bool(np, "st,thermal-warning-recovery");
1110  	pdata->thermal_warning_adjustment =
1111  		of_property_read_bool(np, "st,thermal-warning-adjustment");
1112  	pdata->fault_detect_recovery =
1113  		of_property_read_bool(np, "st,fault-detect-recovery");
1114  
1115  	pdata->ffx_power_output_mode = STA350_FFX_PM_VARIABLE_DROP_COMP;
1116  	if (!of_property_read_string(np, "st,ffx-power-output-mode",
1117  				     &ffx_power_mode)) {
1118  		int i, mode = -EINVAL;
1119  
1120  		for (i = 0; i < ARRAY_SIZE(sta350_ffx_modes); i++)
1121  			if (!strcasecmp(ffx_power_mode, sta350_ffx_modes[i]))
1122  				mode = i;
1123  
1124  		if (mode < 0)
1125  			dev_warn(dev, "Unsupported ffx output mode: %s\n",
1126  				 ffx_power_mode);
1127  		else
1128  			pdata->ffx_power_output_mode = mode;
1129  	}
1130  
1131  	tmp = 140;
1132  	of_property_read_u16(np, "st,drop-compensation-ns", &tmp);
1133  	pdata->drop_compensation_ns = clamp_t(u16, tmp, 0, 300) / 20;
1134  
1135  	pdata->oc_warning_adjustment =
1136  		of_property_read_bool(np, "st,overcurrent-warning-adjustment");
1137  
1138  	/* CONFE */
1139  	pdata->max_power_use_mpcc =
1140  		of_property_read_bool(np, "st,max-power-use-mpcc");
1141  	pdata->max_power_correction =
1142  		of_property_read_bool(np, "st,max-power-correction");
1143  	pdata->am_reduction_mode =
1144  		of_property_read_bool(np, "st,am-reduction-mode");
1145  	pdata->odd_pwm_speed_mode =
1146  		of_property_read_bool(np, "st,odd-pwm-speed-mode");
1147  	pdata->distortion_compensation =
1148  		of_property_read_bool(np, "st,distortion-compensation");
1149  
1150  	/* CONFF */
1151  	pdata->invalid_input_detect_mute =
1152  		of_property_read_bool(np, "st,invalid-input-detect-mute");
1153  
1154  	/* MISC */
1155  	pdata->activate_mute_output =
1156  		of_property_read_bool(np, "st,activate-mute-output");
1157  	pdata->bridge_immediate_off =
1158  		of_property_read_bool(np, "st,bridge-immediate-off");
1159  	pdata->noise_shape_dc_cut =
1160  		of_property_read_bool(np, "st,noise-shape-dc-cut");
1161  	pdata->powerdown_master_vol =
1162  		of_property_read_bool(np, "st,powerdown-master-volume");
1163  
1164  	if (!of_property_read_u8(np, "st,powerdown-delay-divider", &tmp8)) {
1165  		if (is_power_of_2(tmp8) && tmp8 >= 1 && tmp8 <= 128)
1166  			pdata->powerdown_delay_divider = ilog2(tmp8);
1167  		else
1168  			dev_warn(dev, "Unsupported powerdown delay divider %d\n",
1169  				 tmp8);
1170  	}
1171  
1172  	sta350->pdata = pdata;
1173  
1174  	return 0;
1175  }
1176  #endif
1177  
sta350_i2c_probe(struct i2c_client * i2c)1178  static int sta350_i2c_probe(struct i2c_client *i2c)
1179  {
1180  	struct device *dev = &i2c->dev;
1181  	struct sta350_priv *sta350;
1182  	int ret, i;
1183  
1184  	sta350 = devm_kzalloc(dev, sizeof(struct sta350_priv), GFP_KERNEL);
1185  	if (!sta350)
1186  		return -ENOMEM;
1187  
1188  	mutex_init(&sta350->coeff_lock);
1189  	sta350->pdata = dev_get_platdata(dev);
1190  
1191  #ifdef CONFIG_OF
1192  	if (dev->of_node) {
1193  		ret = sta350_probe_dt(dev, sta350);
1194  		if (ret < 0)
1195  			return ret;
1196  	}
1197  #endif
1198  
1199  	/* GPIOs */
1200  	sta350->gpiod_nreset = devm_gpiod_get_optional(dev, "reset",
1201  						       GPIOD_OUT_LOW);
1202  	if (IS_ERR(sta350->gpiod_nreset))
1203  		return PTR_ERR(sta350->gpiod_nreset);
1204  
1205  	sta350->gpiod_power_down = devm_gpiod_get_optional(dev, "power-down",
1206  							   GPIOD_OUT_LOW);
1207  	if (IS_ERR(sta350->gpiod_power_down))
1208  		return PTR_ERR(sta350->gpiod_power_down);
1209  
1210  	/* regulators */
1211  	for (i = 0; i < ARRAY_SIZE(sta350->supplies); i++)
1212  		sta350->supplies[i].supply = sta350_supply_names[i];
1213  
1214  	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(sta350->supplies),
1215  				      sta350->supplies);
1216  	if (ret < 0) {
1217  		dev_err(dev, "Failed to request supplies: %d\n", ret);
1218  		return ret;
1219  	}
1220  
1221  	sta350->regmap = devm_regmap_init_i2c(i2c, &sta350_regmap);
1222  	if (IS_ERR(sta350->regmap)) {
1223  		ret = PTR_ERR(sta350->regmap);
1224  		dev_err(dev, "Failed to init regmap: %d\n", ret);
1225  		return ret;
1226  	}
1227  
1228  	i2c_set_clientdata(i2c, sta350);
1229  
1230  	ret = devm_snd_soc_register_component(dev, &sta350_component, &sta350_dai, 1);
1231  	if (ret < 0)
1232  		dev_err(dev, "Failed to register component (%d)\n", ret);
1233  
1234  	return ret;
1235  }
1236  
sta350_i2c_remove(struct i2c_client * client)1237  static void sta350_i2c_remove(struct i2c_client *client)
1238  {}
1239  
1240  static const struct i2c_device_id sta350_i2c_id[] = {
1241  	{ "sta350" },
1242  	{ }
1243  };
1244  MODULE_DEVICE_TABLE(i2c, sta350_i2c_id);
1245  
1246  static struct i2c_driver sta350_i2c_driver = {
1247  	.driver = {
1248  		.name = "sta350",
1249  		.of_match_table = of_match_ptr(st350_dt_ids),
1250  	},
1251  	.probe =    sta350_i2c_probe,
1252  	.remove =   sta350_i2c_remove,
1253  	.id_table = sta350_i2c_id,
1254  };
1255  
1256  module_i2c_driver(sta350_i2c_driver);
1257  
1258  MODULE_DESCRIPTION("ASoC STA350 driver");
1259  MODULE_AUTHOR("Sven Brandau <info@brandau.biz>");
1260  MODULE_LICENSE("GPL");
1261