ASoC: amd: acp: refactor acp i2s clock generation code
Refactor acp i2s LRCLK,BCLK generation code and move to commnon file. Signed-off-by: Syed Saba Kareem <Syed.SabaKareem@amd.com> Link: https://lore.kernel.org/r/20231021145110.478744-2-Syed.SabaKareem@amd.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
33d120a49b
commit
40f74d5f09
2 changed files with 32 additions and 39 deletions
|
@ -20,10 +20,42 @@
|
||||||
#include <sound/soc.h>
|
#include <sound/soc.h>
|
||||||
#include <sound/soc-dai.h>
|
#include <sound/soc-dai.h>
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <linux/bitfield.h>
|
||||||
|
|
||||||
#include "amd.h"
|
#include "amd.h"
|
||||||
|
|
||||||
#define DRV_NAME "acp_i2s_playcap"
|
#define DRV_NAME "acp_i2s_playcap"
|
||||||
|
#define I2S_MASTER_MODE_ENABLE 1
|
||||||
|
#define I2S_MODE_ENABLE 0
|
||||||
|
#define I2S_FORMAT_MODE GENMASK(1, 1)
|
||||||
|
#define LRCLK_DIV_FIELD GENMASK(10, 2)
|
||||||
|
#define BCLK_DIV_FIELD GENMASK(23, 11)
|
||||||
|
|
||||||
|
static inline void acp_set_i2s_clk(struct acp_dev_data *adata, int dai_id)
|
||||||
|
{
|
||||||
|
u32 i2s_clk_reg, val;
|
||||||
|
|
||||||
|
switch (dai_id) {
|
||||||
|
case I2S_SP_INSTANCE:
|
||||||
|
i2s_clk_reg = ACP_I2STDM0_MSTRCLKGEN;
|
||||||
|
break;
|
||||||
|
case I2S_BT_INSTANCE:
|
||||||
|
i2s_clk_reg = ACP_I2STDM1_MSTRCLKGEN;
|
||||||
|
break;
|
||||||
|
case I2S_HS_INSTANCE:
|
||||||
|
i2s_clk_reg = ACP_I2STDM2_MSTRCLKGEN;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
i2s_clk_reg = ACP_I2STDM0_MSTRCLKGEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
val = I2S_MASTER_MODE_ENABLE;
|
||||||
|
val |= I2S_MODE_ENABLE & BIT(1);
|
||||||
|
val |= FIELD_PREP(LRCLK_DIV_FIELD, adata->lrclk_div);
|
||||||
|
val |= FIELD_PREP(BCLK_DIV_FIELD, adata->bclk_div);
|
||||||
|
writel(val, adata->acp_base + i2s_clk_reg);
|
||||||
|
}
|
||||||
|
|
||||||
static int acp_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
|
static int acp_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
|
||||||
unsigned int fmt)
|
unsigned int fmt)
|
||||||
|
|
|
@ -188,17 +188,6 @@ struct acp_dev_data {
|
||||||
u32 xfer_rx_resolution[3];
|
u32 xfer_rx_resolution[3];
|
||||||
};
|
};
|
||||||
|
|
||||||
union acp_i2stdm_mstrclkgen {
|
|
||||||
struct {
|
|
||||||
u32 i2stdm_master_mode : 1;
|
|
||||||
u32 i2stdm_format_mode : 1;
|
|
||||||
u32 i2stdm_lrclk_div_val : 9;
|
|
||||||
u32 i2stdm_bclk_div_val : 11;
|
|
||||||
u32:10;
|
|
||||||
} bitfields, bits;
|
|
||||||
u32 u32_all;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const struct snd_soc_dai_ops asoc_acp_cpu_dai_ops;
|
extern const struct snd_soc_dai_ops asoc_acp_cpu_dai_ops;
|
||||||
extern const struct snd_soc_dai_ops acp_dmic_dai_ops;
|
extern const struct snd_soc_dai_ops acp_dmic_dai_ops;
|
||||||
|
|
||||||
|
@ -276,32 +265,4 @@ static inline u64 acp_get_byte_count(struct acp_dev_data *adata, int dai_id, int
|
||||||
POINTER_RETURN_BYTES:
|
POINTER_RETURN_BYTES:
|
||||||
return byte_count;
|
return byte_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void acp_set_i2s_clk(struct acp_dev_data *adata, int dai_id)
|
|
||||||
{
|
|
||||||
union acp_i2stdm_mstrclkgen mclkgen;
|
|
||||||
u32 master_reg;
|
|
||||||
|
|
||||||
switch (dai_id) {
|
|
||||||
case I2S_SP_INSTANCE:
|
|
||||||
master_reg = ACP_I2STDM0_MSTRCLKGEN;
|
|
||||||
break;
|
|
||||||
case I2S_BT_INSTANCE:
|
|
||||||
master_reg = ACP_I2STDM1_MSTRCLKGEN;
|
|
||||||
break;
|
|
||||||
case I2S_HS_INSTANCE:
|
|
||||||
master_reg = ACP_I2STDM2_MSTRCLKGEN;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
master_reg = ACP_I2STDM0_MSTRCLKGEN;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mclkgen.bits.i2stdm_master_mode = 0x1;
|
|
||||||
mclkgen.bits.i2stdm_format_mode = 0x00;
|
|
||||||
|
|
||||||
mclkgen.bits.i2stdm_bclk_div_val = adata->bclk_div;
|
|
||||||
mclkgen.bits.i2stdm_lrclk_div_val = adata->lrclk_div;
|
|
||||||
writel(mclkgen.u32_all, adata->acp_base + master_reg);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue