提交 89b0d550 编写于 作者: P Peter Ujfalusi 提交者: Mark Brown

ASoC: omap-mcpdm: API to configure offset cancellation

The offset cancellation values can be different from board to board, even
on the same HW platform.
Provide a way for the machine drivers to configure the McPDM offset
cancellation.
Signed-off-by: NPeter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: NMark Brown <broonie@opensource.wolfsonmicro.com>
上级 db4aabcc
...@@ -59,6 +59,9 @@ struct omap_mcpdm { ...@@ -59,6 +59,9 @@ struct omap_mcpdm {
/* McPDM FIFO thresholds */ /* McPDM FIFO thresholds */
u32 dn_threshold; u32 dn_threshold;
u32 up_threshold; u32 up_threshold;
/* McPDM dn offsets for rx1, and 2 channels */
u32 dn_rx_offset;
}; };
/* /*
...@@ -183,6 +186,15 @@ static void omap_mcpdm_open_streams(struct omap_mcpdm *mcpdm) ...@@ -183,6 +186,15 @@ static void omap_mcpdm_open_streams(struct omap_mcpdm *mcpdm)
MCPDM_DN_IRQ_EMPTY | MCPDM_DN_IRQ_FULL | MCPDM_DN_IRQ_EMPTY | MCPDM_DN_IRQ_FULL |
MCPDM_UP_IRQ_EMPTY | MCPDM_UP_IRQ_FULL); MCPDM_UP_IRQ_EMPTY | MCPDM_UP_IRQ_FULL);
/* Enable DN RX1/2 offset cancellation feature, if configured */
if (mcpdm->dn_rx_offset) {
u32 dn_offset = mcpdm->dn_rx_offset;
omap_mcpdm_write(mcpdm, MCPDM_REG_DN_OFFSET, dn_offset);
dn_offset |= (MCPDM_DN_OFST_RX1_EN | MCPDM_DN_OFST_RX2_EN);
omap_mcpdm_write(mcpdm, MCPDM_REG_DN_OFFSET, dn_offset);
}
omap_mcpdm_write(mcpdm, MCPDM_REG_FIFO_CTRL_DN, mcpdm->dn_threshold); omap_mcpdm_write(mcpdm, MCPDM_REG_FIFO_CTRL_DN, mcpdm->dn_threshold);
omap_mcpdm_write(mcpdm, MCPDM_REG_FIFO_CTRL_UP, mcpdm->up_threshold); omap_mcpdm_write(mcpdm, MCPDM_REG_FIFO_CTRL_UP, mcpdm->up_threshold);
...@@ -209,6 +221,10 @@ static void omap_mcpdm_close_streams(struct omap_mcpdm *mcpdm) ...@@ -209,6 +221,10 @@ static void omap_mcpdm_close_streams(struct omap_mcpdm *mcpdm)
/* Disable DMA request generation for uplink */ /* Disable DMA request generation for uplink */
omap_mcpdm_write(mcpdm, MCPDM_REG_DMAENABLE_CLR, MCPDM_DMA_UP_ENABLE); omap_mcpdm_write(mcpdm, MCPDM_REG_DMAENABLE_CLR, MCPDM_DMA_UP_ENABLE);
/* Disable RX1/2 offset cancellation */
if (mcpdm->dn_rx_offset)
omap_mcpdm_write(mcpdm, MCPDM_REG_DN_OFFSET, 0);
} }
static irqreturn_t omap_mcpdm_irq_handler(int irq, void *dev_id) static irqreturn_t omap_mcpdm_irq_handler(int irq, void *dev_id)
...@@ -418,6 +434,15 @@ static struct snd_soc_dai_driver omap_mcpdm_dai = { ...@@ -418,6 +434,15 @@ static struct snd_soc_dai_driver omap_mcpdm_dai = {
.ops = &omap_mcpdm_dai_ops, .ops = &omap_mcpdm_dai_ops,
}; };
void omap_mcpdm_configure_dn_offsets(struct snd_soc_pcm_runtime *rtd,
u8 rx1, u8 rx2)
{
struct omap_mcpdm *mcpdm = snd_soc_dai_get_drvdata(rtd->cpu_dai);
mcpdm->dn_rx_offset = MCPDM_DNOFST_RX1(rx1) | MCPDM_DNOFST_RX2(rx2);
}
EXPORT_SYMBOL_GPL(omap_mcpdm_configure_dn_offsets);
static __devinit int asoc_mcpdm_probe(struct platform_device *pdev) static __devinit int asoc_mcpdm_probe(struct platform_device *pdev)
{ {
struct omap_mcpdm *mcpdm; struct omap_mcpdm *mcpdm;
......
...@@ -92,4 +92,16 @@ ...@@ -92,4 +92,16 @@
#define MCPDM_UP_THRES_MAX 0xF #define MCPDM_UP_THRES_MAX 0xF
#define MCPDM_DN_THRES_MAX 0xF #define MCPDM_DN_THRES_MAX 0xF
/*
* MCPDM_DN_OFFSET bit fields
*/
#define MCPDM_DN_OFST_RX1_EN (1 << 0)
#define MCPDM_DNOFST_RX1(x) ((x & 0x1f) << 1)
#define MCPDM_DN_OFST_RX2_EN (1 << 8)
#define MCPDM_DNOFST_RX2(x) ((x & 0x1f) << 9)
void omap_mcpdm_configure_dn_offsets(struct snd_soc_pcm_runtime *rtd,
u8 rx1, u8 rx2);
#endif /* End of __OMAP_MCPDM_H__ */ #endif /* End of __OMAP_MCPDM_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册