| .. | .. |
|---|
| 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 | |
|---|