NFC: NCI: allow spi driver to choose transfer clock
authorVincent Cuissard <cuissard@marvell.com>
Mon, 26 Oct 2015 09:27:43 +0000 (10:27 +0100)
committerSamuel Ortiz <sameo@linux.intel.com>
Tue, 27 Oct 2015 03:23:34 +0000 (04:23 +0100)
In some cases low level drivers might want to update the
SPI transfer clock (e.g. during firmware download).

This patch adds this support. Without any modification the
driver will use the default SPI clock (from pdata or device tree).

Signed-off-by: Vincent Cuissard <cuissard@marvell.com>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
include/net/nfc/nci_core.h
net/nfc/nci/spi.c

index 77880bdf93a8926bef86ce14ea136b3cb95360f1..5a1572a34c499bb0915663f7ee2cd82eb7a7271e 100644 (file)
@@ -394,6 +394,12 @@ struct nci_spi {
 
        unsigned int            xfer_udelay;    /* microseconds delay between
                                                  transactions */
+
+       unsigned int            xfer_speed_hz; /*
+                                               * SPI clock frequency
+                                               * 0 => default clock
+                                               */
+
        u8                      acknowledge_mode;
 
        struct completion       req_completion;
index 25153d0e33cf7fdf3265356b2c5d45b3734f7eb3..d904cd2f14423ce108e9d4bfc28b22be353d93f2 100644 (file)
@@ -58,6 +58,7 @@ static int __nci_spi_send(struct nci_spi *nspi, struct sk_buff *skb,
        }
        t.cs_change = cs_change;
        t.delay_usecs = nspi->xfer_udelay;
+       t.speed_hz = nspi->xfer_speed_hz;
 
        spi_message_init(&m);
        spi_message_add_tail(&t, &m);
@@ -144,7 +145,8 @@ struct nci_spi *nci_spi_allocate_spi(struct spi_device *spi,
 
        nspi->acknowledge_mode = acknowledge_mode;
        nspi->xfer_udelay = delay;
-
+       /* Use controller max SPI speed by default */
+       nspi->xfer_speed_hz = 0;
        nspi->spi = spi;
        nspi->ndev = ndev;
        init_completion(&nspi->req_completion);
@@ -197,12 +199,14 @@ static struct sk_buff *__nci_spi_read(struct nci_spi *nspi)
        tx.tx_buf = req;
        tx.len = 2;
        tx.cs_change = 0;
+       tx.speed_hz = nspi->xfer_speed_hz;
        spi_message_add_tail(&tx, &m);
 
        memset(&rx, 0, sizeof(struct spi_transfer));
        rx.rx_buf = resp_hdr;
        rx.len = 2;
        rx.cs_change = 1;
+       rx.speed_hz = nspi->xfer_speed_hz;
        spi_message_add_tail(&rx, &m);
 
        ret = spi_sync(nspi->spi, &m);
@@ -226,6 +230,7 @@ static struct sk_buff *__nci_spi_read(struct nci_spi *nspi)
        rx.len = rx_len;
        rx.cs_change = 0;
        rx.delay_usecs = nspi->xfer_udelay;
+       rx.speed_hz = nspi->xfer_speed_hz;
        spi_message_add_tail(&rx, &m);
 
        ret = spi_sync(nspi->spi, &m);