cachepc-linux

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

sta32x.c (35358B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Codec driver for ST STA32x 2.1-channel high-efficiency digital audio system
      4 *
      5 * Copyright: 2011 Raumfeld GmbH
      6 * Author: Johannes Stezenbach <js@sig21.net>
      7 *
      8 * based on code from:
      9 *	Wolfson Microelectronics PLC.
     10 *	  Mark Brown <broonie@opensource.wolfsonmicro.com>
     11 *	Freescale Semiconductor, Inc.
     12 *	  Timur Tabi <timur@freescale.com>
     13 */
     14
     15#define pr_fmt(fmt) KBUILD_MODNAME ":%s:%d: " fmt, __func__, __LINE__
     16
     17#include <linux/module.h>
     18#include <linux/moduleparam.h>
     19#include <linux/init.h>
     20#include <linux/clk.h>
     21#include <linux/delay.h>
     22#include <linux/pm.h>
     23#include <linux/i2c.h>
     24#include <linux/of_device.h>
     25#include <linux/of_gpio.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 <linux/workqueue.h>
     31#include <sound/core.h>
     32#include <sound/pcm.h>
     33#include <sound/pcm_params.h>
     34#include <sound/soc.h>
     35#include <sound/soc-dapm.h>
     36#include <sound/initval.h>
     37#include <sound/tlv.h>
     38
     39#include <sound/sta32x.h>
     40#include "sta32x.h"
     41
     42#define STA32X_RATES (SNDRV_PCM_RATE_32000 | \
     43		      SNDRV_PCM_RATE_44100 | \
     44		      SNDRV_PCM_RATE_48000 | \
     45		      SNDRV_PCM_RATE_88200 | \
     46		      SNDRV_PCM_RATE_96000 | \
     47		      SNDRV_PCM_RATE_176400 | \
     48		      SNDRV_PCM_RATE_192000)
     49
     50#define STA32X_FORMATS \
     51	(SNDRV_PCM_FMTBIT_S16_LE  | SNDRV_PCM_FMTBIT_S18_3LE | \
     52	 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_3LE | \
     53	 SNDRV_PCM_FMTBIT_S24_LE  | SNDRV_PCM_FMTBIT_S32_LE)
     54
     55/* Power-up register defaults */
     56static const struct reg_default sta32x_regs[] = {
     57	{  0x0, 0x63 },
     58	{  0x1, 0x80 },
     59	{  0x2, 0xc2 },
     60	{  0x3, 0x40 },
     61	{  0x4, 0xc2 },
     62	{  0x5, 0x5c },
     63	{  0x6, 0x10 },
     64	{  0x7, 0xff },
     65	{  0x8, 0x60 },
     66	{  0x9, 0x60 },
     67	{  0xa, 0x60 },
     68	{  0xb, 0x80 },
     69	{  0xc, 0x00 },
     70	{  0xd, 0x00 },
     71	{  0xe, 0x00 },
     72	{  0xf, 0x40 },
     73	{ 0x10, 0x80 },
     74	{ 0x11, 0x77 },
     75	{ 0x12, 0x6a },
     76	{ 0x13, 0x69 },
     77	{ 0x14, 0x6a },
     78	{ 0x15, 0x69 },
     79	{ 0x16, 0x00 },
     80	{ 0x17, 0x00 },
     81	{ 0x18, 0x00 },
     82	{ 0x19, 0x00 },
     83	{ 0x1a, 0x00 },
     84	{ 0x1b, 0x00 },
     85	{ 0x1c, 0x00 },
     86	{ 0x1d, 0x00 },
     87	{ 0x1e, 0x00 },
     88	{ 0x1f, 0x00 },
     89	{ 0x20, 0x00 },
     90	{ 0x21, 0x00 },
     91	{ 0x22, 0x00 },
     92	{ 0x23, 0x00 },
     93	{ 0x24, 0x00 },
     94	{ 0x25, 0x00 },
     95	{ 0x26, 0x00 },
     96	{ 0x27, 0x2d },
     97	{ 0x28, 0xc0 },
     98	{ 0x2b, 0x00 },
     99	{ 0x2c, 0x0c },
    100};
    101
    102static const struct regmap_range sta32x_write_regs_range[] = {
    103	regmap_reg_range(STA32X_CONFA,  STA32X_FDRC2),
    104};
    105
    106static const struct regmap_range sta32x_read_regs_range[] = {
    107	regmap_reg_range(STA32X_CONFA,  STA32X_FDRC2),
    108};
    109
    110static const struct regmap_range sta32x_volatile_regs_range[] = {
    111	regmap_reg_range(STA32X_CFADDR2, STA32X_CFUD),
    112};
    113
    114static const struct regmap_access_table sta32x_write_regs = {
    115	.yes_ranges =	sta32x_write_regs_range,
    116	.n_yes_ranges =	ARRAY_SIZE(sta32x_write_regs_range),
    117};
    118
    119static const struct regmap_access_table sta32x_read_regs = {
    120	.yes_ranges =	sta32x_read_regs_range,
    121	.n_yes_ranges =	ARRAY_SIZE(sta32x_read_regs_range),
    122};
    123
    124static const struct regmap_access_table sta32x_volatile_regs = {
    125	.yes_ranges =	sta32x_volatile_regs_range,
    126	.n_yes_ranges =	ARRAY_SIZE(sta32x_volatile_regs_range),
    127};
    128
    129/* regulator power supply names */
    130static const char *sta32x_supply_names[] = {
    131	"Vdda",	/* analog supply, 3.3VV */
    132	"Vdd3",	/* digital supply, 3.3V */
    133	"Vcc"	/* power amp spply, 10V - 36V */
    134};
    135
    136/* codec private data */
    137struct sta32x_priv {
    138	struct regmap *regmap;
    139	struct clk *xti_clk;
    140	struct regulator_bulk_data supplies[ARRAY_SIZE(sta32x_supply_names)];
    141	struct snd_soc_component *component;
    142	struct sta32x_platform_data *pdata;
    143
    144	unsigned int mclk;
    145	unsigned int format;
    146
    147	u32 coef_shadow[STA32X_COEF_COUNT];
    148	struct delayed_work watchdog_work;
    149	int shutdown;
    150	struct gpio_desc *gpiod_nreset;
    151	struct mutex coeff_lock;
    152};
    153
    154static const DECLARE_TLV_DB_SCALE(mvol_tlv, -12700, 50, 1);
    155static const DECLARE_TLV_DB_SCALE(chvol_tlv, -7950, 50, 1);
    156static const DECLARE_TLV_DB_SCALE(tone_tlv, -120, 200, 0);
    157
    158static const char *sta32x_drc_ac[] = {
    159	"Anti-Clipping", "Dynamic Range Compression" };
    160static const char *sta32x_auto_eq_mode[] = {
    161	"User", "Preset", "Loudness" };
    162static const char *sta32x_auto_gc_mode[] = {
    163	"User", "AC no clipping", "AC limited clipping (10%)",
    164	"DRC nighttime listening mode" };
    165static const char *sta32x_auto_xo_mode[] = {
    166	"User", "80Hz", "100Hz", "120Hz", "140Hz", "160Hz", "180Hz", "200Hz",
    167	"220Hz", "240Hz", "260Hz", "280Hz", "300Hz", "320Hz", "340Hz", "360Hz" };
    168static const char *sta32x_preset_eq_mode[] = {
    169	"Flat", "Rock", "Soft Rock", "Jazz", "Classical", "Dance", "Pop", "Soft",
    170	"Hard", "Party", "Vocal", "Hip-Hop", "Dialog", "Bass-boost #1",
    171	"Bass-boost #2", "Bass-boost #3", "Loudness 1", "Loudness 2",
    172	"Loudness 3", "Loudness 4", "Loudness 5", "Loudness 6", "Loudness 7",
    173	"Loudness 8", "Loudness 9", "Loudness 10", "Loudness 11", "Loudness 12",
    174	"Loudness 13", "Loudness 14", "Loudness 15", "Loudness 16" };
    175static const char *sta32x_limiter_select[] = {
    176	"Limiter Disabled", "Limiter #1", "Limiter #2" };
    177static const char *sta32x_limiter_attack_rate[] = {
    178	"3.1584", "2.7072", "2.2560", "1.8048", "1.3536", "0.9024",
    179	"0.4512", "0.2256", "0.1504", "0.1123", "0.0902", "0.0752",
    180	"0.0645", "0.0564", "0.0501", "0.0451" };
    181static const char *sta32x_limiter_release_rate[] = {
    182	"0.5116", "0.1370", "0.0744", "0.0499", "0.0360", "0.0299",
    183	"0.0264", "0.0208", "0.0198", "0.0172", "0.0147", "0.0137",
    184	"0.0134", "0.0117", "0.0110", "0.0104" };
    185static DECLARE_TLV_DB_RANGE(sta32x_limiter_ac_attack_tlv,
    186	0, 7, TLV_DB_SCALE_ITEM(-1200, 200, 0),
    187	8, 16, TLV_DB_SCALE_ITEM(300, 100, 0),
    188);
    189
    190static DECLARE_TLV_DB_RANGE(sta32x_limiter_ac_release_tlv,
    191	0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 0),
    192	1, 1, TLV_DB_SCALE_ITEM(-2900, 0, 0),
    193	2, 2, TLV_DB_SCALE_ITEM(-2000, 0, 0),
    194	3, 8, TLV_DB_SCALE_ITEM(-1400, 200, 0),
    195	8, 16, TLV_DB_SCALE_ITEM(-700, 100, 0),
    196);
    197
    198static DECLARE_TLV_DB_RANGE(sta32x_limiter_drc_attack_tlv,
    199	0, 7, TLV_DB_SCALE_ITEM(-3100, 200, 0),
    200	8, 13, TLV_DB_SCALE_ITEM(-1600, 100, 0),
    201	14, 16, TLV_DB_SCALE_ITEM(-1000, 300, 0),
    202);
    203
    204static DECLARE_TLV_DB_RANGE(sta32x_limiter_drc_release_tlv,
    205	0, 0, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 0),
    206	1, 2, TLV_DB_SCALE_ITEM(-3800, 200, 0),
    207	3, 4, TLV_DB_SCALE_ITEM(-3300, 200, 0),
    208	5, 12, TLV_DB_SCALE_ITEM(-3000, 200, 0),
    209	13, 16, TLV_DB_SCALE_ITEM(-1500, 300, 0),
    210);
    211
    212static SOC_ENUM_SINGLE_DECL(sta32x_drc_ac_enum,
    213			    STA32X_CONFD, STA32X_CONFD_DRC_SHIFT,
    214			    sta32x_drc_ac);
    215static SOC_ENUM_SINGLE_DECL(sta32x_auto_eq_enum,
    216			    STA32X_AUTO1, STA32X_AUTO1_AMEQ_SHIFT,
    217			    sta32x_auto_eq_mode);
    218static SOC_ENUM_SINGLE_DECL(sta32x_auto_gc_enum,
    219			    STA32X_AUTO1, STA32X_AUTO1_AMGC_SHIFT,
    220			    sta32x_auto_gc_mode);
    221static SOC_ENUM_SINGLE_DECL(sta32x_auto_xo_enum,
    222			    STA32X_AUTO2, STA32X_AUTO2_XO_SHIFT,
    223			    sta32x_auto_xo_mode);
    224static SOC_ENUM_SINGLE_DECL(sta32x_preset_eq_enum,
    225			    STA32X_AUTO3, STA32X_AUTO3_PEQ_SHIFT,
    226			    sta32x_preset_eq_mode);
    227static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch1_enum,
    228			    STA32X_C1CFG, STA32X_CxCFG_LS_SHIFT,
    229			    sta32x_limiter_select);
    230static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch2_enum,
    231			    STA32X_C2CFG, STA32X_CxCFG_LS_SHIFT,
    232			    sta32x_limiter_select);
    233static SOC_ENUM_SINGLE_DECL(sta32x_limiter_ch3_enum,
    234			    STA32X_C3CFG, STA32X_CxCFG_LS_SHIFT,
    235			    sta32x_limiter_select);
    236static SOC_ENUM_SINGLE_DECL(sta32x_limiter1_attack_rate_enum,
    237			    STA32X_L1AR, STA32X_LxA_SHIFT,
    238			    sta32x_limiter_attack_rate);
    239static SOC_ENUM_SINGLE_DECL(sta32x_limiter2_attack_rate_enum,
    240			    STA32X_L2AR, STA32X_LxA_SHIFT,
    241			    sta32x_limiter_attack_rate);
    242static SOC_ENUM_SINGLE_DECL(sta32x_limiter1_release_rate_enum,
    243			    STA32X_L1AR, STA32X_LxR_SHIFT,
    244			    sta32x_limiter_release_rate);
    245static SOC_ENUM_SINGLE_DECL(sta32x_limiter2_release_rate_enum,
    246			    STA32X_L2AR, STA32X_LxR_SHIFT,
    247			    sta32x_limiter_release_rate);
    248
    249/* byte array controls for setting biquad, mixer, scaling coefficients;
    250 * for biquads all five coefficients need to be set in one go,
    251 * mixer and pre/postscale coefs can be set individually;
    252 * each coef is 24bit, the bytes are ordered in the same way
    253 * as given in the STA32x data sheet (big endian; b1, b2, a1, a2, b0)
    254 */
    255
    256static int sta32x_coefficient_info(struct snd_kcontrol *kcontrol,
    257				   struct snd_ctl_elem_info *uinfo)
    258{
    259	int numcoef = kcontrol->private_value >> 16;
    260	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
    261	uinfo->count = 3 * numcoef;
    262	return 0;
    263}
    264
    265static int sta32x_coefficient_get(struct snd_kcontrol *kcontrol,
    266				  struct snd_ctl_elem_value *ucontrol)
    267{
    268	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
    269	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    270	int numcoef = kcontrol->private_value >> 16;
    271	int index = kcontrol->private_value & 0xffff;
    272	unsigned int cfud, val;
    273	int i, ret = 0;
    274
    275	mutex_lock(&sta32x->coeff_lock);
    276
    277	/* preserve reserved bits in STA32X_CFUD */
    278	regmap_read(sta32x->regmap, STA32X_CFUD, &cfud);
    279	cfud &= 0xf0;
    280	/*
    281	 * chip documentation does not say if the bits are self clearing,
    282	 * so do it explicitly
    283	 */
    284	regmap_write(sta32x->regmap, STA32X_CFUD, cfud);
    285
    286	regmap_write(sta32x->regmap, STA32X_CFADDR2, index);
    287	if (numcoef == 1) {
    288		regmap_write(sta32x->regmap, STA32X_CFUD, cfud | 0x04);
    289	} else if (numcoef == 5) {
    290		regmap_write(sta32x->regmap, STA32X_CFUD, cfud | 0x08);
    291	} else {
    292		ret = -EINVAL;
    293		goto exit_unlock;
    294	}
    295
    296	for (i = 0; i < 3 * numcoef; i++) {
    297		regmap_read(sta32x->regmap, STA32X_B1CF1 + i, &val);
    298		ucontrol->value.bytes.data[i] = val;
    299	}
    300
    301exit_unlock:
    302	mutex_unlock(&sta32x->coeff_lock);
    303
    304	return ret;
    305}
    306
    307static int sta32x_coefficient_put(struct snd_kcontrol *kcontrol,
    308				  struct snd_ctl_elem_value *ucontrol)
    309{
    310	struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
    311	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    312	int numcoef = kcontrol->private_value >> 16;
    313	int index = kcontrol->private_value & 0xffff;
    314	unsigned int cfud;
    315	int i;
    316
    317	/* preserve reserved bits in STA32X_CFUD */
    318	regmap_read(sta32x->regmap, STA32X_CFUD, &cfud);
    319	cfud &= 0xf0;
    320	/*
    321	 * chip documentation does not say if the bits are self clearing,
    322	 * so do it explicitly
    323	 */
    324	regmap_write(sta32x->regmap, STA32X_CFUD, cfud);
    325
    326	regmap_write(sta32x->regmap, STA32X_CFADDR2, index);
    327	for (i = 0; i < numcoef && (index + i < STA32X_COEF_COUNT); i++)
    328		sta32x->coef_shadow[index + i] =
    329			  (ucontrol->value.bytes.data[3 * i] << 16)
    330			| (ucontrol->value.bytes.data[3 * i + 1] << 8)
    331			| (ucontrol->value.bytes.data[3 * i + 2]);
    332	for (i = 0; i < 3 * numcoef; i++)
    333		regmap_write(sta32x->regmap, STA32X_B1CF1 + i,
    334			     ucontrol->value.bytes.data[i]);
    335	if (numcoef == 1)
    336		regmap_write(sta32x->regmap, STA32X_CFUD, cfud | 0x01);
    337	else if (numcoef == 5)
    338		regmap_write(sta32x->regmap, STA32X_CFUD, cfud | 0x02);
    339	else
    340		return -EINVAL;
    341
    342	return 0;
    343}
    344
    345static int sta32x_sync_coef_shadow(struct snd_soc_component *component)
    346{
    347	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    348	unsigned int cfud;
    349	int i;
    350
    351	/* preserve reserved bits in STA32X_CFUD */
    352	regmap_read(sta32x->regmap, STA32X_CFUD, &cfud);
    353	cfud &= 0xf0;
    354
    355	for (i = 0; i < STA32X_COEF_COUNT; i++) {
    356		regmap_write(sta32x->regmap, STA32X_CFADDR2, i);
    357		regmap_write(sta32x->regmap, STA32X_B1CF1,
    358			     (sta32x->coef_shadow[i] >> 16) & 0xff);
    359		regmap_write(sta32x->regmap, STA32X_B1CF2,
    360			     (sta32x->coef_shadow[i] >> 8) & 0xff);
    361		regmap_write(sta32x->regmap, STA32X_B1CF3,
    362			     (sta32x->coef_shadow[i]) & 0xff);
    363		/*
    364		 * chip documentation does not say if the bits are
    365		 * self-clearing, so do it explicitly
    366		 */
    367		regmap_write(sta32x->regmap, STA32X_CFUD, cfud);
    368		regmap_write(sta32x->regmap, STA32X_CFUD, cfud | 0x01);
    369	}
    370	return 0;
    371}
    372
    373static int sta32x_cache_sync(struct snd_soc_component *component)
    374{
    375	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    376	unsigned int mute;
    377	int rc;
    378
    379	/* mute during register sync */
    380	regmap_read(sta32x->regmap, STA32X_MMUTE, &mute);
    381	regmap_write(sta32x->regmap, STA32X_MMUTE, mute | STA32X_MMUTE_MMUTE);
    382	sta32x_sync_coef_shadow(component);
    383	rc = regcache_sync(sta32x->regmap);
    384	regmap_write(sta32x->regmap, STA32X_MMUTE, mute);
    385	return rc;
    386}
    387
    388/* work around ESD issue where sta32x resets and loses all configuration */
    389static void sta32x_watchdog(struct work_struct *work)
    390{
    391	struct sta32x_priv *sta32x = container_of(work, struct sta32x_priv,
    392						  watchdog_work.work);
    393	struct snd_soc_component *component = sta32x->component;
    394	unsigned int confa, confa_cached;
    395
    396	/* check if sta32x has reset itself */
    397	confa_cached = snd_soc_component_read(component, STA32X_CONFA);
    398	regcache_cache_bypass(sta32x->regmap, true);
    399	confa = snd_soc_component_read(component, STA32X_CONFA);
    400	regcache_cache_bypass(sta32x->regmap, false);
    401	if (confa != confa_cached) {
    402		regcache_mark_dirty(sta32x->regmap);
    403		sta32x_cache_sync(component);
    404	}
    405
    406	if (!sta32x->shutdown)
    407		queue_delayed_work(system_power_efficient_wq,
    408				   &sta32x->watchdog_work,
    409				   round_jiffies_relative(HZ));
    410}
    411
    412static void sta32x_watchdog_start(struct sta32x_priv *sta32x)
    413{
    414	if (sta32x->pdata->needs_esd_watchdog) {
    415		sta32x->shutdown = 0;
    416		queue_delayed_work(system_power_efficient_wq,
    417				   &sta32x->watchdog_work,
    418				   round_jiffies_relative(HZ));
    419	}
    420}
    421
    422static void sta32x_watchdog_stop(struct sta32x_priv *sta32x)
    423{
    424	if (sta32x->pdata->needs_esd_watchdog) {
    425		sta32x->shutdown = 1;
    426		cancel_delayed_work_sync(&sta32x->watchdog_work);
    427	}
    428}
    429
    430#define SINGLE_COEF(xname, index) \
    431{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    432	.info = sta32x_coefficient_info, \
    433	.get = sta32x_coefficient_get,\
    434	.put = sta32x_coefficient_put, \
    435	.private_value = index | (1 << 16) }
    436
    437#define BIQUAD_COEFS(xname, index) \
    438{	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
    439	.info = sta32x_coefficient_info, \
    440	.get = sta32x_coefficient_get,\
    441	.put = sta32x_coefficient_put, \
    442	.private_value = index | (5 << 16) }
    443
    444static const struct snd_kcontrol_new sta32x_snd_controls[] = {
    445SOC_SINGLE_TLV("Master Volume", STA32X_MVOL, 0, 0xff, 1, mvol_tlv),
    446SOC_SINGLE("Master Switch", STA32X_MMUTE, 0, 1, 1),
    447SOC_SINGLE("Ch1 Switch", STA32X_MMUTE, 1, 1, 1),
    448SOC_SINGLE("Ch2 Switch", STA32X_MMUTE, 2, 1, 1),
    449SOC_SINGLE("Ch3 Switch", STA32X_MMUTE, 3, 1, 1),
    450SOC_SINGLE_TLV("Ch1 Volume", STA32X_C1VOL, 0, 0xff, 1, chvol_tlv),
    451SOC_SINGLE_TLV("Ch2 Volume", STA32X_C2VOL, 0, 0xff, 1, chvol_tlv),
    452SOC_SINGLE_TLV("Ch3 Volume", STA32X_C3VOL, 0, 0xff, 1, chvol_tlv),
    453SOC_SINGLE("De-emphasis Filter Switch", STA32X_CONFD, STA32X_CONFD_DEMP_SHIFT, 1, 0),
    454SOC_ENUM("Compressor/Limiter Switch", sta32x_drc_ac_enum),
    455SOC_SINGLE("Miami Mode Switch", STA32X_CONFD, STA32X_CONFD_MME_SHIFT, 1, 0),
    456SOC_SINGLE("Zero Cross Switch", STA32X_CONFE, STA32X_CONFE_ZCE_SHIFT, 1, 0),
    457SOC_SINGLE("Soft Ramp Switch", STA32X_CONFE, STA32X_CONFE_SVE_SHIFT, 1, 0),
    458SOC_SINGLE("Auto-Mute Switch", STA32X_CONFF, STA32X_CONFF_IDE_SHIFT, 1, 0),
    459SOC_ENUM("Automode EQ", sta32x_auto_eq_enum),
    460SOC_ENUM("Automode GC", sta32x_auto_gc_enum),
    461SOC_ENUM("Automode XO", sta32x_auto_xo_enum),
    462SOC_ENUM("Preset EQ", sta32x_preset_eq_enum),
    463SOC_SINGLE("Ch1 Tone Control Bypass Switch", STA32X_C1CFG, STA32X_CxCFG_TCB_SHIFT, 1, 0),
    464SOC_SINGLE("Ch2 Tone Control Bypass Switch", STA32X_C2CFG, STA32X_CxCFG_TCB_SHIFT, 1, 0),
    465SOC_SINGLE("Ch1 EQ Bypass Switch", STA32X_C1CFG, STA32X_CxCFG_EQBP_SHIFT, 1, 0),
    466SOC_SINGLE("Ch2 EQ Bypass Switch", STA32X_C2CFG, STA32X_CxCFG_EQBP_SHIFT, 1, 0),
    467SOC_SINGLE("Ch1 Master Volume Bypass Switch", STA32X_C1CFG, STA32X_CxCFG_VBP_SHIFT, 1, 0),
    468SOC_SINGLE("Ch2 Master Volume Bypass Switch", STA32X_C1CFG, STA32X_CxCFG_VBP_SHIFT, 1, 0),
    469SOC_SINGLE("Ch3 Master Volume Bypass Switch", STA32X_C1CFG, STA32X_CxCFG_VBP_SHIFT, 1, 0),
    470SOC_ENUM("Ch1 Limiter Select", sta32x_limiter_ch1_enum),
    471SOC_ENUM("Ch2 Limiter Select", sta32x_limiter_ch2_enum),
    472SOC_ENUM("Ch3 Limiter Select", sta32x_limiter_ch3_enum),
    473SOC_SINGLE_TLV("Bass Tone Control", STA32X_TONE, STA32X_TONE_BTC_SHIFT, 15, 0, tone_tlv),
    474SOC_SINGLE_TLV("Treble Tone Control", STA32X_TONE, STA32X_TONE_TTC_SHIFT, 15, 0, tone_tlv),
    475SOC_ENUM("Limiter1 Attack Rate (dB/ms)", sta32x_limiter1_attack_rate_enum),
    476SOC_ENUM("Limiter2 Attack Rate (dB/ms)", sta32x_limiter2_attack_rate_enum),
    477SOC_ENUM("Limiter1 Release Rate (dB/ms)", sta32x_limiter1_release_rate_enum),
    478SOC_ENUM("Limiter2 Release Rate (dB/ms)", sta32x_limiter2_release_rate_enum),
    479
    480/* depending on mode, the attack/release thresholds have
    481 * two different enum definitions; provide both
    482 */
    483SOC_SINGLE_TLV("Limiter1 Attack Threshold (AC Mode)", STA32X_L1ATRT, STA32X_LxA_SHIFT,
    484	       16, 0, sta32x_limiter_ac_attack_tlv),
    485SOC_SINGLE_TLV("Limiter2 Attack Threshold (AC Mode)", STA32X_L2ATRT, STA32X_LxA_SHIFT,
    486	       16, 0, sta32x_limiter_ac_attack_tlv),
    487SOC_SINGLE_TLV("Limiter1 Release Threshold (AC Mode)", STA32X_L1ATRT, STA32X_LxR_SHIFT,
    488	       16, 0, sta32x_limiter_ac_release_tlv),
    489SOC_SINGLE_TLV("Limiter2 Release Threshold (AC Mode)", STA32X_L2ATRT, STA32X_LxR_SHIFT,
    490	       16, 0, sta32x_limiter_ac_release_tlv),
    491SOC_SINGLE_TLV("Limiter1 Attack Threshold (DRC Mode)", STA32X_L1ATRT, STA32X_LxA_SHIFT,
    492	       16, 0, sta32x_limiter_drc_attack_tlv),
    493SOC_SINGLE_TLV("Limiter2 Attack Threshold (DRC Mode)", STA32X_L2ATRT, STA32X_LxA_SHIFT,
    494	       16, 0, sta32x_limiter_drc_attack_tlv),
    495SOC_SINGLE_TLV("Limiter1 Release Threshold (DRC Mode)", STA32X_L1ATRT, STA32X_LxR_SHIFT,
    496	       16, 0, sta32x_limiter_drc_release_tlv),
    497SOC_SINGLE_TLV("Limiter2 Release Threshold (DRC Mode)", STA32X_L2ATRT, STA32X_LxR_SHIFT,
    498	       16, 0, sta32x_limiter_drc_release_tlv),
    499
    500BIQUAD_COEFS("Ch1 - Biquad 1", 0),
    501BIQUAD_COEFS("Ch1 - Biquad 2", 5),
    502BIQUAD_COEFS("Ch1 - Biquad 3", 10),
    503BIQUAD_COEFS("Ch1 - Biquad 4", 15),
    504BIQUAD_COEFS("Ch2 - Biquad 1", 20),
    505BIQUAD_COEFS("Ch2 - Biquad 2", 25),
    506BIQUAD_COEFS("Ch2 - Biquad 3", 30),
    507BIQUAD_COEFS("Ch2 - Biquad 4", 35),
    508BIQUAD_COEFS("High-pass", 40),
    509BIQUAD_COEFS("Low-pass", 45),
    510SINGLE_COEF("Ch1 - Prescale", 50),
    511SINGLE_COEF("Ch2 - Prescale", 51),
    512SINGLE_COEF("Ch1 - Postscale", 52),
    513SINGLE_COEF("Ch2 - Postscale", 53),
    514SINGLE_COEF("Ch3 - Postscale", 54),
    515SINGLE_COEF("Thermal warning - Postscale", 55),
    516SINGLE_COEF("Ch1 - Mix 1", 56),
    517SINGLE_COEF("Ch1 - Mix 2", 57),
    518SINGLE_COEF("Ch2 - Mix 1", 58),
    519SINGLE_COEF("Ch2 - Mix 2", 59),
    520SINGLE_COEF("Ch3 - Mix 1", 60),
    521SINGLE_COEF("Ch3 - Mix 2", 61),
    522};
    523
    524static const struct snd_soc_dapm_widget sta32x_dapm_widgets[] = {
    525SND_SOC_DAPM_DAC("DAC", "Playback", SND_SOC_NOPM, 0, 0),
    526SND_SOC_DAPM_OUTPUT("LEFT"),
    527SND_SOC_DAPM_OUTPUT("RIGHT"),
    528SND_SOC_DAPM_OUTPUT("SUB"),
    529};
    530
    531static const struct snd_soc_dapm_route sta32x_dapm_routes[] = {
    532	{ "LEFT", NULL, "DAC" },
    533	{ "RIGHT", NULL, "DAC" },
    534	{ "SUB", NULL, "DAC" },
    535};
    536
    537/* MCLK interpolation ratio per fs */
    538static struct {
    539	int fs;
    540	int ir;
    541} interpolation_ratios[] = {
    542	{ 32000, 0 },
    543	{ 44100, 0 },
    544	{ 48000, 0 },
    545	{ 88200, 1 },
    546	{ 96000, 1 },
    547	{ 176400, 2 },
    548	{ 192000, 2 },
    549};
    550
    551/* MCLK to fs clock ratios */
    552static int mcs_ratio_table[3][7] = {
    553	{ 768, 512, 384, 256, 128, 576, 0 },
    554	{ 384, 256, 192, 128,  64,   0 },
    555	{ 384, 256, 192, 128,  64,   0 },
    556};
    557
    558/**
    559 * sta32x_set_dai_sysclk - configure MCLK
    560 * @codec_dai: the codec DAI
    561 * @clk_id: the clock ID (ignored)
    562 * @freq: the MCLK input frequency
    563 * @dir: the clock direction (ignored)
    564 *
    565 * The value of MCLK is used to determine which sample rates are supported
    566 * by the STA32X, based on the mclk_ratios table.
    567 *
    568 * This function must be called by the machine driver's 'startup' function,
    569 * otherwise the list of supported sample rates will not be available in
    570 * time for ALSA.
    571 *
    572 * For setups with variable MCLKs, pass 0 as 'freq' argument. This will cause
    573 * theoretically possible sample rates to be enabled. Call it again with a
    574 * proper value set one the external clock is set (most probably you would do
    575 * that from a machine's driver 'hw_param' hook.
    576 */
    577static int sta32x_set_dai_sysclk(struct snd_soc_dai *codec_dai,
    578		int clk_id, unsigned int freq, int dir)
    579{
    580	struct snd_soc_component *component = codec_dai->component;
    581	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    582
    583	dev_dbg(component->dev, "mclk=%u\n", freq);
    584	sta32x->mclk = freq;
    585
    586	return 0;
    587}
    588
    589/**
    590 * sta32x_set_dai_fmt - configure the codec for the selected audio format
    591 * @codec_dai: the codec DAI
    592 * @fmt: a SND_SOC_DAIFMT_x value indicating the data format
    593 *
    594 * This function takes a bitmask of SND_SOC_DAIFMT_x bits and programs the
    595 * codec accordingly.
    596 */
    597static int sta32x_set_dai_fmt(struct snd_soc_dai *codec_dai,
    598			      unsigned int fmt)
    599{
    600	struct snd_soc_component *component = codec_dai->component;
    601	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    602	u8 confb = 0;
    603
    604	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
    605	case SND_SOC_DAIFMT_CBS_CFS:
    606		break;
    607	default:
    608		return -EINVAL;
    609	}
    610
    611	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
    612	case SND_SOC_DAIFMT_I2S:
    613	case SND_SOC_DAIFMT_RIGHT_J:
    614	case SND_SOC_DAIFMT_LEFT_J:
    615		sta32x->format = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
    616		break;
    617	default:
    618		return -EINVAL;
    619	}
    620
    621	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
    622	case SND_SOC_DAIFMT_NB_NF:
    623		confb |= STA32X_CONFB_C2IM;
    624		break;
    625	case SND_SOC_DAIFMT_NB_IF:
    626		confb |= STA32X_CONFB_C1IM;
    627		break;
    628	default:
    629		return -EINVAL;
    630	}
    631
    632	return regmap_update_bits(sta32x->regmap, STA32X_CONFB,
    633				  STA32X_CONFB_C1IM | STA32X_CONFB_C2IM, confb);
    634}
    635
    636/**
    637 * sta32x_hw_params - program the STA32X with the given hardware parameters.
    638 * @substream: the audio stream
    639 * @params: the hardware parameters to set
    640 * @dai: the SOC DAI (ignored)
    641 *
    642 * This function programs the hardware with the values provided.
    643 * Specifically, the sample rate and the data format.
    644 */
    645static int sta32x_hw_params(struct snd_pcm_substream *substream,
    646			    struct snd_pcm_hw_params *params,
    647			    struct snd_soc_dai *dai)
    648{
    649	struct snd_soc_component *component = dai->component;
    650	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    651	int i, mcs = -EINVAL, ir = -EINVAL;
    652	unsigned int confa, confb;
    653	unsigned int rate, ratio;
    654	int ret;
    655
    656	if (!sta32x->mclk) {
    657		dev_err(component->dev,
    658			"sta32x->mclk is unset. Unable to determine ratio\n");
    659		return -EIO;
    660	}
    661
    662	rate = params_rate(params);
    663	ratio = sta32x->mclk / rate;
    664	dev_dbg(component->dev, "rate: %u, ratio: %u\n", rate, ratio);
    665
    666	for (i = 0; i < ARRAY_SIZE(interpolation_ratios); i++) {
    667		if (interpolation_ratios[i].fs == rate) {
    668			ir = interpolation_ratios[i].ir;
    669			break;
    670		}
    671	}
    672
    673	if (ir < 0) {
    674		dev_err(component->dev, "Unsupported samplerate: %u\n", rate);
    675		return -EINVAL;
    676	}
    677
    678	for (i = 0; i < 6; i++) {
    679		if (mcs_ratio_table[ir][i] == ratio) {
    680			mcs = i;
    681			break;
    682		}
    683	}
    684
    685	if (mcs < 0) {
    686		dev_err(component->dev, "Unresolvable ratio: %u\n", ratio);
    687		return -EINVAL;
    688	}
    689
    690	confa = (ir << STA32X_CONFA_IR_SHIFT) |
    691		(mcs << STA32X_CONFA_MCS_SHIFT);
    692	confb = 0;
    693
    694	switch (params_width(params)) {
    695	case 24:
    696		dev_dbg(component->dev, "24bit\n");
    697		fallthrough;
    698	case 32:
    699		dev_dbg(component->dev, "24bit or 32bit\n");
    700		switch (sta32x->format) {
    701		case SND_SOC_DAIFMT_I2S:
    702			confb |= 0x0;
    703			break;
    704		case SND_SOC_DAIFMT_LEFT_J:
    705			confb |= 0x1;
    706			break;
    707		case SND_SOC_DAIFMT_RIGHT_J:
    708			confb |= 0x2;
    709			break;
    710		}
    711
    712		break;
    713	case 20:
    714		dev_dbg(component->dev, "20bit\n");
    715		switch (sta32x->format) {
    716		case SND_SOC_DAIFMT_I2S:
    717			confb |= 0x4;
    718			break;
    719		case SND_SOC_DAIFMT_LEFT_J:
    720			confb |= 0x5;
    721			break;
    722		case SND_SOC_DAIFMT_RIGHT_J:
    723			confb |= 0x6;
    724			break;
    725		}
    726
    727		break;
    728	case 18:
    729		dev_dbg(component->dev, "18bit\n");
    730		switch (sta32x->format) {
    731		case SND_SOC_DAIFMT_I2S:
    732			confb |= 0x8;
    733			break;
    734		case SND_SOC_DAIFMT_LEFT_J:
    735			confb |= 0x9;
    736			break;
    737		case SND_SOC_DAIFMT_RIGHT_J:
    738			confb |= 0xa;
    739			break;
    740		}
    741
    742		break;
    743	case 16:
    744		dev_dbg(component->dev, "16bit\n");
    745		switch (sta32x->format) {
    746		case SND_SOC_DAIFMT_I2S:
    747			confb |= 0x0;
    748			break;
    749		case SND_SOC_DAIFMT_LEFT_J:
    750			confb |= 0xd;
    751			break;
    752		case SND_SOC_DAIFMT_RIGHT_J:
    753			confb |= 0xe;
    754			break;
    755		}
    756
    757		break;
    758	default:
    759		return -EINVAL;
    760	}
    761
    762	ret = regmap_update_bits(sta32x->regmap, STA32X_CONFA,
    763				 STA32X_CONFA_MCS_MASK | STA32X_CONFA_IR_MASK,
    764				 confa);
    765	if (ret < 0)
    766		return ret;
    767
    768	ret = regmap_update_bits(sta32x->regmap, STA32X_CONFB,
    769				 STA32X_CONFB_SAI_MASK | STA32X_CONFB_SAIFB,
    770				 confb);
    771	if (ret < 0)
    772		return ret;
    773
    774	return 0;
    775}
    776
    777static int sta32x_startup_sequence(struct sta32x_priv *sta32x)
    778{
    779	if (sta32x->gpiod_nreset) {
    780		gpiod_set_value(sta32x->gpiod_nreset, 0);
    781		mdelay(1);
    782		gpiod_set_value(sta32x->gpiod_nreset, 1);
    783		mdelay(1);
    784	}
    785
    786	return 0;
    787}
    788
    789/**
    790 * sta32x_set_bias_level - DAPM callback
    791 * @component: the component device
    792 * @level: DAPM power level
    793 *
    794 * This is called by ALSA to put the component into low power mode
    795 * or to wake it up.  If the component is powered off completely
    796 * all registers must be restored after power on.
    797 */
    798static int sta32x_set_bias_level(struct snd_soc_component *component,
    799				 enum snd_soc_bias_level level)
    800{
    801	int ret;
    802	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    803
    804	dev_dbg(component->dev, "level = %d\n", level);
    805	switch (level) {
    806	case SND_SOC_BIAS_ON:
    807		break;
    808
    809	case SND_SOC_BIAS_PREPARE:
    810		/* Full power on */
    811		regmap_update_bits(sta32x->regmap, STA32X_CONFF,
    812				    STA32X_CONFF_PWDN | STA32X_CONFF_EAPD,
    813				    STA32X_CONFF_PWDN | STA32X_CONFF_EAPD);
    814		break;
    815
    816	case SND_SOC_BIAS_STANDBY:
    817		if (snd_soc_component_get_bias_level(component) == SND_SOC_BIAS_OFF) {
    818			ret = regulator_bulk_enable(ARRAY_SIZE(sta32x->supplies),
    819						    sta32x->supplies);
    820			if (ret != 0) {
    821				dev_err(component->dev,
    822					"Failed to enable supplies: %d\n", ret);
    823				return ret;
    824			}
    825
    826			sta32x_startup_sequence(sta32x);
    827			sta32x_cache_sync(component);
    828			sta32x_watchdog_start(sta32x);
    829		}
    830
    831		/* Power down */
    832		regmap_update_bits(sta32x->regmap, STA32X_CONFF,
    833				   STA32X_CONFF_PWDN | STA32X_CONFF_EAPD,
    834				   0);
    835
    836		break;
    837
    838	case SND_SOC_BIAS_OFF:
    839		/* The chip runs through the power down sequence for us. */
    840		regmap_update_bits(sta32x->regmap, STA32X_CONFF,
    841				   STA32X_CONFF_PWDN | STA32X_CONFF_EAPD, 0);
    842		msleep(300);
    843		sta32x_watchdog_stop(sta32x);
    844
    845		gpiod_set_value(sta32x->gpiod_nreset, 0);
    846
    847		regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies),
    848				       sta32x->supplies);
    849		break;
    850	}
    851	return 0;
    852}
    853
    854static const struct snd_soc_dai_ops sta32x_dai_ops = {
    855	.hw_params	= sta32x_hw_params,
    856	.set_sysclk	= sta32x_set_dai_sysclk,
    857	.set_fmt	= sta32x_set_dai_fmt,
    858};
    859
    860static struct snd_soc_dai_driver sta32x_dai = {
    861	.name = "sta32x-hifi",
    862	.playback = {
    863		.stream_name = "Playback",
    864		.channels_min = 2,
    865		.channels_max = 2,
    866		.rates = STA32X_RATES,
    867		.formats = STA32X_FORMATS,
    868	},
    869	.ops = &sta32x_dai_ops,
    870};
    871
    872static int sta32x_probe(struct snd_soc_component *component)
    873{
    874	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    875	struct sta32x_platform_data *pdata = sta32x->pdata;
    876	int i, ret = 0, thermal = 0;
    877
    878	sta32x->component = component;
    879
    880	if (sta32x->xti_clk) {
    881		ret = clk_prepare_enable(sta32x->xti_clk);
    882		if (ret != 0) {
    883			dev_err(component->dev,
    884				"Failed to enable clock: %d\n", ret);
    885			return ret;
    886		}
    887	}
    888
    889	ret = regulator_bulk_enable(ARRAY_SIZE(sta32x->supplies),
    890				    sta32x->supplies);
    891	if (ret != 0) {
    892		dev_err(component->dev, "Failed to enable supplies: %d\n", ret);
    893		goto err_clk_disable_unprepare;
    894	}
    895
    896	ret = sta32x_startup_sequence(sta32x);
    897	if (ret < 0) {
    898		dev_err(component->dev, "Failed to startup device\n");
    899		goto err_regulator_bulk_disable;
    900	}
    901
    902	/* CONFA */
    903	if (!pdata->thermal_warning_recovery)
    904		thermal |= STA32X_CONFA_TWAB;
    905	if (!pdata->thermal_warning_adjustment)
    906		thermal |= STA32X_CONFA_TWRB;
    907	if (!pdata->fault_detect_recovery)
    908		thermal |= STA32X_CONFA_FDRB;
    909	regmap_update_bits(sta32x->regmap, STA32X_CONFA,
    910			   STA32X_CONFA_TWAB | STA32X_CONFA_TWRB |
    911			   STA32X_CONFA_FDRB,
    912			   thermal);
    913
    914	/* CONFC */
    915	regmap_update_bits(sta32x->regmap, STA32X_CONFC,
    916			   STA32X_CONFC_CSZ_MASK,
    917			   pdata->drop_compensation_ns
    918				<< STA32X_CONFC_CSZ_SHIFT);
    919
    920	/* CONFE */
    921	regmap_update_bits(sta32x->regmap, STA32X_CONFE,
    922			   STA32X_CONFE_MPCV,
    923			   pdata->max_power_use_mpcc ?
    924				STA32X_CONFE_MPCV : 0);
    925	regmap_update_bits(sta32x->regmap, STA32X_CONFE,
    926			   STA32X_CONFE_MPC,
    927			   pdata->max_power_correction ?
    928				STA32X_CONFE_MPC : 0);
    929	regmap_update_bits(sta32x->regmap, STA32X_CONFE,
    930			   STA32X_CONFE_AME,
    931			   pdata->am_reduction_mode ?
    932				STA32X_CONFE_AME : 0);
    933	regmap_update_bits(sta32x->regmap, STA32X_CONFE,
    934			   STA32X_CONFE_PWMS,
    935			   pdata->odd_pwm_speed_mode ?
    936				STA32X_CONFE_PWMS : 0);
    937
    938	/*  CONFF */
    939	regmap_update_bits(sta32x->regmap, STA32X_CONFF,
    940			   STA32X_CONFF_IDE,
    941			   pdata->invalid_input_detect_mute ?
    942				STA32X_CONFF_IDE : 0);
    943
    944	/* select output configuration  */
    945	regmap_update_bits(sta32x->regmap, STA32X_CONFF,
    946			   STA32X_CONFF_OCFG_MASK,
    947			   pdata->output_conf
    948				<< STA32X_CONFF_OCFG_SHIFT);
    949
    950	/* channel to output mapping */
    951	regmap_update_bits(sta32x->regmap, STA32X_C1CFG,
    952			   STA32X_CxCFG_OM_MASK,
    953			   pdata->ch1_output_mapping
    954				<< STA32X_CxCFG_OM_SHIFT);
    955	regmap_update_bits(sta32x->regmap, STA32X_C2CFG,
    956			   STA32X_CxCFG_OM_MASK,
    957			   pdata->ch2_output_mapping
    958				<< STA32X_CxCFG_OM_SHIFT);
    959	regmap_update_bits(sta32x->regmap, STA32X_C3CFG,
    960			   STA32X_CxCFG_OM_MASK,
    961			   pdata->ch3_output_mapping
    962				<< STA32X_CxCFG_OM_SHIFT);
    963
    964	/* initialize coefficient shadow RAM with reset values */
    965	for (i = 4; i <= 49; i += 5)
    966		sta32x->coef_shadow[i] = 0x400000;
    967	for (i = 50; i <= 54; i++)
    968		sta32x->coef_shadow[i] = 0x7fffff;
    969	sta32x->coef_shadow[55] = 0x5a9df7;
    970	sta32x->coef_shadow[56] = 0x7fffff;
    971	sta32x->coef_shadow[59] = 0x7fffff;
    972	sta32x->coef_shadow[60] = 0x400000;
    973	sta32x->coef_shadow[61] = 0x400000;
    974
    975	if (sta32x->pdata->needs_esd_watchdog)
    976		INIT_DELAYED_WORK(&sta32x->watchdog_work, sta32x_watchdog);
    977
    978	snd_soc_component_force_bias_level(component, SND_SOC_BIAS_STANDBY);
    979	/* Bias level configuration will have done an extra enable */
    980	regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies);
    981
    982	return 0;
    983
    984err_regulator_bulk_disable:
    985	regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies);
    986err_clk_disable_unprepare:
    987	if (sta32x->xti_clk)
    988		clk_disable_unprepare(sta32x->xti_clk);
    989	return ret;
    990}
    991
    992static void sta32x_remove(struct snd_soc_component *component)
    993{
    994	struct sta32x_priv *sta32x = snd_soc_component_get_drvdata(component);
    995
    996	sta32x_watchdog_stop(sta32x);
    997	regulator_bulk_disable(ARRAY_SIZE(sta32x->supplies), sta32x->supplies);
    998
    999	if (sta32x->xti_clk)
   1000		clk_disable_unprepare(sta32x->xti_clk);
   1001}
   1002
   1003static const struct snd_soc_component_driver sta32x_component = {
   1004	.probe			= sta32x_probe,
   1005	.remove			= sta32x_remove,
   1006	.set_bias_level		= sta32x_set_bias_level,
   1007	.controls		= sta32x_snd_controls,
   1008	.num_controls		= ARRAY_SIZE(sta32x_snd_controls),
   1009	.dapm_widgets		= sta32x_dapm_widgets,
   1010	.num_dapm_widgets	= ARRAY_SIZE(sta32x_dapm_widgets),
   1011	.dapm_routes		= sta32x_dapm_routes,
   1012	.num_dapm_routes	= ARRAY_SIZE(sta32x_dapm_routes),
   1013	.suspend_bias_off	= 1,
   1014	.idle_bias_on		= 1,
   1015	.use_pmdown_time	= 1,
   1016	.endianness		= 1,
   1017	.non_legacy_dai_naming	= 1,
   1018};
   1019
   1020static const struct regmap_config sta32x_regmap = {
   1021	.reg_bits =		8,
   1022	.val_bits =		8,
   1023	.max_register =		STA32X_FDRC2,
   1024	.reg_defaults =		sta32x_regs,
   1025	.num_reg_defaults =	ARRAY_SIZE(sta32x_regs),
   1026	.cache_type =		REGCACHE_RBTREE,
   1027	.wr_table =		&sta32x_write_regs,
   1028	.rd_table =		&sta32x_read_regs,
   1029	.volatile_table =	&sta32x_volatile_regs,
   1030};
   1031
   1032#ifdef CONFIG_OF
   1033static const struct of_device_id st32x_dt_ids[] = {
   1034	{ .compatible = "st,sta32x", },
   1035	{ }
   1036};
   1037MODULE_DEVICE_TABLE(of, st32x_dt_ids);
   1038
   1039static int sta32x_probe_dt(struct device *dev, struct sta32x_priv *sta32x)
   1040{
   1041	struct device_node *np = dev->of_node;
   1042	struct sta32x_platform_data *pdata;
   1043	u16 tmp;
   1044
   1045	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
   1046	if (!pdata)
   1047		return -ENOMEM;
   1048
   1049	of_property_read_u8(np, "st,output-conf",
   1050			    &pdata->output_conf);
   1051	of_property_read_u8(np, "st,ch1-output-mapping",
   1052			    &pdata->ch1_output_mapping);
   1053	of_property_read_u8(np, "st,ch2-output-mapping",
   1054			    &pdata->ch2_output_mapping);
   1055	of_property_read_u8(np, "st,ch3-output-mapping",
   1056			    &pdata->ch3_output_mapping);
   1057
   1058	if (of_get_property(np, "st,fault-detect-recovery", NULL))
   1059		pdata->fault_detect_recovery = 1;
   1060	if (of_get_property(np, "st,thermal-warning-recovery", NULL))
   1061		pdata->thermal_warning_recovery = 1;
   1062	if (of_get_property(np, "st,thermal-warning-adjustment", NULL))
   1063		pdata->thermal_warning_adjustment = 1;
   1064	if (of_get_property(np, "st,needs_esd_watchdog", NULL))
   1065		pdata->needs_esd_watchdog = 1;
   1066
   1067	tmp = 140;
   1068	of_property_read_u16(np, "st,drop-compensation-ns", &tmp);
   1069	pdata->drop_compensation_ns = clamp_t(u16, tmp, 0, 300) / 20;
   1070
   1071	/* CONFE */
   1072	if (of_get_property(np, "st,max-power-use-mpcc", NULL))
   1073		pdata->max_power_use_mpcc = 1;
   1074
   1075	if (of_get_property(np, "st,max-power-correction", NULL))
   1076		pdata->max_power_correction = 1;
   1077
   1078	if (of_get_property(np, "st,am-reduction-mode", NULL))
   1079		pdata->am_reduction_mode = 1;
   1080
   1081	if (of_get_property(np, "st,odd-pwm-speed-mode", NULL))
   1082		pdata->odd_pwm_speed_mode = 1;
   1083
   1084	/* CONFF */
   1085	if (of_get_property(np, "st,invalid-input-detect-mute", NULL))
   1086		pdata->invalid_input_detect_mute = 1;
   1087
   1088	sta32x->pdata = pdata;
   1089
   1090	return 0;
   1091}
   1092#endif
   1093
   1094static int sta32x_i2c_probe(struct i2c_client *i2c)
   1095{
   1096	struct device *dev = &i2c->dev;
   1097	struct sta32x_priv *sta32x;
   1098	int ret, i;
   1099
   1100	sta32x = devm_kzalloc(&i2c->dev, sizeof(struct sta32x_priv),
   1101			      GFP_KERNEL);
   1102	if (!sta32x)
   1103		return -ENOMEM;
   1104
   1105	mutex_init(&sta32x->coeff_lock);
   1106	sta32x->pdata = dev_get_platdata(dev);
   1107
   1108#ifdef CONFIG_OF
   1109	if (dev->of_node) {
   1110		ret = sta32x_probe_dt(dev, sta32x);
   1111		if (ret < 0)
   1112			return ret;
   1113	}
   1114#endif
   1115
   1116	/* Clock */
   1117	sta32x->xti_clk = devm_clk_get(dev, "xti");
   1118	if (IS_ERR(sta32x->xti_clk)) {
   1119		ret = PTR_ERR(sta32x->xti_clk);
   1120
   1121		if (ret == -EPROBE_DEFER)
   1122			return ret;
   1123
   1124		sta32x->xti_clk = NULL;
   1125	}
   1126
   1127	/* GPIOs */
   1128	sta32x->gpiod_nreset = devm_gpiod_get_optional(dev, "reset",
   1129						       GPIOD_OUT_LOW);
   1130	if (IS_ERR(sta32x->gpiod_nreset))
   1131		return PTR_ERR(sta32x->gpiod_nreset);
   1132
   1133	/* regulators */
   1134	for (i = 0; i < ARRAY_SIZE(sta32x->supplies); i++)
   1135		sta32x->supplies[i].supply = sta32x_supply_names[i];
   1136
   1137	ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(sta32x->supplies),
   1138				      sta32x->supplies);
   1139	if (ret != 0) {
   1140		dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
   1141		return ret;
   1142	}
   1143
   1144	sta32x->regmap = devm_regmap_init_i2c(i2c, &sta32x_regmap);
   1145	if (IS_ERR(sta32x->regmap)) {
   1146		ret = PTR_ERR(sta32x->regmap);
   1147		dev_err(dev, "Failed to init regmap: %d\n", ret);
   1148		return ret;
   1149	}
   1150
   1151	i2c_set_clientdata(i2c, sta32x);
   1152
   1153	ret = devm_snd_soc_register_component(dev, &sta32x_component,
   1154					      &sta32x_dai, 1);
   1155	if (ret < 0)
   1156		dev_err(dev, "Failed to register component (%d)\n", ret);
   1157
   1158	return ret;
   1159}
   1160
   1161static const struct i2c_device_id sta32x_i2c_id[] = {
   1162	{ "sta326", 0 },
   1163	{ "sta328", 0 },
   1164	{ "sta329", 0 },
   1165	{ }
   1166};
   1167MODULE_DEVICE_TABLE(i2c, sta32x_i2c_id);
   1168
   1169static struct i2c_driver sta32x_i2c_driver = {
   1170	.driver = {
   1171		.name = "sta32x",
   1172		.of_match_table = of_match_ptr(st32x_dt_ids),
   1173	},
   1174	.probe_new = sta32x_i2c_probe,
   1175	.id_table = sta32x_i2c_id,
   1176};
   1177
   1178module_i2c_driver(sta32x_i2c_driver);
   1179
   1180MODULE_DESCRIPTION("ASoC STA32X driver");
   1181MODULE_AUTHOR("Johannes Stezenbach <js@sig21.net>");
   1182MODULE_LICENSE("GPL");