Commit 1a5c0b28 authored by Olivier Moysan's avatar Olivier Moysan Committed by Mark Brown

ASoC: stm32: spdifrx: manage identification registers

Add support of identification registers in STM32 SPDIFRX.
Signed-off-by: default avatarOlivier Moysan <olivier.moysan@st.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent b9960f6e
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
* details. * details.
*/ */
#include <linux/bitfield.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/delay.h> #include <linux/delay.h>
...@@ -36,6 +37,9 @@ ...@@ -36,6 +37,9 @@
#define STM32_SPDIFRX_DR 0x10 #define STM32_SPDIFRX_DR 0x10
#define STM32_SPDIFRX_CSR 0x14 #define STM32_SPDIFRX_CSR 0x14
#define STM32_SPDIFRX_DIR 0x18 #define STM32_SPDIFRX_DIR 0x18
#define STM32_SPDIFRX_VERR 0x3F4
#define STM32_SPDIFRX_IDR 0x3F8
#define STM32_SPDIFRX_SIDR 0x3FC
/* Bit definition for SPDIF_CR register */ /* Bit definition for SPDIF_CR register */
#define SPDIFRX_CR_SPDIFEN_SHIFT 0 #define SPDIFRX_CR_SPDIFEN_SHIFT 0
...@@ -169,6 +173,18 @@ ...@@ -169,6 +173,18 @@
#define SPDIFRX_SPDIFEN_SYNC 0x1 #define SPDIFRX_SPDIFEN_SYNC 0x1
#define SPDIFRX_SPDIFEN_ENABLE 0x3 #define SPDIFRX_SPDIFEN_ENABLE 0x3
/* Bit definition for SPDIFRX_VERR register */
#define SPDIFRX_VERR_MIN_MASK GENMASK(3, 0)
#define SPDIFRX_VERR_MAJ_MASK GENMASK(7, 4)
/* Bit definition for SPDIFRX_IDR register */
#define SPDIFRX_IDR_ID_MASK GENMASK(31, 0)
/* Bit definition for SPDIFRX_SIDR register */
#define SPDIFRX_SIDR_SID_MASK GENMASK(31, 0)
#define SPDIFRX_IPIDR_NUMBER 0x00130041
#define SPDIFRX_IN1 0x1 #define SPDIFRX_IN1 0x1
#define SPDIFRX_IN2 0x2 #define SPDIFRX_IN2 0x2
#define SPDIFRX_IN3 0x3 #define SPDIFRX_IN3 0x3
...@@ -607,6 +623,9 @@ static bool stm32_spdifrx_readable_reg(struct device *dev, unsigned int reg) ...@@ -607,6 +623,9 @@ static bool stm32_spdifrx_readable_reg(struct device *dev, unsigned int reg)
case STM32_SPDIFRX_DR: case STM32_SPDIFRX_DR:
case STM32_SPDIFRX_CSR: case STM32_SPDIFRX_CSR:
case STM32_SPDIFRX_DIR: case STM32_SPDIFRX_DIR:
case STM32_SPDIFRX_VERR:
case STM32_SPDIFRX_IDR:
case STM32_SPDIFRX_SIDR:
return true; return true;
default: default:
return false; return false;
...@@ -642,10 +661,11 @@ static const struct regmap_config stm32_h7_spdifrx_regmap_conf = { ...@@ -642,10 +661,11 @@ static const struct regmap_config stm32_h7_spdifrx_regmap_conf = {
.reg_bits = 32, .reg_bits = 32,
.reg_stride = 4, .reg_stride = 4,
.val_bits = 32, .val_bits = 32,
.max_register = STM32_SPDIFRX_DIR, .max_register = STM32_SPDIFRX_SIDR,
.readable_reg = stm32_spdifrx_readable_reg, .readable_reg = stm32_spdifrx_readable_reg,
.volatile_reg = stm32_spdifrx_volatile_reg, .volatile_reg = stm32_spdifrx_volatile_reg,
.writeable_reg = stm32_spdifrx_writeable_reg, .writeable_reg = stm32_spdifrx_writeable_reg,
.num_reg_defaults_raw = STM32_SPDIFRX_SIDR / sizeof(u32) + 1,
.fast_io = true, .fast_io = true,
.cache_type = REGCACHE_FLAT, .cache_type = REGCACHE_FLAT,
}; };
...@@ -911,6 +931,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev) ...@@ -911,6 +931,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev)
struct stm32_spdifrx_data *spdifrx; struct stm32_spdifrx_data *spdifrx;
struct reset_control *rst; struct reset_control *rst;
const struct snd_dmaengine_pcm_config *pcm_config = NULL; const struct snd_dmaengine_pcm_config *pcm_config = NULL;
u32 ver, idr;
int ret; int ret;
spdifrx = devm_kzalloc(&pdev->dev, sizeof(*spdifrx), GFP_KERNEL); spdifrx = devm_kzalloc(&pdev->dev, sizeof(*spdifrx), GFP_KERNEL);
...@@ -967,7 +988,19 @@ static int stm32_spdifrx_probe(struct platform_device *pdev) ...@@ -967,7 +988,19 @@ static int stm32_spdifrx_probe(struct platform_device *pdev)
goto error; goto error;
} }
return 0; ret = regmap_read(spdifrx->regmap, STM32_SPDIFRX_IDR, &idr);
if (ret)
goto error;
if (idr == SPDIFRX_IPIDR_NUMBER) {
ret = regmap_read(spdifrx->regmap, STM32_SPDIFRX_VERR, &ver);
dev_dbg(&pdev->dev, "SPDIFRX version: %lu.%lu registered\n",
FIELD_GET(SPDIFRX_VERR_MAJ_MASK, ver),
FIELD_GET(SPDIFRX_VERR_MIN_MASK, ver));
}
return ret;
error: error:
if (!IS_ERR(spdifrx->ctrl_chan)) if (!IS_ERR(spdifrx->ctrl_chan))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment