Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1298228 > unrolled thread
| Started by | Marcus Weseloh <mweseloh42@gmail.com> |
|---|---|
| First post | 2015-12-26 17:00 +0100 |
| Last post | 2015-12-28 03:50 +0100 |
| Articles | 3 — 2 participants |
Back to article view | Back to linux.kernel
[PATCH v6 0/3] spi: dts: sun4i: Add support for wait time between word transmissions Marcus Weseloh <mweseloh42@gmail.com> - 2015-12-26 17:00 +0100
[PATCH v6 3/3] spi: sun4i: Add support for wait time between word transmissions Marcus Weseloh <mweseloh42@gmail.com> - 2015-12-26 17:00 +0100
Re: [PATCH v6 3/3] spi: sun4i: Add support for wait time between word transmissions Maxime Ripard <maxime.ripard@free-electrons.com> - 2015-12-28 03:50 +0100
| From | Marcus Weseloh <mweseloh42@gmail.com> |
|---|---|
| Date | 2015-12-26 17:00 +0100 |
| Subject | [PATCH v6 0/3] spi: dts: sun4i: Add support for wait time between word transmissions |
| Message-ID | <qJZqa-2N6-17@gated-at.bofh.it> |
Hi all,
This is the sixth version of the patch set that adds a new property
"spi-word-wait-ns" to the spi-bus binding to allow SPI slave devices to set
a wait time between the transmission of words. It modifies the spi_device
struct and slave device probing to read and store the new property.
Also modifies the sun4i SPI master driver to make use of the new property.
This specific SPI controller needs 3 clock cycles to set up the delay, which
makes the minimum non-zero wait time on this hardware 4 clock cycles.
It now also fixes multiple problems in the sun4i clock calculation:
- The A10/A20 datasheet contains the formula AHB_CLK / (2^(n+1)) to calculate
SPI_CLK from CDR1, but this formula is wrong. The actual formula -
determined by analyzing the actual waveforms on a A20 SoC - is AHB_CLK /
(2^n).
- The divisor calculations for CDR1 and CDR2 both rounded to the nearest
integer. This could lead to a transfer speed that is higher than the
requested speed. This patch changes both calculations to always round down.
- The mclk frequency was only ever increased, never decreased. This could
lead to unpredictable transfer speeds, depending on the order in which
transfers with different speeds where serviced by the SPI driver.
Changes from v1:
* renamed the property for more clarity
* wait time is set in nanoseconds instead of number of clock cycles
* transparently handle the 3 setup clock cycles
Changes from v2:
* fixed typo in comment
* moved parameter to spi-bus binding, dropping the vendor prefix
* changed commit summary and description to reflect the changes
Changes from v3:
* remove reference to "hardware" in comments and description, as the wait
time could also be implemented in software
* read and set property value in spi core
Changes from v4:
* log with dev_dbg instead of dev_info
* split patch into two separate ones for SPI-core and sun4i parts
Changes from v5:
* Add Maxime's Reviewed-by and Rob's Acked-by to the SPI core patch
* Add patch to fix clock calculation
* Use actual SPI speed instead of tfr->speed_hz for wait time calculation
Marcus Weseloh (3):
spi: dts: Add new device property to specifcy a wait time between word
transmissions
spi: sun4i: Fix clock calculations to be predictable and never exceed
the requested rate
spi: sun4i: Add support for wait time between word transmissions
Documentation/devicetree/bindings/spi/spi-bus.txt | 2 +
drivers/spi/spi-sun4i.c | 51 ++++++++++++++++++-----
drivers/spi/spi.c | 2 +
include/linux/spi/spi.h | 2 +
4 files changed, 46 insertions(+), 11 deletions(-)
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | Marcus Weseloh <mweseloh42@gmail.com> |
|---|---|
| Date | 2015-12-26 17:00 +0100 |
| Subject | [PATCH v6 3/3] spi: sun4i: Add support for wait time between word transmissions |
| Message-ID | <qJZqa-2N6-29@gated-at.bofh.it> |
| In reply to | #1298228 |
Modifies the sun4i SPI master driver to make use of the
"spi-word-wait-ns" property. This specific SPI controller needs 3 clock
cycles to set up the delay, which makes the minimum non-zero wait time
on this hardware 4 clock cycles.
Signed-off-by: Marcus Weseloh <mweseloh42@gmail.com>
---
drivers/spi/spi-sun4i.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/drivers/spi/spi-sun4i.c b/drivers/spi/spi-sun4i.c
index d67e142..4d6f77c 100644
--- a/drivers/spi/spi-sun4i.c
+++ b/drivers/spi/spi-sun4i.c
@@ -176,6 +176,9 @@ static int sun4i_spi_transfer_one(struct spi_master *master,
unsigned int tx_len = 0;
int ret = 0;
u32 reg;
+ int wait_clk = 0;
+ int clk_ns = 0;
+ unsigned int speed_hz;
/* We don't support transfer larger than the FIFO */
if (tfr->len > SUN4I_FIFO_DEPTH)
@@ -260,13 +263,34 @@ static int sun4i_spi_transfer_one(struct spi_master *master,
div = DIV_ROUND_UP(mclk_rate, 2 * tfr->speed_hz) - 1;
if (div <= SUN4I_CLK_CTL_CDR2_MASK) {
reg = SUN4I_CLK_CTL_CDR2(div) | SUN4I_CLK_CTL_DRS;
+ speed_hz = mclk_rate / (2 * (div + 1));
} else {
div = ilog2(roundup_pow_of_two(mclk_rate / tfr->speed_hz));
reg = SUN4I_CLK_CTL_CDR1(div);
+ speed_hz = mclk_rate / (1 << div);
}
sun4i_spi_write(sspi, SUN4I_CLK_CTL_REG, reg);
+ /*
+ * Setup wait time between words.
+ *
+ * Wait time is set in SPI_CLK cycles. The SPI hardware needs 3
+ * additional cycles to setup the wait counter, so the minimum delay
+ * time is 4 cycles.
+ */
+ if (spi->word_wait_ns) {
+ clk_ns = DIV_ROUND_UP(1000000000, speed_hz);
+ wait_clk = DIV_ROUND_UP(spi->word_wait_ns, clk_ns) - 3;
+ if (wait_clk < 1) {
+ wait_clk = 1;
+ dev_dbg(&spi->dev,
+ "using minimum of 4 word wait cycles (%uns)",
+ 4 * clk_ns);
+ }
+ }
+ sun4i_spi_write(sspi, SUN4I_WAIT_REG, (u16)wait_clk);
+
/* Setup the transfer now... */
if (sspi->tx_buf)
tx_len = tfr->len;
--
1.9.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Maxime Ripard <maxime.ripard@free-electrons.com> |
|---|---|
| Date | 2015-12-28 03:50 +0100 |
| Subject | Re: [PATCH v6 3/3] spi: sun4i: Add support for wait time between word transmissions |
| Message-ID | <qKw3m-3Io-807@gated-at.bofh.it> |
| In reply to | #1298229 |
[Multipart message — attachments visible in raw view] — view raw
On Sat, Dec 26, 2015 at 04:53:06PM +0100, Marcus Weseloh wrote: > Modifies the sun4i SPI master driver to make use of the > "spi-word-wait-ns" property. This specific SPI controller needs 3 clock > cycles to set up the delay, which makes the minimum non-zero wait time > on this hardware 4 clock cycles. > > Signed-off-by: Marcus Weseloh <mweseloh42@gmail.com> Acked-by: Maxime Ripard <maxime.ripard@free-electrons.com> Thanks! Maxime -- Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web