|
@@ -148,23 +148,32 @@ static void hz_to_spi_baud(char *pbr, char *br, int speed_hz,
|
|
16, 32, 64, 128,
|
|
16, 32, 64, 128,
|
|
256, 512, 1024, 2048,
|
|
256, 512, 1024, 2048,
|
|
4096, 8192, 16384, 32768 };
|
|
4096, 8192, 16384, 32768 };
|
|
- int temp, i = 0, j = 0;
|
|
|
|
-
|
|
|
|
- temp = clkrate / 2 / speed_hz;
|
|
|
|
-
|
|
|
|
- for (i = 0; i < ARRAY_SIZE(pbr_tbl); i++)
|
|
|
|
- for (j = 0; j < ARRAY_SIZE(brs); j++) {
|
|
|
|
- if (pbr_tbl[i] * brs[j] >= temp) {
|
|
|
|
- *pbr = i;
|
|
|
|
- *br = j;
|
|
|
|
- return;
|
|
|
|
|
|
+ int scale_needed, scale, minscale = INT_MAX;
|
|
|
|
+ int i, j;
|
|
|
|
+
|
|
|
|
+ scale_needed = clkrate / speed_hz;
|
|
|
|
+ if (clkrate % speed_hz)
|
|
|
|
+ scale_needed++;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < ARRAY_SIZE(brs); i++)
|
|
|
|
+ for (j = 0; j < ARRAY_SIZE(pbr_tbl); j++) {
|
|
|
|
+ scale = brs[i] * pbr_tbl[j];
|
|
|
|
+ if (scale >= scale_needed) {
|
|
|
|
+ if (scale < minscale) {
|
|
|
|
+ minscale = scale;
|
|
|
|
+ *br = i;
|
|
|
|
+ *pbr = j;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- pr_warn("Can not find valid baud rate,speed_hz is %d,clkrate is %ld\
|
|
|
|
- ,we use the max prescaler value.\n", speed_hz, clkrate);
|
|
|
|
- *pbr = ARRAY_SIZE(pbr_tbl) - 1;
|
|
|
|
- *br = ARRAY_SIZE(brs) - 1;
|
|
|
|
|
|
+ if (minscale == INT_MAX) {
|
|
|
|
+ pr_warn("Can not find valid baud rate,speed_hz is %d,clkrate is %ld, we use the max prescaler value.\n",
|
|
|
|
+ speed_hz, clkrate);
|
|
|
|
+ *pbr = ARRAY_SIZE(pbr_tbl) - 1;
|
|
|
|
+ *br = ARRAY_SIZE(brs) - 1;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
static int dspi_transfer_write(struct fsl_dspi *dspi)
|
|
static int dspi_transfer_write(struct fsl_dspi *dspi)
|