aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/soc/fsl/fsl_esai.c14
-rw-r--r--sound/soc/fsl/fsl_esai.h8
2 files changed, 15 insertions, 7 deletions
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
index 72d154e7dd03..f252370073e5 100644
--- a/sound/soc/fsl/fsl_esai.c
+++ b/sound/soc/fsl/fsl_esai.c
@@ -38,6 +38,7 @@
38 * @fsysclk: system clock source to derive HCK, SCK and FS 38 * @fsysclk: system clock source to derive HCK, SCK and FS
39 * @fifo_depth: depth of tx/rx FIFO 39 * @fifo_depth: depth of tx/rx FIFO
40 * @slot_width: width of each DAI slot 40 * @slot_width: width of each DAI slot
41 * @slots: number of slots
41 * @hck_rate: clock rate of desired HCKx clock 42 * @hck_rate: clock rate of desired HCKx clock
42 * @sck_rate: clock rate of desired SCKx clock 43 * @sck_rate: clock rate of desired SCKx clock
43 * @hck_dir: the direction of HCKx pads 44 * @hck_dir: the direction of HCKx pads
@@ -56,6 +57,7 @@ struct fsl_esai {
56 struct clk *fsysclk; 57 struct clk *fsysclk;
57 u32 fifo_depth; 58 u32 fifo_depth;
58 u32 slot_width; 59 u32 slot_width;
60 u32 slots;
59 u32 hck_rate[2]; 61 u32 hck_rate[2];
60 u32 sck_rate[2]; 62 u32 sck_rate[2];
61 bool hck_dir[2]; 63 bool hck_dir[2];
@@ -363,6 +365,7 @@ static int fsl_esai_set_dai_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask,
363 ESAI_xSMB_xS_MASK, ESAI_xSMB_xS(rx_mask)); 365 ESAI_xSMB_xS_MASK, ESAI_xSMB_xS(rx_mask));
364 366
365 esai_priv->slot_width = slot_width; 367 esai_priv->slot_width = slot_width;
368 esai_priv->slots = slots;
366 369
367 return 0; 370 return 0;
368} 371}
@@ -510,10 +513,11 @@ static int fsl_esai_hw_params(struct snd_pcm_substream *substream,
510 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 513 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
511 u32 width = snd_pcm_format_width(params_format(params)); 514 u32 width = snd_pcm_format_width(params_format(params));
512 u32 channels = params_channels(params); 515 u32 channels = params_channels(params);
516 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots);
513 u32 bclk, mask, val; 517 u32 bclk, mask, val;
514 int ret; 518 int ret;
515 519
516 bclk = params_rate(params) * esai_priv->slot_width * 2; 520 bclk = params_rate(params) * esai_priv->slot_width * esai_priv->slots;
517 521
518 ret = fsl_esai_set_bclk(dai, tx, bclk); 522 ret = fsl_esai_set_bclk(dai, tx, bclk);
519 if (ret) 523 if (ret)
@@ -530,7 +534,7 @@ static int fsl_esai_hw_params(struct snd_pcm_substream *substream,
530 mask = ESAI_xFCR_xFR_MASK | ESAI_xFCR_xWA_MASK | ESAI_xFCR_xFWM_MASK | 534 mask = ESAI_xFCR_xFR_MASK | ESAI_xFCR_xWA_MASK | ESAI_xFCR_xFWM_MASK |
531 (tx ? ESAI_xFCR_TE_MASK | ESAI_xFCR_TIEN : ESAI_xFCR_RE_MASK); 535 (tx ? ESAI_xFCR_TE_MASK | ESAI_xFCR_TIEN : ESAI_xFCR_RE_MASK);
532 val = ESAI_xFCR_xWA(width) | ESAI_xFCR_xFWM(esai_priv->fifo_depth) | 536 val = ESAI_xFCR_xWA(width) | ESAI_xFCR_xFWM(esai_priv->fifo_depth) |
533 (tx ? ESAI_xFCR_TE(channels) | ESAI_xFCR_TIEN : ESAI_xFCR_RE(channels)); 537 (tx ? ESAI_xFCR_TE(pins) | ESAI_xFCR_TIEN : ESAI_xFCR_RE(pins));
534 538
535 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), mask, val); 539 regmap_update_bits(esai_priv->regmap, REG_ESAI_xFCR(tx), mask, val);
536 540
@@ -565,6 +569,7 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
565 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai); 569 struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai);
566 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK; 570 bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
567 u8 i, channels = substream->runtime->channels; 571 u8 i, channels = substream->runtime->channels;
572 u32 pins = DIV_ROUND_UP(channels, esai_priv->slots);
568 573
569 switch (cmd) { 574 switch (cmd) {
570 case SNDRV_PCM_TRIGGER_START: 575 case SNDRV_PCM_TRIGGER_START:
@@ -579,7 +584,7 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
579 584
580 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx), 585 regmap_update_bits(esai_priv->regmap, REG_ESAI_xCR(tx),
581 tx ? ESAI_xCR_TE_MASK : ESAI_xCR_RE_MASK, 586 tx ? ESAI_xCR_TE_MASK : ESAI_xCR_RE_MASK,
582 tx ? ESAI_xCR_TE(channels) : ESAI_xCR_RE(channels)); 587 tx ? ESAI_xCR_TE(pins) : ESAI_xCR_RE(pins));
583 break; 588 break;
584 case SNDRV_PCM_TRIGGER_SUSPEND: 589 case SNDRV_PCM_TRIGGER_SUSPEND:
585 case SNDRV_PCM_TRIGGER_STOP: 590 case SNDRV_PCM_TRIGGER_STOP:
@@ -783,6 +788,9 @@ static int fsl_esai_probe(struct platform_device *pdev)
783 /* Set a default slot size */ 788 /* Set a default slot size */
784 esai_priv->slot_width = 32; 789 esai_priv->slot_width = 32;
785 790
791 /* Set a default slot number */
792 esai_priv->slots = 2;
793
786 /* Set a default master/slave state */ 794 /* Set a default master/slave state */
787 esai_priv->slave_mode = true; 795 esai_priv->slave_mode = true;
788 796
diff --git a/sound/soc/fsl/fsl_esai.h b/sound/soc/fsl/fsl_esai.h
index 75e14033e8d8..91a550f4a10d 100644
--- a/sound/soc/fsl/fsl_esai.h
+++ b/sound/soc/fsl/fsl_esai.h
@@ -130,8 +130,8 @@
130#define ESAI_xFCR_RE_WIDTH 4 130#define ESAI_xFCR_RE_WIDTH 4
131#define ESAI_xFCR_TE_MASK (((1 << ESAI_xFCR_TE_WIDTH) - 1) << ESAI_xFCR_xE_SHIFT) 131#define ESAI_xFCR_TE_MASK (((1 << ESAI_xFCR_TE_WIDTH) - 1) << ESAI_xFCR_xE_SHIFT)
132#define ESAI_xFCR_RE_MASK (((1 << ESAI_xFCR_RE_WIDTH) - 1) << ESAI_xFCR_xE_SHIFT) 132#define ESAI_xFCR_RE_MASK (((1 << ESAI_xFCR_RE_WIDTH) - 1) << ESAI_xFCR_xE_SHIFT)
133#define ESAI_xFCR_TE(x) ((ESAI_xFCR_TE_MASK >> (ESAI_xFCR_TE_WIDTH - ((x + 1) >> 1))) & ESAI_xFCR_TE_MASK) 133#define ESAI_xFCR_TE(x) ((ESAI_xFCR_TE_MASK >> (ESAI_xFCR_TE_WIDTH - x)) & ESAI_xFCR_TE_MASK)
134#define ESAI_xFCR_RE(x) ((ESAI_xFCR_RE_MASK >> (ESAI_xFCR_RE_WIDTH - ((x + 1) >> 1))) & ESAI_xFCR_RE_MASK) 134#define ESAI_xFCR_RE(x) ((ESAI_xFCR_RE_MASK >> (ESAI_xFCR_RE_WIDTH - x)) & ESAI_xFCR_RE_MASK)
135#define ESAI_xFCR_xFR_SHIFT 1 135#define ESAI_xFCR_xFR_SHIFT 1
136#define ESAI_xFCR_xFR_MASK (1 << ESAI_xFCR_xFR_SHIFT) 136#define ESAI_xFCR_xFR_MASK (1 << ESAI_xFCR_xFR_SHIFT)
137#define ESAI_xFCR_xFR (1 << ESAI_xFCR_xFR_SHIFT) 137#define ESAI_xFCR_xFR (1 << ESAI_xFCR_xFR_SHIFT)
@@ -272,8 +272,8 @@
272#define ESAI_xCR_RE_WIDTH 4 272#define ESAI_xCR_RE_WIDTH 4
273#define ESAI_xCR_TE_MASK (((1 << ESAI_xCR_TE_WIDTH) - 1) << ESAI_xCR_xE_SHIFT) 273#define ESAI_xCR_TE_MASK (((1 << ESAI_xCR_TE_WIDTH) - 1) << ESAI_xCR_xE_SHIFT)
274#define ESAI_xCR_RE_MASK (((1 << ESAI_xCR_RE_WIDTH) - 1) << ESAI_xCR_xE_SHIFT) 274#define ESAI_xCR_RE_MASK (((1 << ESAI_xCR_RE_WIDTH) - 1) << ESAI_xCR_xE_SHIFT)
275#define ESAI_xCR_TE(x) ((ESAI_xCR_TE_MASK >> (ESAI_xCR_TE_WIDTH - ((x + 1) >> 1))) & ESAI_xCR_TE_MASK) 275#define ESAI_xCR_TE(x) ((ESAI_xCR_TE_MASK >> (ESAI_xCR_TE_WIDTH - x)) & ESAI_xCR_TE_MASK)
276#define ESAI_xCR_RE(x) ((ESAI_xCR_RE_MASK >> (ESAI_xCR_RE_WIDTH - ((x + 1) >> 1))) & ESAI_xCR_RE_MASK) 276#define ESAI_xCR_RE(x) ((ESAI_xCR_RE_MASK >> (ESAI_xCR_RE_WIDTH - x)) & ESAI_xCR_RE_MASK)
277 277
278/* 278/*
279 * Transmit Clock Control Register -- REG_ESAI_TCCR 0xD8 279 * Transmit Clock Control Register -- REG_ESAI_TCCR 0xD8