diff options
author | Viorel Suman <viorel.suman@nxp.com> | 2019-06-05 13:46:32 +0000 |
---|---|---|
committer | Viorel Suman <viorel.suman@nxp.com> | 2019-07-11 12:10:31 +0300 |
commit | f94d518c8c62b685c93cf2c025fb05fa1f53f5d1 (patch) | |
tree | 081bb617c41aca2b172bc5e0bed53dde8a4c0df2 /sound/soc/fsl | |
parent | 17f2229a9a435d02b569b3b699f03be3bbcc969d (diff) |
MLK-21957-3: ASoC: fsl_sai: add bitcount and timestamp controls
Bitcount and timestamp support added in SAI IP recently.
Add the related controls in SAI driver.
Signed-off-by: Viorel Suman <viorel.suman@nxp.com>
(cherry picked from commit 6430d82eb40db6ea85a4f125f99a1747153a38c1)
Diffstat (limited to 'sound/soc/fsl')
-rw-r--r-- | sound/soc/fsl/fsl_sai.c | 86 | ||||
-rw-r--r-- | sound/soc/fsl/fsl_sai.h | 6 |
2 files changed, 91 insertions, 1 deletions
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index feb77a9fc10d..9c716090c33a 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -1000,6 +1000,71 @@ static const struct snd_soc_dai_ops fsl_sai_pcm_dai_ops = { .shutdown = fsl_sai_shutdown, }; +static const char + *en_sl[] = { "Disabled", "Enabled", }, + *inc_sl[] = { "On enabled and bitcount increment", "On enabled", }; + +static const struct soc_enum tstmp_enum[] = { +SOC_ENUM_SINGLE(FSL_SAI_TTCTL, 0, ARRAY_SIZE(en_sl), en_sl), +SOC_ENUM_SINGLE(FSL_SAI_RTCTL, 0, ARRAY_SIZE(en_sl), en_sl), +SOC_ENUM_SINGLE(FSL_SAI_TTCTL, 1, ARRAY_SIZE(inc_sl), inc_sl), +SOC_ENUM_SINGLE(FSL_SAI_RTCTL, 1, ARRAY_SIZE(inc_sl), inc_sl), +}; + +int fsl_sai_get_reg(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + struct snd_soc_component *component = snd_kcontrol_chip(kcontrol); + struct soc_mreg_control *mc = + (struct soc_mreg_control *)kcontrol->private_value; + unsigned int regval; + int ret; + + ret = snd_soc_component_read(component, mc->regbase, ®val); + if (ret < 0) + return ret; + + ucontrol->value.integer.value[0] = regval; + + return 0; +} + +#define SOC_SINGLE_REG_RO(xname, xreg) \ +{ .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = (xname), \ + .access = SNDRV_CTL_ELEM_ACCESS_READ | \ + SNDRV_CTL_ELEM_ACCESS_VOLATILE, \ + .info = snd_soc_info_xr_sx, .get = fsl_sai_get_reg, \ + .private_value = (unsigned long)&(struct soc_mreg_control) \ + { .regbase = xreg, .regcount = 1, .nbits = 32, \ + .invert = 0, .min = 0, .max = 0xffffffff, } } + +static const struct snd_kcontrol_new fsl_sai_ctrls[] = { + SOC_ENUM("Playback Timestamp Control", tstmp_enum[0]), + SOC_ENUM("Capture Timestamp Control", tstmp_enum[1]), + SOC_ENUM("Playback Timestamp Increment", tstmp_enum[2]), + SOC_ENUM("Capture Timestamp Increment", tstmp_enum[3]), + SOC_SINGLE("Playback Timestamp Reset", FSL_SAI_TTCTL, 8, 1, 0), + SOC_SINGLE("Capture Timestamp Reset", FSL_SAI_RTCTL, 8, 1, 0), + SOC_SINGLE("Playback Bit Counter Reset", FSL_SAI_TTCTL, 9, 1, 0), + SOC_SINGLE("Capture Bit Counter Reset", FSL_SAI_RTCTL, 9, 1, 0), + SOC_SINGLE_REG_RO("Playback Timestamp Counter", FSL_SAI_TTCTN), + SOC_SINGLE_REG_RO("Capture Timestamp Counter", FSL_SAI_RTCTN), + SOC_SINGLE_REG_RO("Playback Bit Counter", FSL_SAI_TBCTN), + SOC_SINGLE_REG_RO("Capture Bit Counter", FSL_SAI_RBCTN), + SOC_SINGLE_REG_RO("Playback Latched Timestamp Counter", FSL_SAI_TTCAP), + SOC_SINGLE_REG_RO("Capture Latched Timestamp Counter", FSL_SAI_RTCAP), +}; + +static int fsl_sai_component_probe(struct snd_soc_component *comp) +{ + struct fsl_sai *sai = dev_get_drvdata(comp->dev); + + if (sai->verid.timestamp_en) + snd_soc_add_component_controls(comp, fsl_sai_ctrls, + ARRAY_SIZE(fsl_sai_ctrls)); + return 0; +} + static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai) { struct fsl_sai *sai = dev_get_drvdata(cpu_dai->dev); @@ -1062,7 +1127,8 @@ static struct snd_soc_dai_driver fsl_sai_dai = { }; static const struct snd_soc_component_driver fsl_component = { - .name = "fsl-sai", + .name = "fsl-sai", + .probe = fsl_sai_component_probe, }; static struct reg_default fsl_sai_v2_reg_defaults[] = { @@ -1149,6 +1215,14 @@ static bool fsl_sai_readable_reg(struct device *dev, unsigned int reg) case FSL_SAI_MDIV: case FSL_SAI_VERID: case FSL_SAI_PARAM: + case FSL_SAI_TTCTN: + case FSL_SAI_RTCTN: + case FSL_SAI_TTCTL: + case FSL_SAI_TBCTN: + case FSL_SAI_TTCAP: + case FSL_SAI_RTCTL: + case FSL_SAI_RBCTN: + case FSL_SAI_RTCAP: return true; default: return false; @@ -1192,6 +1266,14 @@ static bool fsl_sai_volatile_reg(struct device *dev, unsigned int reg) case FSL_SAI_RDR5: case FSL_SAI_RDR6: case FSL_SAI_RDR7: + case FSL_SAI_TTCTL: + case FSL_SAI_RTCTL: + case FSL_SAI_TTCTN: + case FSL_SAI_RTCTN: + case FSL_SAI_TBCTN: + case FSL_SAI_RBCTN: + case FSL_SAI_TTCAP: + case FSL_SAI_RTCAP: return true; default: return false; @@ -1222,6 +1304,8 @@ static bool fsl_sai_writeable_reg(struct device *dev, unsigned int reg) case FSL_SAI_RMR: case FSL_SAI_MCTL: case FSL_SAI_MDIV: + case FSL_SAI_TTCTL: + case FSL_SAI_RTCTL: return true; default: return false; diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h index a3a11907ba0a..0d19cd51739c 100644 --- a/sound/soc/fsl/fsl_sai.h +++ b/sound/soc/fsl/fsl_sai.h @@ -215,6 +215,12 @@ #define SAI_FLAG_PMQOS BIT(0) +/* SAI timestamp and bitcounter */ +#define FSL_SAI_xTCTL_TSEN BIT(0) +#define FSL_SAI_xTCTL_TSINC BIT(1) +#define FSL_SAI_xTCTL_RTSC BIT(8) +#define FSL_SAI_xTCTL_RBC BIT(9) + struct fsl_sai_soc_data { unsigned int fifo_depth; unsigned int fifos; |