aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Ujfalusi <peter.ujfalusi@ti.com>2014-11-10 05:32:15 -0500
committerMark Brown <broonie@kernel.org>2014-11-10 10:00:01 -0500
commit1a5923da4e2e6997f03545a2b88f2cd2dea1a5c2 (patch)
treefc8e903860d1f10ccf22460b7972f00c238c730b
parentbb372af0f7040fb637bfe0859aaa0ba49018506b (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.c28
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,