.. | .. |
---|
975 | 975 | static int dspi_setup(struct spi_device *spi) |
---|
976 | 976 | { |
---|
977 | 977 | struct fsl_dspi *dspi = spi_controller_get_devdata(spi->controller); |
---|
| 978 | + u32 period_ns = DIV_ROUND_UP(NSEC_PER_SEC, spi->max_speed_hz); |
---|
978 | 979 | unsigned char br = 0, pbr = 0, pcssck = 0, cssck = 0; |
---|
| 980 | + u32 quarter_period_ns = DIV_ROUND_UP(period_ns, 4); |
---|
979 | 981 | u32 cs_sck_delay = 0, sck_cs_delay = 0; |
---|
980 | 982 | struct fsl_dspi_platform_data *pdata; |
---|
981 | 983 | unsigned char pasc = 0, asc = 0; |
---|
.. | .. |
---|
1003 | 1005 | sck_cs_delay = pdata->sck_cs_delay; |
---|
1004 | 1006 | } |
---|
1005 | 1007 | |
---|
| 1008 | + /* Since tCSC and tASC apply to continuous transfers too, avoid SCK |
---|
| 1009 | + * glitches of half a cycle by never allowing tCSC + tASC to go below |
---|
| 1010 | + * half a SCK period. |
---|
| 1011 | + */ |
---|
| 1012 | + if (cs_sck_delay < quarter_period_ns) |
---|
| 1013 | + cs_sck_delay = quarter_period_ns; |
---|
| 1014 | + if (sck_cs_delay < quarter_period_ns) |
---|
| 1015 | + sck_cs_delay = quarter_period_ns; |
---|
| 1016 | + |
---|
| 1017 | + dev_dbg(&spi->dev, |
---|
| 1018 | + "DSPI controller timing params: CS-to-SCK delay %u ns, SCK-to-CS delay %u ns\n", |
---|
| 1019 | + cs_sck_delay, sck_cs_delay); |
---|
| 1020 | + |
---|
1006 | 1021 | clkrate = clk_get_rate(dspi->clk); |
---|
1007 | 1022 | hz_to_spi_baud(&pbr, &br, spi->max_speed_hz, clkrate); |
---|
1008 | 1023 | |
---|