aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-fsl-dspi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spi-fsl-dspi.c')
-rw-r--r--drivers/spi/spi-fsl-dspi.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
index d1a39249704a..96cac87c9f85 100644
--- a/drivers/spi/spi-fsl-dspi.c
+++ b/drivers/spi/spi-fsl-dspi.c
@@ -148,23 +148,30 @@ static void hz_to_spi_baud(char *pbr, char *br, int speed_hz,
148 16, 32, 64, 128, 148 16, 32, 64, 128,
149 256, 512, 1024, 2048, 149 256, 512, 1024, 2048,
150 4096, 8192, 16384, 32768 }; 150 4096, 8192, 16384, 32768 };
151 int temp, i = 0, j = 0; 151 int scale_needed, scale, minscale = INT_MAX;
152 152 int i, j;
153 temp = clkrate / 2 / speed_hz; 153
154 154 scale_needed = clkrate / speed_hz;
155 for (i = 0; i < ARRAY_SIZE(pbr_tbl); i++) 155
156 for (j = 0; j < ARRAY_SIZE(brs); j++) { 156 for (i = 0; i < ARRAY_SIZE(brs); i++)
157 if (pbr_tbl[i] * brs[j] >= temp) { 157 for (j = 0; j < ARRAY_SIZE(pbr_tbl); j++) {
158 *pbr = i; 158 scale = brs[i] * pbr_tbl[j];
159 *br = j; 159 if (scale >= scale_needed) {
160 return; 160 if (scale < minscale) {
161 minscale = scale;
162 *br = i;
163 *pbr = j;
164 }
165 break;
161 } 166 }
162 } 167 }
163 168
164 pr_warn("Can not find valid baud rate,speed_hz is %d,clkrate is %ld\ 169 if (minscale == INT_MAX) {
165 ,we use the max prescaler value.\n", speed_hz, clkrate); 170 pr_warn("Can not find valid baud rate,speed_hz is %d,clkrate is %ld, we use the max prescaler value.\n",
166 *pbr = ARRAY_SIZE(pbr_tbl) - 1; 171 speed_hz, clkrate);
167 *br = ARRAY_SIZE(brs) - 1; 172 *pbr = ARRAY_SIZE(pbr_tbl) - 1;
173 *br = ARRAY_SIZE(brs) - 1;
174 }
168} 175}
169 176
170static int dspi_transfer_write(struct fsl_dspi *dspi) 177static int dspi_transfer_write(struct fsl_dspi *dspi)