diff options
author | Peter Ujfalusi <peter.ujfalusi@ti.com> | 2014-11-10 05:32:15 -0500 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-11-10 10:00:01 -0500 |
commit | 1a5923da4e2e6997f03545a2b88f2cd2dea1a5c2 (patch) | |
tree | fc8e903860d1f10ccf22460b7972f00c238c730b | |
parent | bb372af0f7040fb637bfe0859aaa0ba49018506b (diff) |
ASoC: davinci-mcasp: Validate tdm_slots parameter at probe time
Instead of validating the tdm_slots parameter every time at hw_params we
can do it once during probe. If the parameter is not valid (<2 or >32)
print an error and fix it up.
Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index 6b1bfd9de57d..10c264738a0b 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
@@ -632,13 +632,7 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream) | |||
632 | u32 mask = 0; | 632 | u32 mask = 0; |
633 | u32 busel = 0; | 633 | u32 busel = 0; |
634 | 634 | ||
635 | if ((mcasp->tdm_slots < 2) || (mcasp->tdm_slots > 32)) { | 635 | active_slots = mcasp->tdm_slots; |
636 | dev_err(mcasp->dev, "tdm slot %d not supported\n", | ||
637 | mcasp->tdm_slots); | ||
638 | return -EINVAL; | ||
639 | } | ||
640 | |||
641 | active_slots = (mcasp->tdm_slots > 31) ? 32 : mcasp->tdm_slots; | ||
642 | for (i = 0; i < active_slots; i++) | 636 | for (i = 0; i < active_slots; i++) |
643 | mask |= (1 << i); | 637 | mask |= (1 << i); |
644 | 638 | ||
@@ -650,12 +644,12 @@ static int mcasp_i2s_hw_param(struct davinci_mcasp *mcasp, int stream) | |||
650 | mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask); | 644 | mcasp_set_reg(mcasp, DAVINCI_MCASP_TXTDM_REG, mask); |
651 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD); | 645 | mcasp_set_bits(mcasp, DAVINCI_MCASP_TXFMT_REG, busel | TXORD); |
652 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, | 646 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_TXFMCTL_REG, |
653 | FSXMOD(mcasp->tdm_slots), FSXMOD(0x1FF)); | 647 | FSXMOD(active_slots), FSXMOD(0x1FF)); |
654 | 648 | ||
655 | mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask); | 649 | mcasp_set_reg(mcasp, DAVINCI_MCASP_RXTDM_REG, mask); |
656 | mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD); | 650 | mcasp_set_bits(mcasp, DAVINCI_MCASP_RXFMT_REG, busel | RXORD); |
657 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, | 651 | mcasp_mod_bits(mcasp, DAVINCI_MCASP_RXFMCTL_REG, |
658 | FSRMOD(mcasp->tdm_slots), FSRMOD(0x1FF)); | 652 | FSRMOD(active_slots), FSRMOD(0x1FF)); |
659 | 653 | ||
660 | return 0; | 654 | return 0; |
661 | } | 655 | } |
@@ -1237,7 +1231,21 @@ static int davinci_mcasp_probe(struct platform_device *pdev) | |||
1237 | } | 1231 | } |
1238 | 1232 | ||
1239 | mcasp->op_mode = pdata->op_mode; | 1233 | mcasp->op_mode = pdata->op_mode; |
1240 | mcasp->tdm_slots = pdata->tdm_slots; | 1234 | /* sanity check for tdm slots parameter */ |
1235 | if (mcasp->op_mode == DAVINCI_MCASP_IIS_MODE) { | ||
1236 | if (pdata->tdm_slots < 2) { | ||
1237 | dev_err(&pdev->dev, "invalid tdm slots: %d\n", | ||
1238 | pdata->tdm_slots); | ||
1239 | mcasp->tdm_slots = 2; | ||
1240 | } else if (pdata->tdm_slots > 32) { | ||
1241 | dev_err(&pdev->dev, "invalid tdm slots: %d\n", | ||
1242 | pdata->tdm_slots); | ||
1243 | mcasp->tdm_slots = 32; | ||
1244 | } else { | ||
1245 | mcasp->tdm_slots = pdata->tdm_slots; | ||
1246 | } | ||
1247 | } | ||
1248 | |||
1241 | mcasp->num_serializer = pdata->num_serializer; | 1249 | mcasp->num_serializer = pdata->num_serializer; |
1242 | #ifdef CONFIG_PM_SLEEP | 1250 | #ifdef CONFIG_PM_SLEEP |
1243 | mcasp->context.xrsr_regs = devm_kzalloc(&pdev->dev, | 1251 | mcasp->context.xrsr_regs = devm_kzalloc(&pdev->dev, |