All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 3/5] spi: add functions ..._transfer_iobufs_n()
@ 2020-01-14 16:22 Laurentiu-Cristian Duca
  0 siblings, 0 replies; only message in thread
From: Laurentiu-Cristian Duca @ 2020-01-14 16:22 UTC (permalink / raw)
  To: xenomai

From: Laurentiu-Cristian Duca <laurentiu.duca@gmail.com>

spi-bcm2835.c, spi-sun6i.c:
In order to support SPI_RTIOC_TRANSFER_N ioctl option
add functions bcm2835_transfer_iobufs_n() and sun6i_transfer_iobufs_n()
which are similar to ..._transfer_iobufs(),
but allow user specified len for spi transfer.

Signed-off-by: Laurentiu-Cristian Duca <laurentiu.duca@gmail.com>
---
 kernel/drivers/spi/spi-bcm2835.c | 19 +++++++++++++++++++
 kernel/drivers/spi/spi-sun6i.c   | 19 +++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/kernel/drivers/spi/spi-bcm2835.c b/kernel/drivers/spi/spi-bcm2835.c
index e4a95d081..fab6f6e77 100644
--- a/kernel/drivers/spi/spi-bcm2835.c
+++ b/kernel/drivers/spi/spi-bcm2835.c
@@ -318,6 +318,24 @@ static int bcm2835_transfer_iobufs(struct
rtdm_spi_remote_slave *slave)
 	return do_transfer_irq(slave);
 }

+static int bcm2835_transfer_iobufs_n(struct rtdm_spi_remote_slave *slave,
+										 int len)
+{
+	struct spi_master_bcm2835 *spim = to_master_bcm2835(slave);
+	struct spi_slave_bcm2835 *bcm = to_slave_bcm2835(slave);
+
+	if ((bcm->io_len == 0) ||
+		(len <= 0) || (len > (bcm->io_len / 2)))
+		return -EINVAL;
+
+	spim->tx_len = len;
+	spim->rx_len = len;
+	spim->tx_buf = bcm->io_virt + bcm->io_len / 2;
+	spim->rx_buf = bcm->io_virt;
+
+	return do_transfer_irq(slave);
+}
+
 static ssize_t bcm2835_read(struct rtdm_spi_remote_slave *slave,
 			    void *rx, size_t len)
 {
@@ -549,6 +567,7 @@ static struct rtdm_spi_master_ops bcm2835_master_ops = {
 	.mmap_iobufs = bcm2835_mmap_iobufs,
 	.mmap_release = bcm2835_mmap_release,
 	.transfer_iobufs = bcm2835_transfer_iobufs,
+	.transfer_iobufs_n = bcm2835_transfer_iobufs_n,
 	.write = bcm2835_write,
 	.read = bcm2835_read,
 	.attach_slave = bcm2835_attach_slave,
diff --git a/kernel/drivers/spi/spi-sun6i.c b/kernel/drivers/spi/spi-sun6i.c
index ec08c98d8..940c98b31 100644
--- a/kernel/drivers/spi/spi-sun6i.c
+++ b/kernel/drivers/spi/spi-sun6i.c
@@ -355,6 +355,24 @@ static int sun6i_transfer_iobufs(struct
rtdm_spi_remote_slave *slave)
 	return do_transfer_irq(slave);
 }

+static int sun6i_transfer_iobufs_n(struct rtdm_spi_remote_slave *slave,
+								 int len)
+{
+	struct spi_master_sun6i *spim = to_master_sun6i(slave);
+	struct spi_slave_sun6i *sun6i = to_slave_sun6i(slave);
+
+	if ((sun6i->io_len == 0) ||
+		(len <= 0) || (len > (sun6i->io_len / 2)))
+		return -EINVAL;
+
+	spim->tx_len = len;
+	spim->rx_len = len;
+	spim->tx_buf = sun6i->io_virt + sun6i->io_len / 2;
+	spim->rx_buf = sun6i->io_virt;
+
+	return do_transfer_irq(slave);
+}
+
 static ssize_t sun6i_read(struct rtdm_spi_remote_slave *slave,
 			  void *rx, size_t len)
 {
@@ -480,6 +498,7 @@ static struct rtdm_spi_master_ops sun6i_master_ops = {
 	.mmap_iobufs = sun6i_mmap_iobufs,
 	.mmap_release = sun6i_mmap_release,
 	.transfer_iobufs = sun6i_transfer_iobufs,
+	.transfer_iobufs_n = sun6i_transfer_iobufs_n,
 	.write = sun6i_write,
 	.read = sun6i_read,
 	.attach_slave = sun6i_attach_slave,
-- 
2.17.1


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2020-01-14 16:22 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-14 16:22 [PATCH 3/5] spi: add functions ..._transfer_iobufs_n() Laurentiu-Cristian Duca

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.