aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/spi/spi-rockchip.txt4
-rw-r--r--drivers/spi/spi-rockchip.c21
2 files changed, 25 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/spi/spi-rockchip.txt b/Documentation/devicetree/bindings/spi/spi-rockchip.txt
index 467dec441c62..0c491bda4c65 100644
--- a/Documentation/devicetree/bindings/spi/spi-rockchip.txt
+++ b/Documentation/devicetree/bindings/spi/spi-rockchip.txt
@@ -24,6 +24,9 @@ Optional Properties:
24- dmas: DMA specifiers for tx and rx dma. See the DMA client binding, 24- dmas: DMA specifiers for tx and rx dma. See the DMA client binding,
25 Documentation/devicetree/bindings/dma/dma.txt 25 Documentation/devicetree/bindings/dma/dma.txt
26- dma-names: DMA request names should include "tx" and "rx" if present. 26- dma-names: DMA request names should include "tx" and "rx" if present.
27- rx-sample-delay-ns: nanoseconds to delay after the SCLK edge before sampling
28 Rx data (may need to be fine tuned for high capacitance lines).
29 No delay (0) by default.
27 30
28 31
29Example: 32Example:
@@ -33,6 +36,7 @@ Example:
33 reg = <0xff110000 0x1000>; 36 reg = <0xff110000 0x1000>;
34 dmas = <&pdma1 11>, <&pdma1 12>; 37 dmas = <&pdma1 11>, <&pdma1 12>;
35 dma-names = "tx", "rx"; 38 dma-names = "tx", "rx";
39 rx-sample-delay-ns = <10>;
36 #address-cells = <1>; 40 #address-cells = <1>;
37 #size-cells = <0>; 41 #size-cells = <0>;
38 interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>; 42 interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c
index 25003c408c92..f65384b3417f 100644
--- a/drivers/spi/spi-rockchip.c
+++ b/drivers/spi/spi-rockchip.c
@@ -179,6 +179,7 @@ struct rockchip_spi {
179 u8 tmode; 179 u8 tmode;
180 u8 bpw; 180 u8 bpw;
181 u8 n_bytes; 181 u8 n_bytes;
182 u8 rsd_nsecs;
182 unsigned len; 183 unsigned len;
183 u32 speed; 184 u32 speed;
184 185
@@ -499,6 +500,7 @@ static void rockchip_spi_config(struct rockchip_spi *rs)
499{ 500{
500 u32 div = 0; 501 u32 div = 0;
501 u32 dmacr = 0; 502 u32 dmacr = 0;
503 int rsd = 0;
502 504
503 u32 cr0 = (CR0_BHT_8BIT << CR0_BHT_OFFSET) 505 u32 cr0 = (CR0_BHT_8BIT << CR0_BHT_OFFSET)
504 | (CR0_SSD_ONE << CR0_SSD_OFFSET); 506 | (CR0_SSD_ONE << CR0_SSD_OFFSET);
@@ -528,6 +530,20 @@ static void rockchip_spi_config(struct rockchip_spi *rs)
528 div = max_t(u32, rs->max_freq / rs->speed, 1); 530 div = max_t(u32, rs->max_freq / rs->speed, 1);
529 div = (div + 1) & 0xfffe; 531 div = (div + 1) & 0xfffe;
530 532
533 /* Rx sample delay is expressed in parent clock cycles (max 3) */
534 rsd = DIV_ROUND_CLOSEST(rs->rsd_nsecs * (rs->max_freq >> 8),
535 1000000000 >> 8);
536 if (!rsd && rs->rsd_nsecs) {
537 pr_warn_once("rockchip-spi: %u Hz are too slow to express %u ns delay\n",
538 rs->max_freq, rs->rsd_nsecs);
539 } else if (rsd > 3) {
540 rsd = 3;
541 pr_warn_once("rockchip-spi: %u Hz are too fast to express %u ns delay, clamping at %u ns\n",
542 rs->max_freq, rs->rsd_nsecs,
543 rsd * 1000000000U / rs->max_freq);
544 }
545 cr0 |= rsd << CR0_RSD_OFFSET;
546
531 writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0); 547 writel_relaxed(cr0, rs->regs + ROCKCHIP_SPI_CTRLR0);
532 548
533 writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1); 549 writel_relaxed(rs->len - 1, rs->regs + ROCKCHIP_SPI_CTRLR1);
@@ -620,6 +636,7 @@ static int rockchip_spi_probe(struct platform_device *pdev)
620 struct rockchip_spi *rs; 636 struct rockchip_spi *rs;
621 struct spi_master *master; 637 struct spi_master *master;
622 struct resource *mem; 638 struct resource *mem;
639 u32 rsd_nsecs;
623 640
624 master = spi_alloc_master(&pdev->dev, sizeof(struct rockchip_spi)); 641 master = spi_alloc_master(&pdev->dev, sizeof(struct rockchip_spi));
625 if (!master) 642 if (!master)
@@ -671,6 +688,10 @@ static int rockchip_spi_probe(struct platform_device *pdev)
671 rs->dev = &pdev->dev; 688 rs->dev = &pdev->dev;
672 rs->max_freq = clk_get_rate(rs->spiclk); 689 rs->max_freq = clk_get_rate(rs->spiclk);
673 690
691 if (!of_property_read_u32(pdev->dev.of_node, "rx-sample-delay-ns",
692 &rsd_nsecs))
693 rs->rsd_nsecs = rsd_nsecs;
694
674 rs->fifo_len = get_fifo_len(rs); 695 rs->fifo_len = get_fifo_len(rs);
675 if (!rs->fifo_len) { 696 if (!rs->fifo_len) {
676 dev_err(&pdev->dev, "Failed to get fifo length\n"); 697 dev_err(&pdev->dev, "Failed to get fifo length\n");