Message ID | 1600251387-1863-3-git-send-email-shengjiu.wang@nxp.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | ASoC: fsl_sai: update the register list | expand |
On Wed, Sep 16, 2020 at 06:16:26PM +0800, Shengjiu Wang wrote: > fsl_sai_check_version can help to parse the version info > in VERID and PARAM registers. > > Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> Acked-by: Nicolin Chen <nicoleotsuka@gmail.com> > --- > sound/soc/fsl/fsl_sai.c | 47 +++++++++++++++++++++++++++++++++++++++++ > sound/soc/fsl/fsl_sai.h | 28 ++++++++++++++++++++++++ > 2 files changed, 75 insertions(+) > > diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c > index 24ca528ca2be..738b4dda7847 100644 > --- a/sound/soc/fsl/fsl_sai.c > +++ b/sound/soc/fsl/fsl_sai.c > @@ -946,6 +946,48 @@ static struct regmap_config fsl_sai_regmap_config = { > .cache_type = REGCACHE_FLAT, > }; > > +static int fsl_sai_check_version(struct device *dev) > +{ > + struct fsl_sai *sai = dev_get_drvdata(dev); > + unsigned char ofs = sai->soc_data->reg_offset; > + unsigned int val; > + int ret; > + > + if (FSL_SAI_TCSR(ofs) == FSL_SAI_VERID) > + return 0; > + > + ret = regmap_read(sai->regmap, FSL_SAI_VERID, &val); > + if (ret < 0) > + return ret; > + > + dev_dbg(dev, "VERID: 0x%016X\n", val); > + > + sai->verid.major = (val & FSL_SAI_VERID_MAJOR_MASK) >> > + FSL_SAI_VERID_MAJOR_SHIFT; > + sai->verid.minor = (val & FSL_SAI_VERID_MINOR_MASK) >> > + FSL_SAI_VERID_MINOR_SHIFT; > + sai->verid.feature = val & FSL_SAI_VERID_FEATURE_MASK; > + > + ret = regmap_read(sai->regmap, FSL_SAI_PARAM, &val); > + if (ret < 0) > + return ret; > + > + dev_dbg(dev, "PARAM: 0x%016X\n", val); > + > + /* Max slots per frame, power of 2 */ > + sai->param.slot_num = 1 << > + ((val & FSL_SAI_PARAM_SPF_MASK) >> FSL_SAI_PARAM_SPF_SHIFT); > + > + /* Words per fifo, power of 2 */ > + sai->param.fifo_depth = 1 << > + ((val & FSL_SAI_PARAM_WPF_MASK) >> FSL_SAI_PARAM_WPF_SHIFT); > + > + /* Number of datalines implemented */ > + sai->param.dataline = val & FSL_SAI_PARAM_DLN_MASK; > + > + return 0; > +} > + > static int fsl_sai_probe(struct platform_device *pdev) > { > struct device_node *np = pdev->dev.of_node; > @@ -1070,6 +1112,11 @@ static int fsl_sai_probe(struct platform_device *pdev) > > platform_set_drvdata(pdev, sai); > > + /* Get sai version */ > + ret = fsl_sai_check_version(&pdev->dev); > + if (ret < 0) > + dev_warn(&pdev->dev, "Error reading SAI version: %d\n", ret); > + > pm_runtime_enable(&pdev->dev); > regcache_cache_only(sai->regmap, true); > > diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h > index d16fc4241f41..ba7425a9e217 100644 > --- a/sound/soc/fsl/fsl_sai.h > +++ b/sound/soc/fsl/fsl_sai.h > @@ -223,6 +223,32 @@ struct fsl_sai_soc_data { > unsigned int reg_offset; > }; > > +/** > + * struct fsl_sai_verid - version id data > + * @major: major version number > + * @minor: minor version number > + * @feature: feature specification number > + * 0000000000000000b - Standard feature set > + * 0000000000000000b - Standard feature set > + */ > +struct fsl_sai_verid { > + u32 major; > + u32 minor; > + u32 feature; > +}; > + > +/** > + * struct fsl_sai_param - parameter data > + * @slot_num: The maximum number of slots per frame > + * @fifo_depth: The number of words in each FIFO (depth) > + * @dataline: The number of datalines implemented > + */ > +struct fsl_sai_param { > + u32 slot_num; > + u32 fifo_depth; > + u32 dataline; > +}; > + > struct fsl_sai { > struct platform_device *pdev; > struct regmap *regmap; > @@ -243,6 +269,8 @@ struct fsl_sai { > const struct fsl_sai_soc_data *soc_data; > struct snd_dmaengine_dai_dma_data dma_params_rx; > struct snd_dmaengine_dai_dma_data dma_params_tx; > + struct fsl_sai_verid verid; > + struct fsl_sai_param param; > }; > > #define TX 1 > -- > 2.27.0 >
diff --git a/sound/soc/fsl/fsl_sai.c b/sound/soc/fsl/fsl_sai.c index 24ca528ca2be..738b4dda7847 100644 --- a/sound/soc/fsl/fsl_sai.c +++ b/sound/soc/fsl/fsl_sai.c @@ -946,6 +946,48 @@ static struct regmap_config fsl_sai_regmap_config = { .cache_type = REGCACHE_FLAT, }; +static int fsl_sai_check_version(struct device *dev) +{ + struct fsl_sai *sai = dev_get_drvdata(dev); + unsigned char ofs = sai->soc_data->reg_offset; + unsigned int val; + int ret; + + if (FSL_SAI_TCSR(ofs) == FSL_SAI_VERID) + return 0; + + ret = regmap_read(sai->regmap, FSL_SAI_VERID, &val); + if (ret < 0) + return ret; + + dev_dbg(dev, "VERID: 0x%016X\n", val); + + sai->verid.major = (val & FSL_SAI_VERID_MAJOR_MASK) >> + FSL_SAI_VERID_MAJOR_SHIFT; + sai->verid.minor = (val & FSL_SAI_VERID_MINOR_MASK) >> + FSL_SAI_VERID_MINOR_SHIFT; + sai->verid.feature = val & FSL_SAI_VERID_FEATURE_MASK; + + ret = regmap_read(sai->regmap, FSL_SAI_PARAM, &val); + if (ret < 0) + return ret; + + dev_dbg(dev, "PARAM: 0x%016X\n", val); + + /* Max slots per frame, power of 2 */ + sai->param.slot_num = 1 << + ((val & FSL_SAI_PARAM_SPF_MASK) >> FSL_SAI_PARAM_SPF_SHIFT); + + /* Words per fifo, power of 2 */ + sai->param.fifo_depth = 1 << + ((val & FSL_SAI_PARAM_WPF_MASK) >> FSL_SAI_PARAM_WPF_SHIFT); + + /* Number of datalines implemented */ + sai->param.dataline = val & FSL_SAI_PARAM_DLN_MASK; + + return 0; +} + static int fsl_sai_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; @@ -1070,6 +1112,11 @@ static int fsl_sai_probe(struct platform_device *pdev) platform_set_drvdata(pdev, sai); + /* Get sai version */ + ret = fsl_sai_check_version(&pdev->dev); + if (ret < 0) + dev_warn(&pdev->dev, "Error reading SAI version: %d\n", ret); + pm_runtime_enable(&pdev->dev); regcache_cache_only(sai->regmap, true); diff --git a/sound/soc/fsl/fsl_sai.h b/sound/soc/fsl/fsl_sai.h index d16fc4241f41..ba7425a9e217 100644 --- a/sound/soc/fsl/fsl_sai.h +++ b/sound/soc/fsl/fsl_sai.h @@ -223,6 +223,32 @@ struct fsl_sai_soc_data { unsigned int reg_offset; }; +/** + * struct fsl_sai_verid - version id data + * @major: major version number + * @minor: minor version number + * @feature: feature specification number + * 0000000000000000b - Standard feature set + * 0000000000000000b - Standard feature set + */ +struct fsl_sai_verid { + u32 major; + u32 minor; + u32 feature; +}; + +/** + * struct fsl_sai_param - parameter data + * @slot_num: The maximum number of slots per frame + * @fifo_depth: The number of words in each FIFO (depth) + * @dataline: The number of datalines implemented + */ +struct fsl_sai_param { + u32 slot_num; + u32 fifo_depth; + u32 dataline; +}; + struct fsl_sai { struct platform_device *pdev; struct regmap *regmap; @@ -243,6 +269,8 @@ struct fsl_sai { const struct fsl_sai_soc_data *soc_data; struct snd_dmaengine_dai_dma_data dma_params_rx; struct snd_dmaengine_dai_dma_data dma_params_tx; + struct fsl_sai_verid verid; + struct fsl_sai_param param; }; #define TX 1
fsl_sai_check_version can help to parse the version info in VERID and PARAM registers. Signed-off-by: Shengjiu Wang <shengjiu.wang@nxp.com> --- sound/soc/fsl/fsl_sai.c | 47 +++++++++++++++++++++++++++++++++++++++++ sound/soc/fsl/fsl_sai.h | 28 ++++++++++++++++++++++++ 2 files changed, 75 insertions(+)