blob: 4e9f86cb7860630714962da2a94c0987d5f729a2 [file] [edit]
// SPDX-License-Identifier: GPL-2.0-only
//
// ESS Technology ES9039Q2M 32-bit 2-channel audio DAC
//
// Copyright (C) 2026 Karl Asseily <karl@asseily.com>
//
// Every register number, bit field and default in this file was taken from
// ES9039Q2M datasheet v0.2.3 and then verified by reading the defaults back off
// a live part over I2C.
//
// The part has two control personalities selected by the MODE pin: hardware
// mode (strapped by HW0/HW1/HW2, no bus at all) and software mode (I2C or SPI).
// This driver implements software mode over I2C, which MODE = GND selects.
//
// Three properties shape the driver:
//
// - There is an ASRC in front of the DAC, so MCLK need not be synchronous with
// BCLK or LRCK. A board may feed it a fixed oscillator, or may run it
// synchronously and let the part generate BCLK and WS; both are supported.
//
// - INPUT_SEL chooses PCM / DSD / DoP / S/PDIF. It does NOT choose I2S vs
// left-justified - that is TDM_LJ_MODE in register 60, and there is no
// right-justified mode to map onto at all.
//
// - Several registers have non-zero reserved defaults (register 88 reads
// 0xb8 at reset), so every write here is read-modify-write.
#include <linux/bitfield.h>
#include <linux/cleanup.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/regmap.h>
#include <linux/regulator/consumer.h>
#include <sound/control.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/tlv.h>
/* ------------------------------------------------- read/write registers ---- */
#define ES9039_SYSTEM_CONFIG 0x00 /* reg 0 */
#define ES9039_DAC_MODE BIT(1) /* CLEAR at reset - datapath off */
#define ES9039_64FS_MODE BIT(6)
/*
* Register 1 selects which DECODERS are running, and it is separate from
* INPUT_SEL in register 57, which only says which port to listen to. Both are
* needed: on reset only ENABLE_TDM_DECODE is set, so selecting DoP as the input
* while leaving bit 2 clear leaves the part hunting for a marker with the
* marker decoder switched off. It then finds no valid DoP and mutes - silence,
* DOP_VALID reading 0, and nothing anywhere saying why. Measured on hardware.
*/
#define ES9039_SYS_MODE 0x01 /* reg 1, reset 0xb1 */
#define ES9039_ENABLE_TDM_DECODE BIT(0) /* set at reset */
#define ES9039_ENABLE_DSD_DECODE BIT(1)
#define ES9039_ENABLE_DOP_DECODE BIT(2)
#define ES9039_ENABLE_SPDIF_DECODE BIT(3)
#define ES9039_SYNC_MODE BIT(6) /* 0 = ASYNC */
#define ES9039_ENABLE_DAC_CLK BIT(7) /* set at reset */
/*
* Every decoder the part has. hw_params() enables one of these and clears the
* rest, so leaving S/PDIF out of the mask would have left its decoder running
* alongside the selected one.
*/
#define ES9039_DECODE_MASK (ES9039_ENABLE_TDM_DECODE | \
ES9039_ENABLE_DSD_DECODE | \
ES9039_ENABLE_DOP_DECODE | \
ES9039_ENABLE_SPDIF_DECODE)
#define ES9039_AUTO_FS_DETECT 0x03 /* reg 3 */
#define ES9039_AUTO_FS_DETECT_EN BIT(7)
#define ES9039_CLOCK_CONFIG 0x04 /* reg 4, MASTER_BCK_DIV */
#define ES9039_INPUT_SEL 0x39 /* reg 57 */
#define ES9039_AUTO_INPUT_SEL BIT(0)
#define ES9039_INPUT_SEL_MASK GENMASK(2, 1)
#define ES9039_INPUT_PCM 0x0
#define ES9039_INPUT_DSD 0x1
#define ES9039_INPUT_DOP 0x2
#define ES9039_INPUT_SPDIF 0x3
#define ES9039_PCM_MASTER_MODE BIT(4)
#define ES9039_DSD_MASTER_MODE BIT(5)
#define ES9039_DSD_FAULT_DETECT BIT(6) /* set at reset */
#define ES9039_MASTER_ENC 0x3a /* reg 58 */
#define ES9039_BCK_INV BIT(6)
#define ES9039_TDM_CH_NUM 0x3b /* reg 59, slots = value + 1 */
#define ES9039_TDM_CH_NUM_MASK GENMASK(4, 0)
#define ES9039_TDM_CONFIG1 0x3c /* reg 60 */
#define ES9039_TDM_VALID_EDGE BIT(6)
#define ES9039_TDM_LJ_MODE BIT(7) /* 0 = standard I2S */
#define ES9039_TDM_CONFIG2 0x3d /* reg 61 */
#define ES9039_TDM_BIT_WIDTH_MASK GENMASK(6, 5)
#define ES9039_WIDTH_32 0x0
#define ES9039_WIDTH_24 0x1
#define ES9039_WIDTH_16 0x2
#define ES9039_MONITOR_CFG 0x3e /* reg 62 */
#define ES9039_DISABLE_PCM_DC BIT(3)
#define ES9039_ENABLE_BCK_MONITOR BIT(4) /* set at reset */
#define ES9039_ENABLE_WS_MONITOR BIT(5) /* set at reset */
#define ES9039_DISABLE_DSD_MUTE BIT(6)
#define ES9039_DISABLE_DSD_DC BIT(7)
#define ES9039_VOLUME_CH1 0x4a /* reg 74, 0x00 = 0 dB */
#define ES9039_VOLUME_CH2 0x4b /* reg 75, 0xff = -127.5 dB */
#define ES9039_VOL_MAX 0xff
#define ES9039_VOL_RATE_UP 0x52 /* reg 82 */
#define ES9039_VOL_RATE_DOWN 0x53 /* reg 83 */
#define ES9039_DAC_MUTE 0x56 /* reg 86, 1 = muted */
#define ES9039_MUTE_CH1 BIT(0)
#define ES9039_MUTE_CH2 BIT(1)
#define ES9039_MUTE_BOTH (ES9039_MUTE_CH1 | ES9039_MUTE_CH2)
#define ES9039_DAC_INVERT 0x57 /* reg 87 */
#define ES9039_FILTER_SHAPE 0x58 /* reg 88, [7:3] reset to 10111 */
#define ES9039_FILTER_SHAPE_MASK GENMASK(2, 0)
#define ES9039_FILTER_APODIZING 1 /* linear phase apodizing fast */
#define ES9039_IIR_SPDIF 0x59 /* reg 89 */
#define ES9039_IIR_BW_MASK GENMASK(2, 0)
#define ES9039_VOLUME_HOLD BIT(3)
#define ES9039_SPDIF_SEL_MASK GENMASK(7, 4)
#define ES9039_DAC_PATH 0x5a /* reg 90 */
#define ES9039_BYPASS_FIR2X BIT(0)
#define ES9039_BYPASS_FIR4X BIT(1)
#define ES9039_BYPASS_IIR BIT(2)
#define ES9039_THD_C2 0x5b /* regs 91-94: CH1 lo, CH2 hi */
#define ES9039_THD_C3 0x6b /* regs 107-110 */
#define ES9039_AUTOMUTE_EN 0x7b /* reg 123, both set at reset */
#define ES9039_AUTOMUTE_TIME 0x7c /* regs 124-125 */
#define ES9039_AUTOMUTE_TIME_MASK GENMASK(10, 0)
#define ES9039_MUTE_RAMP_TO_GND BIT(11) /* set at reset */
#define ES9039_AUTOMUTE_LEVEL 0x7e /* regs 126-127 */
#define ES9039_AUTOMUTE_OFF_LEVEL 0x80 /* regs 128-129 */
#define ES9039_SOFT_RAMP 0x82 /* reg 130, valid 0..12 */
#define ES9039_SOFT_RAMP_MASK GENMASK(4, 0)
#define ES9039_SOFT_RAMP_MAX 12
#define ES9039_NSMOD 0x83 /* reg 131 */
#define ES9039_NSMOD_WIDE_BW_MASK GENMASK(4, 1)
#define ES9039_NSMOD_DEFAULT 0x4
#define ES9039_NSMOD_WIDE 0xc
#define ES9039_PROG_RAM_CTRL 0x87 /* reg 135 */
#define ES9039_PROG_COEFF_EN BIT(0)
#define ES9039_PROG_COEFF_WE BIT(1)
#define ES9039_PROG_RAM_ADDR 0x89 /* reg 137 */
#define ES9039_PROG_ADDR_MASK GENMASK(6, 0)
#define ES9039_PROG_STAGE_4X BIT(7)
#define ES9039_PROG_RAM_DATA 0x8a /* regs 138-140, 24-bit signed */
#define ES9039_LAST_RW 0x8e /* reg 145 */
/* ----------------------------------------------------- readback registers -- */
#define ES9039_READBACK_BASE 0xe0 /* reg 224 */
#define ES9039_CHIP_ID 0xe1 /* reg 225 */
#define ES9039_CHIP_ID_ES9039Q2M 0x63
#define ES9039_IRQ_SOURCES 0xea /* regs 234-235, 16-bit */
#define ES9039_SRC_VOL_MIN_MASK GENMASK(1, 0)
#define ES9039_SRC_AUTOMUTE_MASK GENMASK(3, 2)
#define ES9039_SRC_SS_RAMP_MASK GENMASK(5, 4)
#define ES9039_SRC_DOP_VALID BIT(6)
#define ES9039_SRC_BCK_WS_FAIL BIT(7)
#define ES9039_SRC_TDM_VALID BIT(11)
#define ES9039_AUTO_FS_READ 0xef /* reg 239 */
#define ES9039_FS_DIV_MASK GENMASK(5, 0)
#define ES9039_FS_HALF_DIV BIT(6)
#define ES9039_FS_DIV_VALID BIT(7)
#define ES9039_AUTOMUTE_READ 0xf2 /* reg 242 */
#define ES9039_INPUT_STREAM_READ 0xf5 /* reg 245 */
#define ES9039_RD_INPUT_SEL_MASK GENMASK(1, 0)
#define ES9039_RD_DOP_VALID BIT(2)
#define ES9039_RD_TDM_VALID BIT(3)
#define ES9039_RD_SPDIF_VALID BIT(4)
#define ES9039_MAX_REGISTER 0xfb /* reg 251 */
/* Programmable oversampling FIR: 128 taps in the 2x stage, 32 in the 4x. */
#define ES9039_FIR2X_TAPS 128
#define ES9039_FIR4X_TAPS 32
#define ES9039_COEFF_BYTES 3
#define ES9039_FIR_STAGES 2 /* [0] = 2x stage, [1] = 4x */
/* In power-up order. Reversed on the way down. Datasheet figure 22. */
#define ES9039_NUM_SUPPLIES 4
#define ES9039_FIR_MAX_BYTES (ES9039_FIR2X_TAPS * ES9039_COEFF_BYTES)
/* ------------------------------------------------------------------ private */
struct es9039q2m_priv {
struct regmap *regmap;
struct clk *mclk;
unsigned int mclk_rate;
unsigned int fmt;
unsigned int stream_rate; /* last rate from hw_params */
unsigned int bclk_ratio; /* bit clocks per frame, 0 = unknown */
/*
* Serialises dop_auto against hw_params(), which reads it while
* deciding what to program. Without it a control write racing a
* stream start can leave the two DoP registers disagreeing.
*/
struct mutex lock;
bool dop_auto; /* let the part detect DoP itself */
/*
* ES9039_DAC_MUTE has two owners and neither can hold it alone: the
* "Master Playback Switch" control, and mute_stream() around stream
* start and stop. Both record what they want here and the register is
* written from the union, so a user unmute cannot un-mute a stopped
* stream and a stream start cannot override a user mute.
*
* mute_stream starts FALSE and only a real mute_stream(1) sets it.
* Starting it true seemed the safe choice - come up muted - but it is
* not: if a card never reaches the DAI mute callbacks, the flag never
* clears, and because the control now records intent rather than
* writing the register there is nothing the user can do about it. The
* DAC is then muted for ever and the mixer looks fine. Measured on
* hardware: silent with the switch on, off, stream or no stream. Pop
* suppression at probe comes from writing the register
* directly instead, which is what the driver did before this rework
* and is a state either owner may legitimately lift.
*/
unsigned int mute_user; /* ES9039_MUTE_CH* the user asked for */
bool mute_stream; /* ASoC has the stream muted */
bool provider; /* part drives BCK and WS */
bool mclk_fixed; /* MCLK rate cannot be changed, so ASRC it is */
/*
* The four supply inputs, held IN POWER-UP ORDER - the array order is
* the datasheet's sequence and the enable loop walks it forwards, the
* disable loop backwards. DVDD is not among them: the part's 1.2 V
* digital rail is generated on chip and that pin wants a decoupling
* capacitor, not a regulator.
*/
struct regulator_bulk_data supplies[ES9039_NUM_SUPPLIES];
/*
* Shadow of whatever was last uploaded to the programmable FIR RAM.
*
* That RAM cannot be read back - see the upload code below - so regmap
* cannot cache it and nothing else in the system knows its contents.
* A board that removes the part's supplies in system suspend therefore
* comes back with the RAM undefined while regcache_sync() restores the
* filter SELECTION from the cache, which would point the interpolator
* at whatever the RAM powered up holding. Keep a copy and re-upload.
*/
u8 fir_shadow[ES9039_FIR_STAGES][ES9039_FIR_MAX_BYTES];
unsigned int fir_taps[ES9039_FIR_STAGES]; /* 0 = never uploaded */
};
/*
* Multi-byte fields are little-endian across ascending register addresses:
* register N holds bits [7:0], N+1 holds [15:8], and so on.
*/
static int es9039_read_le(struct regmap *map, unsigned int reg, int n, u32 *out)
{
u8 buf[4];
int ret, i;
ret = regmap_bulk_read(map, reg, buf, n);
if (ret)
return ret;
*out = 0;
for (i = 0; i < n; i++)
*out |= (u32)buf[i] << (8 * i);
return 0;
}
static int es9039_write_le(struct regmap *map, unsigned int reg, int n, u32 val)
{
u8 buf[4];
int i;
for (i = 0; i < n; i++)
buf[i] = (val >> (8 * i)) & 0xff;
return regmap_bulk_write(map, reg, buf, n);
}
/* ------------------------------------------------------------------ regmap */
static bool es9039q2m_writeable_reg(struct device *dev, unsigned int reg)
{
return reg <= ES9039_LAST_RW;
}
static bool es9039q2m_readable_reg(struct device *dev, unsigned int reg)
{
return reg <= ES9039_LAST_RW || reg >= ES9039_READBACK_BASE;
}
static bool es9039q2m_volatile_reg(struct device *dev, unsigned int reg)
{
return reg >= ES9039_READBACK_BASE;
}
static const struct regmap_config es9039q2m_regmap = {
.reg_bits = 8,
.val_bits = 8,
.max_register = ES9039_MAX_REGISTER,
.writeable_reg = es9039q2m_writeable_reg,
.readable_reg = es9039q2m_readable_reg,
.volatile_reg = es9039q2m_volatile_reg,
.cache_type = REGCACHE_MAPLE,
};
/* --------------------------------------------------- signed 16-bit controls */
struct es9039_s16_ctl {
unsigned int reg;
unsigned int shift; /* 0 for CH1, 16 for CH2 within the 32-bit pair */
};
static int es9039_s16_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 1;
uinfo->value.integer.min = S16_MIN;
uinfo->value.integer.max = S16_MAX;
return 0;
}
static int es9039_s16_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
struct es9039_s16_ctl *p = (void *)kcontrol->private_value;
u32 v;
int ret;
ret = es9039_read_le(priv->regmap, p->reg + (p->shift / 8), 2, &v);
if (ret)
return ret;
ucontrol->value.integer.value[0] = (s16)v;
return 0;
}
static int es9039_s16_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
struct es9039_s16_ctl *p = (void *)kcontrol->private_value;
long v = ucontrol->value.integer.value[0];
u32 old;
int ret;
if (v < S16_MIN || v > S16_MAX)
return -EINVAL;
ret = es9039_read_le(priv->regmap, p->reg + (p->shift / 8), 2, &old);
if (ret)
return ret;
if ((s16)old == (s16)v)
return 0;
ret = es9039_write_le(priv->regmap, p->reg + (p->shift / 8), 2,
(u16)v);
if (ret)
return ret;
return 1;
}
#define ES9039_S16(xname, xreg, xshift) \
{ \
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
.name = xname, \
.info = es9039_s16_info, \
.get = es9039_s16_get, \
.put = es9039_s16_put, \
.private_value = (unsigned long)&(struct es9039_s16_ctl) \
{ .reg = xreg, .shift = xshift }, \
}
/* ------------------------------------------------- multi-register integers */
struct es9039_wide_ctl {
unsigned int reg;
unsigned int bytes;
unsigned int mask;
unsigned int max;
};
static int es9039_wide_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
struct es9039_wide_ctl *p = (void *)kcontrol->private_value;
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 1;
uinfo->value.integer.min = 0;
uinfo->value.integer.max = p->max;
return 0;
}
static int es9039_wide_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
struct es9039_wide_ctl *p = (void *)kcontrol->private_value;
u32 v;
int ret;
ret = es9039_read_le(priv->regmap, p->reg, p->bytes, &v);
if (ret)
return ret;
ucontrol->value.integer.value[0] = v & p->mask;
return 0;
}
static int es9039_wide_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
struct es9039_wide_ctl *p = (void *)kcontrol->private_value;
long v = ucontrol->value.integer.value[0];
u32 old;
int ret, i;
if (v < 0 || v > p->max)
return -EINVAL;
ret = es9039_read_le(priv->regmap, p->reg, p->bytes, &old);
if (ret)
return ret;
if ((old & p->mask) == (u32)v)
return 0;
/*
* Write one register at a time through regmap_update_bits() rather
* than reading the whole field and writing it back.
*
* The bits outside the field are not ours: ES9039_AUTOMUTE_TIME spans
* registers 124-125 while MUTE_RAMP_TO_GND is bit 3 of register 125
* and has a control of its own. A read-modify-write over the pair
* leaves a window in which that other control can write between our
* read and our write, and its change is then lost - the ALSA put path
* holds card->controls_rwsem for READ, so two controls really can run
* at once. Per-register update_bits closes the window inside regmap's
* own lock and never touches a bit outside p->mask.
*/
for (i = 0; i < p->bytes; i++) {
u8 mask = (p->mask >> (8 * i)) & 0xff;
if (!mask)
continue;
ret = regmap_update_bits(priv->regmap, p->reg + i, mask,
((u32)v >> (8 * i)) & mask);
if (ret)
return ret;
}
return 1;
}
#define ES9039_WIDE(xname, xreg, xbytes, xmask, xmax) \
{ \
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
.name = xname, \
.info = es9039_wide_info, \
.get = es9039_wide_get, \
.put = es9039_wide_put, \
.private_value = (unsigned long)&(struct es9039_wide_ctl) \
{ .reg = xreg, .bytes = xbytes, \
.mask = xmask, .max = xmax }, \
}
/* ------------------------------------------------ programmable FIR upload --
*
* Write-only, deliberately. The chip has a PROG_COEFF_OUT register (248-246)
* described only as "Programmable FIR coefficient readback", but it is not a
* RAM read port: it returns the LAST COEFFICIENT WRITTEN, whatever address is
* selected in PROG_COEFF_ADDR. Measured over raw I2C with this driver out of
* the path - two different coefficients written to
* addresses 0 and 1, then read back with five different sequences (plain, with
* a settle delay, with PROG_COEFF_EN set, with the address written twice, and
* with a WE pulse after the address). All ten reads returned the value written
* to address 1.
*
* A get() built on that register would return something with the shape of data
* and none of its meaning, so there is no get(). If ESS documents a real
* readback sequence, add one.
*/
/*
* Per-control data rides in our own struct with the soc_bytes_ext EMBEDDED,
* recovered by container_of. Not in soc_bytes_ext.dobj: that field belongs to
* the topology subsystem and only exists under CONFIG_SND_SOC_TOPOLOGY, so a
* driver stashing its own data there fails to build on any config without it.
*/
struct es9039_fir_ctl {
struct soc_bytes_ext be;
unsigned int taps;
bool stage_4x;
};
/*
* Push one stage's coefficients into the RAM. Callers hold priv->lock: both
* FIR controls drive the same address, data and strobe registers, so two
* uploads at once would interleave into each other's RAM, and resume re-uploads
* through this same path.
*
* PROG_COEFF_WE is a per-coefficient strobe, not a gate held open across the
* upload. The datasheet's sequence is address, data, raise WE, lower WE, once
* per coefficient. Holding it high for the whole loop also appears to work on
* ES9039Q2M silicon, but "appears to work" is not a specification.
*/
static int es9039_fir_upload(struct es9039q2m_priv *priv, const u8 *data,
unsigned int taps, bool stage_4x)
{
unsigned int i;
int ret = 0;
for (i = 0; i < taps; i++) {
ret = regmap_write(priv->regmap, ES9039_PROG_RAM_ADDR,
(stage_4x ? ES9039_PROG_STAGE_4X : 0) |
FIELD_PREP(ES9039_PROG_ADDR_MASK, i));
if (ret)
goto out;
ret = regmap_bulk_write(priv->regmap, ES9039_PROG_RAM_DATA,
&data[i * ES9039_COEFF_BYTES],
ES9039_COEFF_BYTES);
if (ret)
goto out;
ret = regmap_update_bits(priv->regmap, ES9039_PROG_RAM_CTRL,
ES9039_PROG_COEFF_WE,
ES9039_PROG_COEFF_WE);
if (ret)
goto out;
ret = regmap_update_bits(priv->regmap, ES9039_PROG_RAM_CTRL,
ES9039_PROG_COEFF_WE, 0);
if (ret)
goto out;
}
out:
regmap_update_bits(priv->regmap, ES9039_PROG_RAM_CTRL,
ES9039_PROG_COEFF_WE, 0);
return ret;
}
static int es9039_fir_put(struct snd_kcontrol *kcontrol,
const unsigned int __user *bytes, unsigned int size)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
struct soc_bytes_ext *be = (void *)kcontrol->private_value;
struct es9039_fir_ctl *p = container_of(be, struct es9039_fir_ctl, be);
unsigned int idx = p->stage_4x ? 1 : 0;
u8 *buf;
int ret;
if (size != p->taps * ES9039_COEFF_BYTES)
return -EINVAL;
buf = memdup_user(bytes, size);
if (IS_ERR(buf))
return PTR_ERR(buf);
scoped_guard(mutex, &priv->lock) {
ret = es9039_fir_upload(priv, buf, p->taps, p->stage_4x);
if (!ret) {
/*
* Keep a copy. The RAM cannot be read back, so this is
* the only record of what is in it, and resume has
* nothing else to restore from.
*/
memcpy(priv->fir_shadow[idx], buf, size);
priv->fir_taps[idx] = p->taps;
}
}
kfree(buf);
if (ret)
return ret;
return 1;
}
static struct es9039_fir_ctl es9039_fir2x = {
.be = { .max = ES9039_FIR2X_TAPS * ES9039_COEFF_BYTES,
.put = es9039_fir_put },
.taps = ES9039_FIR2X_TAPS,
};
static struct es9039_fir_ctl es9039_fir4x = {
.be = { .max = ES9039_FIR4X_TAPS * ES9039_COEFF_BYTES,
.put = es9039_fir_put },
.taps = ES9039_FIR4X_TAPS,
.stage_4x = true,
};
#define ES9039_FIR(xname, xctl) \
{ \
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
.name = xname, \
.info = snd_soc_bytes_info_ext, \
.tlv.c = snd_soc_bytes_tlv_callback, \
.access = SNDRV_CTL_ELEM_ACCESS_TLV_WRITE | \
SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
.private_value = (unsigned long)&(xctl).be, \
}
/* ------------------------------------------------------- status (read-only) */
struct es9039_stat_ctl {
unsigned int reg;
unsigned int mask;
unsigned int max;
};
static int es9039_stat_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
struct es9039_stat_ctl *p = (void *)kcontrol->private_value;
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 1;
uinfo->value.integer.min = 0;
uinfo->value.integer.max = p->max;
return 0;
}
static int es9039_stat_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
struct es9039_stat_ctl *p = (void *)kcontrol->private_value;
unsigned int v;
int ret;
ret = regmap_read(priv->regmap, p->reg, &v);
if (ret)
return ret;
ucontrol->value.integer.value[0] =
(v & p->mask) >> (ffs(p->mask) - 1);
return 0;
}
#define ES9039_STAT(xname, xreg, xmask, xmax) \
{ \
.iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
.name = xname, \
.access = SNDRV_CTL_ELEM_ACCESS_READ | \
SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
.info = es9039_stat_info, \
.get = es9039_stat_get, \
.private_value = (unsigned long)&(struct es9039_stat_ctl) \
{ .reg = xreg, .mask = xmask, .max = xmax }, \
}
/*
* Detected sample rate.
*
* When the part's own rate detector has a valid ratio, use it - it is measured
* from the incoming frame clock and is the ground truth:
*
* FS = Y * SYS_CLK / ((X + 1) * (128 >> 64FS_MODE))
*
* with X = IDAC_DIV_AUTO and Y = 2 when IDAC_HALF_DIV_AUTO reports a
* half-integer multiple.
*
* That detector is UNAVAILABLE on any board running the DAC asynchronously -
* register 3[7] AUTO_FS_DETECT carries the note "Cannot be used in ASYNC mode".
* A board feeding a free-running oscillator and letting the ASRC absorb the
* difference is precisely that case, and it is the preferable design, so the
* detector reading 0 there is expected rather than a fault. Fall back to the
* rate the stream was opened at, which is what a front panel wants to show.
* Reports 0 only when nothing is playing and the chip has no lock either.
*/
static int es9039_rate_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
uinfo->count = 1;
uinfo->value.integer.min = 0;
uinfo->value.integer.max = 1536000;
return 0;
}
static int es9039_rate_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
unsigned int fsreg, sysreg, div, y, den;
int ret;
ucontrol->value.integer.value[0] = priv->stream_rate;
if (!priv->mclk_rate)
return 0;
ret = regmap_read(priv->regmap, ES9039_AUTO_FS_READ, &fsreg);
if (ret)
return ret;
if (!(fsreg & ES9039_FS_DIV_VALID))
return 0; /* async mode: keep the stream rate set above */
ret = regmap_read(priv->regmap, ES9039_SYSTEM_CONFIG, &sysreg);
if (ret)
return ret;
div = FIELD_GET(ES9039_FS_DIV_MASK, fsreg) + 1;
y = (fsreg & ES9039_FS_HALF_DIV) ? 2 : 1;
den = div * ((sysreg & ES9039_64FS_MODE) ? 64 : 128);
ucontrol->value.integer.value[0] =
DIV_ROUND_CLOSEST(priv->mclk_rate * y, den);
return 0;
}
static const char * const es9039_stream_texts[] = {
"PCM", "DSD", "DoP", "S/PDIF",
};
static int es9039_stream_info(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_info *uinfo)
{
return snd_ctl_enum_info(uinfo, 1, ARRAY_SIZE(es9039_stream_texts),
es9039_stream_texts);
}
static int es9039_stream_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
unsigned int v;
int ret;
ret = regmap_read(priv->regmap, ES9039_INPUT_STREAM_READ, &v);
if (ret)
return ret;
ucontrol->value.enumerated.item[0] =
FIELD_GET(ES9039_RD_INPUT_SEL_MASK, v);
return 0;
}
/* ----------------------------------------------------------------- controls */
static const DECLARE_TLV_DB_SCALE(es9039_vol_tlv, -12750, 50, 1);
static const char * const es9039_filter_texts[] = {
"Minimum Phase",
"Linear Phase Apodizing Fast Roll-Off",
"Linear Phase Fast Roll-Off",
"Linear Phase Fast Roll-Off Low Ripple",
"Linear Phase Slow Roll-Off",
"Minimum Phase Fast Roll-Off",
"Minimum Phase Slow Roll-Off",
"Minimum Phase Slow Roll-Off Low Dispersion",
};
static SOC_ENUM_SINGLE_DECL(es9039_filter_enum, ES9039_FILTER_SHAPE, 0,
es9039_filter_texts);
/* IIR_BW is a multiple of the datapath bandwidth, not a frequency. */
static const char * const es9039_iir_texts[] = {
"Reserved", "BW x8", "BW x4", "BW x2", "BW", "BW /2", "BW /4", "BW /8",
};
static SOC_ENUM_SINGLE_DECL(es9039_iir_enum, ES9039_IIR_SPDIF, 0,
es9039_iir_texts);
static const char * const es9039_nsmod_texts[] = {
"Default", "Wide Bandwidth",
};
static const unsigned int es9039_nsmod_values[] = {
ES9039_NSMOD_DEFAULT, ES9039_NSMOD_WIDE,
};
static SOC_VALUE_ENUM_SINGLE_DECL(es9039_nsmod_enum, ES9039_NSMOD, 1,
GENMASK(3, 0), es9039_nsmod_texts,
es9039_nsmod_values);
static int es9039_dop_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
ucontrol->value.integer.value[0] = priv->dop_auto;
return 0;
}
/*
* Automatic DoP detection is two bits in two registers, and they are one
* setting: AUTO_INPUT_SEL lets the part choose a decoder from the data, and
* ENABLE_DOP_DECODE is what gives it a DoP decoder to choose. Enabling the
* first without the second leaves the part hunting for a marker it has no
* decoder for, whereupon it finds no valid DoP and mutes.
*
* Everything that changes the setting goes through here, so the pair can
* never be written apart. Callers hold priv->lock.
*/
static int es9039_apply_dop(struct es9039q2m_priv *priv, bool on)
{
int ret;
ret = regmap_update_bits(priv->regmap, ES9039_SYS_MODE,
ES9039_ENABLE_DOP_DECODE,
on ? ES9039_ENABLE_DOP_DECODE : 0);
if (ret)
return ret;
return regmap_update_bits(priv->regmap, ES9039_INPUT_SEL,
ES9039_AUTO_INPUT_SEL,
on ? ES9039_AUTO_INPUT_SEL : 0);
}
/* Caller holds priv->lock. */
static int es9039_apply_mute(struct es9039q2m_priv *priv)
{
unsigned int val = priv->mute_user;
if (priv->mute_stream)
val = ES9039_MUTE_BOTH;
return regmap_update_bits(priv->regmap, ES9039_DAC_MUTE,
ES9039_MUTE_BOTH, val);
}
/*
* The control is inverted - 1 means playing - so a zero here is a mute
* request. It reports priv->mute_user rather than the register, because the
* register also carries the stream mute and the user did not ask for that.
*/
static int es9039_mute_get(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
guard(mutex)(&priv->lock);
ucontrol->value.integer.value[0] = !(priv->mute_user & ES9039_MUTE_CH1);
ucontrol->value.integer.value[1] = !(priv->mute_user & ES9039_MUTE_CH2);
return 0;
}
static int es9039_mute_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
unsigned int val = 0, old;
int ret;
if (!ucontrol->value.integer.value[0])
val |= ES9039_MUTE_CH1;
if (!ucontrol->value.integer.value[1])
val |= ES9039_MUTE_CH2;
guard(mutex)(&priv->lock);
if (val == priv->mute_user)
return 0;
/*
* Commit to the register first. If the write fails and the shadow has
* already moved, get() reports a mute the part is not in and the
* val == mute_user test above turns a retry with the same value into a
* no-op, leaving the control permanently wrong.
*/
old = priv->mute_user;
priv->mute_user = val;
ret = es9039_apply_mute(priv);
if (ret) {
priv->mute_user = old;
return ret;
}
return 1;
}
static int es9039_dop_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
bool on = !!ucontrol->value.integer.value[0], old;
int ret;
guard(mutex)(&priv->lock);
if (on == priv->dop_auto)
return 0;
/*
* hw_params() programs the decoder and INPUT_SEL from dop_auto, so
* changing it under a running stream would apply half the setting now
* and the rest at the next open. Refuse instead of half-applying.
*/
if (priv->stream_rate)
return -EBUSY;
/* Same reasoning as es9039_mute_put(): the shadow follows the write. */
old = priv->dop_auto;
priv->dop_auto = on;
ret = es9039_apply_dop(priv, on);
if (ret) {
priv->dop_auto = old;
return ret;
}
return 1;
}
/*
* The two channel volumes live in separate registers, so a stereo change is
* two I2C writes and the channels are briefly at different levels in between.
* VOLUME_HOLD exists for exactly this: while it is set the part accepts writes
* to registers 74-75 without applying them, and clearing it applies both at
* once. Raise it, let the generic handler do the writes, drop it again.
*
* It is dropped unconditionally, including on the error path, because a stuck
* VOLUME_HOLD would silently freeze the volume control.
*/
static int es9039_vol_put(struct snd_kcontrol *kcontrol,
struct snd_ctl_elem_value *ucontrol)
{
struct snd_soc_component *c = snd_kcontrol_chip(kcontrol);
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(c);
int ret;
/*
* The hold has to cover the pair of channel writes, so it has to be
* serialised. Two callers interleaving would let the second write its
* volumes after the first had already dropped VOLUME_HOLD, which is
* exactly the torn stereo update the bit exists to prevent.
*/
guard(mutex)(&priv->lock);
ret = regmap_update_bits(priv->regmap, ES9039_IIR_SPDIF,
ES9039_VOLUME_HOLD, ES9039_VOLUME_HOLD);
if (ret)
return ret;
ret = snd_soc_put_volsw(kcontrol, ucontrol);
regmap_update_bits(priv->regmap, ES9039_IIR_SPDIF,
ES9039_VOLUME_HOLD, 0);
return ret;
}
static const struct snd_kcontrol_new es9039q2m_controls[] = {
/* --- level --- */
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Master Playback Volume",
.access = SNDRV_CTL_ELEM_ACCESS_READWRITE |
SNDRV_CTL_ELEM_ACCESS_TLV_READ,
.info = snd_soc_info_volsw,
.get = snd_soc_get_volsw,
.put = es9039_vol_put,
.tlv.p = es9039_vol_tlv,
.private_value = SOC_DOUBLE_R_VALUE(ES9039_VOLUME_CH1,
ES9039_VOLUME_CH2, 0, 0,
ES9039_VOL_MAX, 1),
},
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Master Playback Switch",
.info = snd_soc_info_volsw,
.get = es9039_mute_get,
.put = es9039_mute_put,
.private_value = SOC_DOUBLE_VALUE(ES9039_DAC_MUTE, 0, 1, 0, 1,
1, 0),
},
SOC_DOUBLE("DAC Invert Switch", ES9039_DAC_INVERT, 0, 1, 1, 0),
SOC_SINGLE("Volume Ramp Up Rate", ES9039_VOL_RATE_UP, 0, 255, 0),
SOC_SINGLE("Volume Ramp Down Rate", ES9039_VOL_RATE_DOWN, 0, 255, 0),
SOC_SINGLE("Soft Ramp Time", ES9039_SOFT_RAMP, 0,
ES9039_SOFT_RAMP_MAX, 0),
/* --- reconstruction filter --- */
SOC_ENUM("Filter Shape", es9039_filter_enum),
SOC_ENUM("IIR Bandwidth", es9039_iir_enum),
SOC_ENUM("Modulator Bandwidth", es9039_nsmod_enum),
SOC_SINGLE("IIR Filter Bypass Switch", ES9039_DAC_PATH, 2, 1, 0),
SOC_SINGLE("FIR 2x Bypass Switch", ES9039_DAC_PATH, 0, 1, 0),
SOC_SINGLE("FIR 4x Bypass Switch", ES9039_DAC_PATH, 1, 1, 0),
SOC_SINGLE("Custom FIR Switch", ES9039_PROG_RAM_CTRL, 0, 1, 0),
ES9039_FIR("FIR 2x Coefficients", es9039_fir2x),
ES9039_FIR("FIR 4x Coefficients", es9039_fir4x),
/*
* Not "... Volume", because these do not set a level. They are signed
* correction coefficients for the second and third harmonic: they
* cancel distortion the analogue stage adds, and turning one up does
* not make anything louder. Useful values come from measuring a given
* board's distortion on an analyser and solving for them; zero, the
* reset value, is the only honest default until someone has.
*/
/* --- distortion compensation --- */
ES9039_S16("THD Compensation C2 CH1", ES9039_THD_C2, 0),
ES9039_S16("THD Compensation C2 CH2", ES9039_THD_C2, 16),
ES9039_S16("THD Compensation C3 CH1", ES9039_THD_C3, 0),
ES9039_S16("THD Compensation C3 CH2", ES9039_THD_C3, 16),
/* --- automute --- */
SOC_DOUBLE("Automute Switch", ES9039_AUTOMUTE_EN, 0, 1, 1, 0),
ES9039_WIDE("Automute Time", ES9039_AUTOMUTE_TIME, 2,
ES9039_AUTOMUTE_TIME_MASK, 2047),
ES9039_WIDE("Automute Level", ES9039_AUTOMUTE_LEVEL, 2, 0xffff, 65535),
ES9039_WIDE("Automute Off Level", ES9039_AUTOMUTE_OFF_LEVEL, 2,
0xffff, 65535),
SOC_SINGLE("Mute Ramp To Ground Switch", ES9039_AUTOMUTE_TIME + 1,
3, 1, 0),
SOC_SINGLE("DSD DC Automute Switch", ES9039_MONITOR_CFG, 7, 1, 1),
SOC_SINGLE("DSD Mute Pattern Switch", ES9039_MONITOR_CFG, 6, 1, 1),
SOC_SINGLE("PCM DC Automute Switch", ES9039_MONITOR_CFG, 3, 1, 1),
/* --- stream --- */
/*
* On by default. DoP is designed to be detected, not announced: the
* player just sends it and a DoP-aware DAC notices the marker, which
* is why a DAC that does not notice plays it as near-silence rather
* than noise. Players rely on that, and none of them can reach into
* ALSA to flip a mode first.
*
* Left switchable because automatic detection is a pattern match, and
* anyone worried about PCM material that happens to look like DoP can
* turn it off and get strictly PCM.
*/
SOC_SINGLE_BOOL_EXT("DoP Auto Detect Switch", 0,
es9039_dop_get, es9039_dop_put),
/* --- status, read-only --- */
ES9039_STAT("Automute Active CH1", ES9039_AUTOMUTE_READ, BIT(0), 1),
ES9039_STAT("Automute Active CH2", ES9039_AUTOMUTE_READ, BIT(1), 1),
ES9039_STAT("DoP Valid", ES9039_INPUT_STREAM_READ,
ES9039_RD_DOP_VALID, 1),
ES9039_STAT("TDM Data Valid", ES9039_INPUT_STREAM_READ,
ES9039_RD_TDM_VALID, 1),
ES9039_STAT("SPDIF Valid", ES9039_INPUT_STREAM_READ,
ES9039_RD_SPDIF_VALID, 1),
/*
* Register 235-234 is one 16-bit word and BCK_WS_FAIL_SOURCE is bit
* 7 of it, so it sits in the low byte at ES9039_IRQ_SOURCES. This
* read the byte above with the same mask, which is bit 15 - reserved
* - so the control could never have reported a fault. The named
* constant now carries the bit rather than a bare BIT(7).
*
* The flag is meaningful only with the BCK and WS monitors enabled,
* which they are at reset and the driver leaves alone.
*/
ES9039_STAT("Clock Fault", ES9039_IRQ_SOURCES,
ES9039_SRC_BCK_WS_FAIL, 1),
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Detected Sample Rate",
.access = SNDRV_CTL_ELEM_ACCESS_READ |
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
.info = es9039_rate_info,
.get = es9039_rate_get,
},
{
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
.name = "Detected Input Format",
.access = SNDRV_CTL_ELEM_ACCESS_READ |
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
.info = es9039_stream_info,
.get = es9039_stream_get,
},
};
/* --------------------------------------------------------------------- DAPM */
static const struct snd_soc_dapm_widget es9039q2m_widgets[] = {
SND_SOC_DAPM_DAC("DAC", NULL, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_OUTPUT("AOUTL"),
SND_SOC_DAPM_OUTPUT("AOUTR"),
};
static const struct snd_soc_dapm_route es9039q2m_routes[] = {
{ "DAC", NULL, "Playback" },
{ "AOUTL", NULL, "DAC" },
{ "AOUTR", NULL, "DAC" },
};
/* ---------------------------------------------------------------------- DAI */
/*
* MCLK limits, all from the datasheet:
*
* - 50 MHz absolute maximum ("Max MCLK Frequency", electrical specification).
*
* - Table 7 note 1: MCLK >= 128 * FS synchronous, MCLK > 130 * FS
* asynchronous. The gap is small but not academic - with a 24.576 MHz
* clock, 128 * FS puts 192 kHz exactly at the limit while 130 * FS puts the
* ceiling at 189 kHz. Note that the asynchronous bound is strict.
*
* - Register 0[6] ENABLE_64FS_MODE runs the interpolation path at 64FS and is
* "used only for PCM high sample rates such as 768kHz with a 49.152MHz or
* 384kHz with 24.576MHz clock" - both of which are MCLK = 64 * FS. Since
* 128 * 768000 is 98.304 MHz, well over the ceiling, 64FS mode is the only
* way 705.6 and 768 kHz are reachable at all.
*/
#define ES9039_MAX_MCLK 50000000
#define ES9039_64FS_MCLK_FS 64
#define ES9039_SYNC_MIN_MCLK_FS 128
#define ES9039_ASYNC_MIN_MCLK_FS 130
/*
* MCLK/FS ratios to try on a settable clock, highest first. 256 leaves the
* part inside the window its automatic clock gearing aims for - register 5[2]:
* "MCLK will be geared down until 128FS <= SYS_CLK < 256FS" - and 64 is 64FS
* mode, which only becomes the choice when nothing larger fits under 50 MHz.
*/
static const unsigned int es9039_mclk_ratios[] = { 512, 256, 128, 64 };
/*
* Synchronous means the frame clock and MCLK come from the same place. That is
* true when the part generates BCK and WS itself, and it is true when the MCLK
* we were given can be set to a multiple of the sample rate. Only a fixed
* oscillator feeding a consumer-mode part is genuinely asynchronous, and only
* then does the ASRC have anything to do.
*/
static bool es9039_is_sync(struct es9039q2m_priv *priv)
{
return priv->provider || !priv->mclk_fixed;
}
/*
* 64FS mode is an exact MCLK/FS ratio, not a rate threshold, and it only makes
* sense synchronously: at 64 * FS an asynchronous part would sit far below its
* own 130 * FS floor, so a fixed oscillator that happens to land on 64 * FS is
* a coincidence rather than a mode.
*/
static bool es9039_is_64fs(struct es9039q2m_priv *priv, unsigned int mclk,
unsigned int rate)
{
return es9039_is_sync(priv) && rate &&
mclk == ES9039_64FS_MCLK_FS * rate;
}
/* The lowest MCLK this rate may run at outside 64FS mode. */
static unsigned int es9039_min_mclk(struct es9039q2m_priv *priv,
unsigned int rate)
{
if (es9039_is_sync(priv))
return ES9039_SYNC_MIN_MCLK_FS * rate;
/* Asynchronous is strictly greater than 130 * FS, not equal to it. */
return ES9039_ASYNC_MIN_MCLK_FS * rate + 1;
}
static int es9039q2m_startup(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(dai->component);
unsigned int max_rate;
/*
* A clock whose rate can be set imposes no ceiling here: hw_params()
* raises MCLK to suit the rate, and fails cleanly if it cannot.
* Constraining from the rate MCLK merely happens to be idling at would
* reject rates the board can carry perfectly well.
*/
if (!priv->mclk_rate || !priv->mclk_fixed)
return 0;
if (!es9039_is_sync(priv)) {
max_rate = priv->mclk_rate / ES9039_ASYNC_MIN_MCLK_FS;
} else if (priv->mclk_rate % ES9039_64FS_MCLK_FS == 0) {
/*
* 64FS mode reaches exactly one rate above the ordinary
* ceiling - MCLK / 64 - so admit it here and leave
* hw_params() to reject anything in between, where neither
* 64 * FS nor 128 * FS is satisfied.
*/
max_rate = priv->mclk_rate / ES9039_64FS_MCLK_FS;
} else {
max_rate = priv->mclk_rate / ES9039_SYNC_MIN_MCLK_FS;
}
return snd_pcm_hw_constraint_minmax(substream->runtime,
SNDRV_PCM_HW_PARAM_RATE,
8000, max_rate);
}
/*
* Put the clocking where it needs to be for this rate, and tell the part which
* of its two timing worlds it is living in.
*
* With a settable MCLK the useful thing is to pull it to an exact multiple of
* the sample rate: the ASRC then has nothing to correct, which is the better
* arrangement whenever the board can manage it. With a fixed oscillator there
* is nothing to pull, and the ASRC earns its keep.
*/
static int es9039_setup_clocking(struct es9039q2m_priv *priv,
struct snd_soc_dai *dai, unsigned int rate)
{
unsigned int ratio, min_mclk, div, i, target = 0;
bool sixtyfour;
int ret;
if (!priv->mclk_rate)
return 0;
ratio = priv->bclk_ratio ? priv->bclk_ratio : 64;
if (!priv->mclk_fixed) {
/*
* Take the highest ratio that still fits under the 50 MHz
* ceiling rather than always asking for 256 * FS, which would
* put 384 kHz at 98.304 MHz and 768 kHz at 196.608 MHz. A
* settable clock is synchronous by definition here - see
* es9039_is_sync() - so only the synchronous floors apply.
*/
for (i = 0; i < ARRAY_SIZE(es9039_mclk_ratios); i++) {
unsigned int mult = es9039_mclk_ratios[i];
if (mult * rate > ES9039_MAX_MCLK)
continue;
if (mult < ES9039_SYNC_MIN_MCLK_FS &&
mult != ES9039_64FS_MCLK_FS)
continue;
/*
* Master mode divides MCLK down to BCK by a whole
* number, so a ratio that is not a multiple of the
* frame size cannot produce the bit clock.
*/
if (priv->provider && mult % ratio)
continue;
target = mult * rate;
break;
}
if (!target) {
dev_err(dai->dev,
"no mclk ratio for %u Hz within %u Hz\n",
rate, ES9039_MAX_MCLK);
return -EINVAL;
}
ret = clk_set_rate(priv->mclk, target);
if (ret)
return ret;
/* Take what the clock settled on, not what was asked for. */
priv->mclk_rate = clk_get_rate(priv->mclk);
}
if (priv->mclk_rate > ES9039_MAX_MCLK) {
dev_err(dai->dev, "mclk %u Hz is above the %u Hz maximum\n",
priv->mclk_rate, ES9039_MAX_MCLK);
return -EINVAL;
}
sixtyfour = es9039_is_64fs(priv, priv->mclk_rate, rate);
min_mclk = es9039_min_mclk(priv, rate);
if (!sixtyfour && priv->mclk_rate < min_mclk) {
dev_err(dai->dev,
"mclk %u Hz is below the %u Hz %u Hz needs in this mode\n",
priv->mclk_rate, min_mclk, rate);
return -EINVAL;
}
/*
* Register 0[6]. Decided from the MCLK actually in use rather than from
* the sample rate alone, because the part cares about the ratio: 384 kHz
* from 24.576 MHz needs 64FS mode exactly as 768 kHz from 49.152 MHz
* does. The mode also forces a minimum phase filter regardless of
* FILTER_SHAPE.
*/
ret = regmap_update_bits(priv->regmap, ES9039_SYSTEM_CONFIG,
ES9039_64FS_MODE,
sixtyfour ? ES9039_64FS_MODE : 0);
if (ret)
return ret;
ret = regmap_update_bits(priv->regmap, ES9039_SYS_MODE,
ES9039_SYNC_MODE,
es9039_is_sync(priv) ? ES9039_SYNC_MODE : 0);
if (ret)
return ret;
if (!priv->provider)
return 0;
/*
* Register 4: BCK = MCLK / (MASTER_BCK_DIV + 1), and WS follows from
* the frame length. An MCLK that is not a whole multiple of the bit
* clock cannot produce the requested rate at all, so say so rather
* than emitting something close.
*/
if (priv->mclk_rate % (ratio * rate)) {
dev_err(dai->dev,
"mclk %u Hz cannot produce %u * %u Hz bit clock\n",
priv->mclk_rate, ratio, rate);
return -EINVAL;
}
div = priv->mclk_rate / (ratio * rate);
if (div < 1 || div > 256) {
dev_err(dai->dev, "master bck divider %u out of range\n", div);
return -EINVAL;
}
return regmap_write(priv->regmap, ES9039_CLOCK_CONFIG, div - 1);
}
static int es9039q2m_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(dai->component);
unsigned int cfg1 = 0, enc = 0;
int ret;
/*
* Both directions are useful and which is right is a board decision,
* not a driver one. Driving BCK and WS from a good MCLK is the
* conventional arrangement and keeps everything synchronous; taking
* them from a consumer-mode host and letting the ASRC absorb the
* mismatch is what a board with a fixed oscillator wants. The part can
* do either, so the driver offers either.
*/
switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
case SND_SOC_DAIFMT_CBC_CFC:
priv->provider = false;
break;
case SND_SOC_DAIFMT_CBP_CFP:
if (!priv->mclk)
return -EINVAL;
priv->provider = true;
break;
default:
/* The part cannot split them: it drives both or neither. */
return -EINVAL;
}
ret = regmap_update_bits(priv->regmap, ES9039_INPUT_SEL,
ES9039_PCM_MASTER_MODE,
priv->provider ? ES9039_PCM_MASTER_MODE : 0);
if (ret)
return ret;
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
case SND_SOC_DAIFMT_I2S:
break;
case SND_SOC_DAIFMT_LEFT_J:
cfg1 |= ES9039_TDM_LJ_MODE;
break;
default:
/* Register 60 offers I2S or LJ. There is no RJ mode. */
return -EINVAL;
}
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
case SND_SOC_DAIFMT_NB_NF:
break;
case SND_SOC_DAIFMT_IB_NF:
enc |= ES9039_BCK_INV;
break;
default:
return -EINVAL;
}
ret = regmap_update_bits(priv->regmap, ES9039_TDM_CONFIG1,
ES9039_TDM_LJ_MODE, cfg1);
if (ret)
return ret;
ret = regmap_update_bits(priv->regmap, ES9039_MASTER_ENC,
ES9039_BCK_INV, enc);
if (ret)
return ret;
priv->fmt = fmt;
return 0;
}
/*
* TDM_BIT_WIDTH describes the SLOT width on the wire, not the sample size. Those
* are routinely different: 16-bit samples are usually carried left-justified in
* 32-bit slots. Getting this wrong misaligns the channel boundaries and the
* result is one channel, or noise.
*
* ASoC does not hand the codec the bit clock ratio unless a machine driver sets
* it, so take it when offered and otherwise assume 32-bit slots - by far the
* most common arrangement, and what the RK3588 I2S does unconditionally
* (rockchip_i2s.c sets bclk_ratio = 64 at probe and never varies it with
* format).
*/
static int es9039q2m_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(dai->component);
priv->bclk_ratio = ratio;
return 0;
}
static int es9039q2m_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(dai->component);
unsigned int input_sel, decode, width, slot_bits, isel;
bool auto_sel;
int ret;
/*
* Held for the whole call: dop_auto decides both INPUT_SEL and
* SYS_MODE below, and a kcontrol write landing between the two would
* leave automatic detection enabled with no DoP decoder behind it.
*/
guard(mutex)(&priv->lock);
priv->stream_rate = params_rate(params);
ret = es9039_setup_clocking(priv, dai, priv->stream_rate);
if (ret)
return ret;
switch (params_format(params)) {
case SNDRV_PCM_FORMAT_DSD_U8:
case SNDRV_PCM_FORMAT_DSD_U16_LE:
case SNDRV_PCM_FORMAT_DSD_U32_LE:
/*
* Forced, not auto-detected: the datasheet requires DSD data on
* DATA1 and DATA2 for AUTO_INPUT_SEL to identify it, which a
* two-channel I2S link does not provide.
*/
input_sel = ES9039_INPUT_DSD;
decode = ES9039_ENABLE_DSD_DECODE;
auto_sel = false;
break;
case SNDRV_PCM_FORMAT_S16_LE:
case SNDRV_PCM_FORMAT_S24_LE:
case SNDRV_PCM_FORMAT_S24_3LE:
case SNDRV_PCM_FORMAT_S32_LE:
/*
* DoP arrives inside ordinary PCM frames and is indistinguishable
* from PCM until the part finds the marker, so both decoders run
* and AUTO_INPUT_SEL picks between them. INPUT_SEL is programmed
* anyway as the fallback the part uses when auto-detection is
* switched off.
*/
input_sel = ES9039_INPUT_PCM;
decode = ES9039_ENABLE_TDM_DECODE |
(priv->dop_auto ? ES9039_ENABLE_DOP_DECODE : 0);
auto_sel = priv->dop_auto;
break;
default:
return -EINVAL;
}
slot_bits = priv->bclk_ratio ?
priv->bclk_ratio / params_channels(params) : 32;
switch (slot_bits) {
case 16:
width = ES9039_WIDTH_16;
break;
case 24:
width = ES9039_WIDTH_24;
break;
case 32:
width = ES9039_WIDTH_32;
break;
default:
dev_err(dai->dev, "unsupported slot width %u\n", slot_bits);
return -EINVAL;
}
/*
* AUTO_INPUT_SEL belongs in the value as well as the mask. It was in
* the mask alone, so every hw_params quietly cleared it and undid what
* the component probe had set - which is why enabling auto-detection
* by hand mid-stream worked while enabling it in probe() did not.
* INPUT_SEL is still programmed underneath: it is what the part falls
* back to when auto-detection is switched off.
*/
isel = FIELD_PREP(ES9039_INPUT_SEL_MASK, input_sel);
if (auto_sel)
isel |= ES9039_AUTO_INPUT_SEL;
ret = regmap_update_bits(priv->regmap, ES9039_INPUT_SEL,
ES9039_AUTO_INPUT_SEL | ES9039_INPUT_SEL_MASK,
isel);
if (ret)
return ret;
ret = regmap_update_bits(priv->regmap, ES9039_TDM_CONFIG2,
ES9039_TDM_BIT_WIDTH_MASK,
FIELD_PREP(ES9039_TDM_BIT_WIDTH_MASK, width));
if (ret)
return ret;
ret = regmap_update_bits(priv->regmap, ES9039_TDM_CH_NUM,
ES9039_TDM_CH_NUM_MASK,
params_channels(params) - 1);
if (ret)
return ret;
/* Switch the right decoder on for this stream, and the others off. */
return regmap_update_bits(priv->regmap, ES9039_SYS_MODE,
ES9039_DECODE_MASK, decode);
}
static int es9039q2m_mute_stream(struct snd_soc_dai *dai, int mute, int dir)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(dai->component);
bool old;
int ret;
guard(mutex)(&priv->lock);
old = priv->mute_stream;
priv->mute_stream = mute;
ret = es9039_apply_mute(priv);
if (ret)
priv->mute_stream = old;
return ret;
}
/*
* stream_rate doubles as "a stream is open", which es9039_dop_put() needs in
* order to refuse a change it could only half-apply.
*/
static void es9039q2m_shutdown(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(dai->component);
guard(mutex)(&priv->lock);
priv->stream_rate = 0;
}
static const struct snd_soc_dai_ops es9039q2m_dai_ops = {
.startup = es9039q2m_startup,
.shutdown = es9039q2m_shutdown,
.set_fmt = es9039q2m_set_fmt,
.set_bclk_ratio = es9039q2m_set_bclk_ratio,
.hw_params = es9039q2m_hw_params,
.mute_stream = es9039q2m_mute_stream,
.no_capture_mute = 1,
};
#define ES9039_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
SNDRV_PCM_FMTBIT_S24_LE | \
SNDRV_PCM_FMTBIT_S24_3LE | \
SNDRV_PCM_FMTBIT_S32_LE | \
SNDRV_PCM_FMTBIT_DSD_U8 | \
SNDRV_PCM_FMTBIT_DSD_U16_LE | \
SNDRV_PCM_FMTBIT_DSD_U32_LE)
static struct snd_soc_dai_driver es9039q2m_dai = {
.name = "es9039q2m-hifi",
.playback = {
.stream_name = "Playback",
.channels_min = 2,
.channels_max = 2,
.rates = SNDRV_PCM_RATE_8000_768000,
.formats = ES9039_FORMATS,
},
.ops = &es9039q2m_dai_ops,
};
/* ---------------------------------------------------------------- component */
static int es9039q2m_component_probe(struct snd_soc_component *component)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(component);
int ret;
/*
* Come up muted. The volume registers default to 0 dB, and an unmuted
* DAC arriving into an already-powered analogue stage is how you get a
* thump. ASoC unmutes via mute_stream() when a stream starts.
*/
priv->mute_user = 0;
priv->mute_stream = false;
ret = regmap_update_bits(priv->regmap, ES9039_DAC_MUTE,
ES9039_MUTE_BOTH, ES9039_MUTE_BOTH);
if (ret)
return ret;
/*
* Enable the datapath. SYSTEM_CONFIG[1] is clear at reset, so in
* software mode nothing turns the DAC on at power-up: the analogue
* output stays dead until this bit is set.
*
* After the mute above and never before it. Bringing the datapath up
* into an unmuted part whose volume registers still sit at their 0 dB
* reset value is exactly the thump the mute is there to prevent.
*
* Note when testing that a warm reboot does not reset this part -
* registers and coefficient RAM both survive one, and only removing
* power clears them - so the previous boot's value can hide whether
* this write happened at all.
*/
ret = regmap_update_bits(priv->regmap, ES9039_SYSTEM_CONFIG,
ES9039_DAC_MODE, ES9039_DAC_MODE);
if (ret)
return ret;
/*
* VOLUME_HOLD set means "do not apply volume register writes", so its
* resting state has to be clear or the volume control would appear
* dead. es9039_vol_put() raises it around the pair of writes and drops
* it again, which is how both channels are made to move together.
*/
ret = regmap_update_bits(priv->regmap, ES9039_IIR_SPDIF,
ES9039_VOLUME_HOLD, 0);
if (ret)
return ret;
/*
* Let the part identify DoP for itself. Register 57[0] AUTO_INPUT_SEL
* makes it choose between PCM and DoP from the data, which is the only
* way DoP can work in practice: players send DoP-encoded PCM and expect
* the DAC to notice, and none of them can flip an ALSA control first.
* Without this the part is told "PCM", never looks for the marker, and
* renders a DoP stream as the near-silent hiss the DoP marker design
* deliberately degrades to. Verified on hardware by enabling this
* mid-stream and watching reg 245 flip from PCM to DoP with DOP_VALID
* set.
*
* The datasheet's "data must be provided on the DATA2 pin" applies to
* identifying DSD, whose two channels arrive on separate data lines.
* DoP is ordinary stereo I2S on one line and detects correctly without
* it, which the same measurement establishes.
*/
priv->dop_auto = true;
scoped_guard(mutex, &priv->lock)
ret = es9039_apply_dop(priv, true);
if (ret)
return ret;
/*
* Board defaults, applied once at probe so the part is deterministic
* from cold instead of inheriting whatever its reset value happens to
* be. Both stay user-settable through their kcontrols; these are
* defaults, not policy.
*
* Reconstruction filter: linear phase apodizing fast roll-off. It keeps
* the sharp cut and flat passband of the plain fast linear-phase filter
* while suppressing pre-ringing, and an apodizing response also
* suppresses pre-ringing already baked into the source material by the
* recording chain - which none of the other seven addresses. The cost
* is a little stopband rejection right at the band edge, well above
* where it can matter. Chosen this way because a blind A/B listening
* test found no audible difference between any of the eight,
* so the tie is broken on theory rather than on preference.
*
* Modulator: wide bandwidth, which is ESS's own recommendation. It
* moves the modulator's noise further out of band and improves
* linearity at high frequencies.
*/
ret = regmap_update_bits(priv->regmap, ES9039_FILTER_SHAPE,
ES9039_FILTER_SHAPE_MASK,
ES9039_FILTER_APODIZING);
if (ret)
return ret;
ret = regmap_update_bits(priv->regmap, ES9039_NSMOD,
ES9039_NSMOD_WIDE_BW_MASK,
FIELD_PREP(ES9039_NSMOD_WIDE_BW_MASK,
ES9039_NSMOD_WIDE));
if (ret)
return ret;
/* Let the part work out the incoming rate; the ASRC does the rest. */
return regmap_update_bits(priv->regmap, ES9039_AUTO_FS_DETECT,
ES9039_AUTO_FS_DETECT_EN,
ES9039_AUTO_FS_DETECT_EN);
}
/*
* System suspend.
*
* Where the part is clocked from the SoC, system suspend stops its clock as a
* side effect and there is nothing for a driver to do. Where the board feeds
* it a free-running oscillator instead - which the ASRC in front of the DAC
* makes an attractive design, since MCLK then need not track BCLK or LRCK -
* nothing in the system can gate that clock, and the part stays fully clocked
* for the whole of suspend.
*
* Clearing ENABLE_DAC_CLK gates the part's internal clock tree, which is the
* only part of its consumption software can reach. The analogue supplies are
* the board's business, and not every board is able to switch them.
*
* The write deliberately bypasses the cache. The cached value must keep
* ENABLE_DAC_CLK set, so that regcache_sync() on resume restores whatever
* state userspace last left the part in without this code having to remember
* anything itself.
*/
static int es9039q2m_suspend(struct snd_soc_component *component)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(component);
int ret;
guard(mutex)(&priv->lock);
regcache_cache_bypass(priv->regmap, true);
ret = regmap_update_bits(priv->regmap, ES9039_SYS_MODE,
ES9039_ENABLE_DAC_CLK, 0);
regcache_cache_bypass(priv->regmap, false);
if (ret)
dev_warn(component->dev,
"could not gate the DAC clock for suspend: %d\n", ret);
regcache_mark_dirty(priv->regmap);
regcache_cache_only(priv->regmap, true);
return 0;
}
static int es9039q2m_resume(struct snd_soc_component *component)
{
struct es9039q2m_priv *priv = snd_soc_component_get_drvdata(component);
unsigned int i;
int ret;
guard(mutex)(&priv->lock);
regcache_cache_only(priv->regmap, false);
/*
* Mute the part before anything else, and write it straight to the
* hardware rather than through the cache.
*
* Where the board kept the supplies up this is a no-op - the part still
* holds the mute state it went to sleep with. Where the board removed
* them it is not: the part comes back at reset defaults, which are
* DAC_MODE clear, both channels UNMUTED, and both volume registers at
* 0x00, their 0 dB setting. regcache_sync() walks registers in ascending
* address order, so it would set DAC_MODE in register 0 - lighting the
* datapath up unmuted at full scale - and only restore the real mute in
* register 86, long after. That is the thump the probe path mutes to
* avoid, arriving by the other door.
*
* The cache is bypassed so the cached mute state is untouched; the sync
* below puts it back, after the volume registers at 74 and 75.
*/
regcache_cache_bypass(priv->regmap, true);
ret = regmap_update_bits(priv->regmap, ES9039_DAC_MUTE,
ES9039_MUTE_BOTH, ES9039_MUTE_BOTH);
regcache_cache_bypass(priv->regmap, false);
if (ret)
dev_warn(component->dev,
"could not mute before resync: %d\n", ret);
ret = regcache_sync(priv->regmap);
if (ret)
dev_err(component->dev,
"failed to restore registers on resume: %d\n", ret);
/*
* Re-upload the programmable FIR RAM. regcache_sync() cannot restore
* it - it is write-only, so there is no cache of it to sync - and a
* board that removed the part's supplies comes back with that RAM
* undefined while the sync has just restored the filter SELECTION from
* the cache. Selecting the programmable filter would then point the
* interpolator at whatever the RAM powered up holding. After the sync,
* so the selection is already in place. Stages never uploaded have
* fir_taps == 0 and keep the part's own defaults.
*/
for (i = 0; i < ES9039_FIR_STAGES; i++) {
int err;
if (!priv->fir_taps[i])
continue;
err = es9039_fir_upload(priv, priv->fir_shadow[i],
priv->fir_taps[i], i == 1);
if (err)
dev_err(component->dev,
"failed to restore FIR stage %u on resume: %d\n",
i, err);
}
return ret;
}
static const struct snd_soc_component_driver es9039q2m_component = {
.probe = es9039q2m_component_probe,
.suspend = es9039q2m_suspend,
.resume = es9039q2m_resume,
.controls = es9039q2m_controls,
.num_controls = ARRAY_SIZE(es9039q2m_controls),
.dapm_widgets = es9039q2m_widgets,
.num_dapm_widgets = ARRAY_SIZE(es9039q2m_widgets),
.dapm_routes = es9039q2m_routes,
.num_dapm_routes = ARRAY_SIZE(es9039q2m_routes),
.idle_bias_on = 1,
.endianness = 1,
};
/* ------------------------------------------------------------------- power */
/*
* The part has four supply inputs and the datasheet is specific about the
* order: figure 22 brings AVDD up first, VCCA about 200 us later, then the two
* output-stage references, and only then is the part enabled. Power-down is
* the exact reverse.
*
* That ordering is the whole reason these are enabled one at a time rather
* than with regulator_bulk_enable(), which makes no ordering guarantee at all.
* The bulk API is still used to GET them, where order is irrelevant. On a
* board that ties all four to one always-on rail the sequence costs nothing;
* on one that switches them separately, bringing an output stage up before its
* reference is precisely what the sequence exists to prevent.
*
* The datasheet gives no settling time between the last supply and the first
* register access, so none is invented here.
*/
static const char * const es9039_supply_names[ES9039_NUM_SUPPLIES] = {
"avdd", "vcca", "avcc-dac1", "avcc-dac2",
};
static int es9039_power_on(struct es9039q2m_priv *priv)
{
int i, ret;
for (i = 0; i < ES9039_NUM_SUPPLIES; i++) {
ret = regulator_enable(priv->supplies[i].consumer);
if (ret)
goto err;
/* AVDD leads VCCA. It is the only interval the part specifies. */
if (i == 0)
fsleep(200);
}
return 0;
err:
while (--i >= 0)
regulator_disable(priv->supplies[i].consumer);
return ret;
}
static void es9039_power_off(void *data)
{
struct es9039q2m_priv *priv = data;
int i;
for (i = ES9039_NUM_SUPPLIES - 1; i >= 0; i--)
regulator_disable(priv->supplies[i].consumer);
}
/* --------------------------------------------------------------------- I2C */
static int es9039q2m_i2c_probe(struct i2c_client *i2c)
{
struct device *dev = &i2c->dev;
struct es9039q2m_priv *priv;
unsigned int id;
int i, ret;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
priv->regmap = devm_regmap_init_i2c(i2c, &es9039q2m_regmap);
if (IS_ERR(priv->regmap))
return dev_err_probe(dev, PTR_ERR(priv->regmap),
"failed to init regmap\n");
for (i = 0; i < ES9039_NUM_SUPPLIES; i++)
priv->supplies[i].supply = es9039_supply_names[i];
ret = devm_regulator_bulk_get(dev, ES9039_NUM_SUPPLIES, priv->supplies);
if (ret)
return dev_err_probe(dev, ret, "failed to get the supplies\n");
ret = es9039_power_on(priv);
if (ret)
return dev_err_probe(dev, ret, "failed to enable the supplies\n");
ret = devm_add_action_or_reset(dev, es9039_power_off, priv);
if (ret)
return ret;
priv->mclk = devm_clk_get_optional_enabled(dev, "mclk");
if (IS_ERR(priv->mclk))
return dev_err_probe(dev, PTR_ERR(priv->mclk),
"failed to get mclk\n");
if (priv->mclk) {
priv->mclk_rate = clk_get_rate(priv->mclk);
if (priv->mclk_rate > 50000000)
return dev_err_probe(dev, -EINVAL,
"mclk %u Hz exceeds the 50 MHz maximum\n",
priv->mclk_rate);
/*
* A fixed-rate clock answers every rounding question with the
* one rate it has. That is the board saying "this is an
* oscillator, use the ASRC"; anything else can be pulled to
* suit the sample rate and run synchronously.
*/
priv->mclk_fixed =
clk_round_rate(priv->mclk, priv->mclk_rate / 2) ==
priv->mclk_rate;
}
ret = devm_mutex_init(dev, &priv->lock);
if (ret)
return ret;
i2c_set_clientdata(i2c, priv);
ret = regmap_read(priv->regmap, ES9039_CHIP_ID, &id);
if (ret)
return dev_err_probe(dev, ret, "no response at 0x%02x\n",
i2c->addr);
if (id != ES9039_CHIP_ID_ES9039Q2M)
return dev_err_probe(dev, -ENODEV,
"unexpected chip id 0x%02x, want 0x%02x\n",
id, ES9039_CHIP_ID_ES9039Q2M);
dev_info(dev, "ES9039Q2M at 0x%02x, mclk %u Hz\n",
i2c->addr, priv->mclk_rate);
return devm_snd_soc_register_component(dev, &es9039q2m_component,
&es9039q2m_dai, 1);
}
static const struct of_device_id es9039q2m_of_match[] = {
{ .compatible = "esstech,es9039q2m" },
{ }
};
MODULE_DEVICE_TABLE(of, es9039q2m_of_match);
static const struct i2c_device_id es9039q2m_i2c_id[] = {
{ "es9039q2m" },
{ }
};
MODULE_DEVICE_TABLE(i2c, es9039q2m_i2c_id);
static struct i2c_driver es9039q2m_i2c_driver = {
.driver = {
.name = "es9039q2m",
.of_match_table = es9039q2m_of_match,
},
.probe = es9039q2m_i2c_probe,
.id_table = es9039q2m_i2c_id,
};
module_i2c_driver(es9039q2m_i2c_driver);
MODULE_DESCRIPTION("ASoC ES9039Q2M driver");
MODULE_AUTHOR("Karl Asseily <karl@asseily.com>");
MODULE_LICENSE("GPL");