| From: Nicolin Chen <nicoleotsuka@gmail.com> |
| Date: Sun, 8 Apr 2018 16:57:35 -0700 |
| Subject: ASoC: fsl_esai: Fix divisor calculation failure at lower ratio |
| |
| commit c656941df9bc80f7ec65b92ca73c42f8b0b62628 upstream. |
| |
| When the desired ratio is less than 256, the savesub (tolerance) |
| in the calculation would become 0. This will then fail the loop- |
| search immediately without reporting any errors. |
| |
| But if the ratio is smaller enough, there is no need to calculate |
| the tolerance because PM divisor alone is enough to get the ratio. |
| |
| So a simple fix could be just to set PM directly instead of going |
| into the loop-search. |
| |
| Reported-by: Marek Vasut <marex@denx.de> |
| Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com> |
| Tested-by: Marek Vasut <marex@denx.de> |
| Reviewed-by: Fabio Estevam <fabio.estevam@nxp.com> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| sound/soc/fsl/fsl_esai.c | 7 +++++++ |
| 1 file changed, 7 insertions(+) |
| |
| --- a/sound/soc/fsl/fsl_esai.c |
| +++ b/sound/soc/fsl/fsl_esai.c |
| @@ -142,6 +142,13 @@ static int fsl_esai_divisor_cal(struct s |
| |
| psr = ratio <= 256 * maxfp ? ESAI_xCCR_xPSR_BYPASS : ESAI_xCCR_xPSR_DIV8; |
| |
| + /* Do not loop-search if PM (1 ~ 256) alone can serve the ratio */ |
| + if (ratio <= 256) { |
| + pm = ratio; |
| + fp = 1; |
| + goto out; |
| + } |
| + |
| /* Set the max fluctuation -- 0.1% of the max devisor */ |
| savesub = (psr ? 1 : 8) * 256 * maxfp / 1000; |
| |