All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/8] spi: Add file i/o to spidev_test
@ 2015-11-17 15:24 ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

Add to spidev_test, the ability to read from and write to a file.
Clean up code along the way.
As I finished, I found that a request has been made to move
spidev_test from Documentation to tools, so I did that as well.

Joshua Clayton (8):
  Documentation/spi/spidev_test.c: use one rx buffer
  Documentation/spi/spidev_test.c: clean up input_tx
  Documentation/spi/spidev_test.c: accept input from a file
  Documentation/spi/spidev_test.c: output to a file
  Documentation/spi/spidev_test.c: check error
  Documentation/spi/spidev_test.c: fix whitespace
  tools/Makefile: minor whitespace cleanup
  spi: Move spi code from Documentation to tools

 Documentation/Makefile          |   2 +-
 Documentation/spi/Makefile      |   8 -
 Documentation/spi/spidev_fdx.c  | 158 -----------------
 Documentation/spi/spidev_test.c | 318 ---------------------------------
 tools/Makefile                  |  43 ++++-
 tools/spi/Makefile              |   4 +
 tools/spi/spidev_fdx.c          | 158 +++++++++++++++++
 tools/spi/spidev_test.c         | 385 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 582 insertions(+), 494 deletions(-)
 delete mode 100644 Documentation/spi/Makefile
 delete mode 100644 Documentation/spi/spidev_fdx.c
 delete mode 100644 Documentation/spi/spidev_test.c
 create mode 100644 tools/spi/Makefile
 create mode 100644 tools/spi/spidev_fdx.c
 create mode 100644 tools/spi/spidev_test.c

-- 
2.5.0


^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 0/8] spi: Add file i/o to spidev_test
@ 2015-11-17 15:24 ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Joshua Clayton

Add to spidev_test, the ability to read from and write to a file.
Clean up code along the way.
As I finished, I found that a request has been made to move
spidev_test from Documentation to tools, so I did that as well.

Joshua Clayton (8):
  Documentation/spi/spidev_test.c: use one rx buffer
  Documentation/spi/spidev_test.c: clean up input_tx
  Documentation/spi/spidev_test.c: accept input from a file
  Documentation/spi/spidev_test.c: output to a file
  Documentation/spi/spidev_test.c: check error
  Documentation/spi/spidev_test.c: fix whitespace
  tools/Makefile: minor whitespace cleanup
  spi: Move spi code from Documentation to tools

 Documentation/Makefile          |   2 +-
 Documentation/spi/Makefile      |   8 -
 Documentation/spi/spidev_fdx.c  | 158 -----------------
 Documentation/spi/spidev_test.c | 318 ---------------------------------
 tools/Makefile                  |  43 ++++-
 tools/spi/Makefile              |   4 +
 tools/spi/spidev_fdx.c          | 158 +++++++++++++++++
 tools/spi/spidev_test.c         | 385 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 582 insertions(+), 494 deletions(-)
 delete mode 100644 Documentation/spi/Makefile
 delete mode 100644 Documentation/spi/spidev_fdx.c
 delete mode 100644 Documentation/spi/spidev_test.c
 create mode 100644 tools/spi/Makefile
 create mode 100644 tools/spi/spidev_fdx.c
 create mode 100644 tools/spi/spidev_test.c

-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 1/8] Documentation/spi/spidev_test.c: use one rx buffer
  2015-11-17 15:24 ` Joshua Clayton
  (?)
@ 2015-11-17 15:24 ` Joshua Clayton
  2015-11-17 17:41     ` Mark Brown
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

default_rx and rx are needlessly different.
Use one buffer, local to transmit()

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/spi/spidev_test.c | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index 135b3f5..dfe8f47 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -46,7 +46,6 @@ uint8_t default_tx[] = {
 	0xF0, 0x0D,
 };
 
-uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, };
 char *input_tx;
 
 static void hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
@@ -100,10 +99,10 @@ static int unescape(char *_dst, char *_src, size_t len)
 	return ret;
 }
 
-static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
+static void transfer(int fd, uint8_t const *tx, size_t len)
 {
 	int ret;
-
+	uint8_t *rx = malloc(len);
 	struct spi_ioc_transfer tr = {
 		.tx_buf = (unsigned long)tx,
 		.rx_buf = (unsigned long)rx,
@@ -135,6 +134,7 @@ static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 	if (verbose)
 		hex_dump(tx, len, 32, "TX");
 	hex_dump(rx, len, 32, "RX");
+	free(rx);
 }
 
 static void print_usage(const char *prog)
@@ -254,7 +254,6 @@ int main(int argc, char *argv[])
 	int ret = 0;
 	int fd;
 	uint8_t *tx;
-	uint8_t *rx;
 	int size;
 
 	parse_opts(argc, argv);
@@ -303,13 +302,11 @@ int main(int argc, char *argv[])
 	if (input_tx) {
 		size = strlen(input_tx+1);
 		tx = malloc(size);
-		rx = malloc(size);
 		size = unescape((char *)tx, input_tx, size);
-		transfer(fd, tx, rx, size);
-		free(rx);
+		transfer(fd, tx, size);
 		free(tx);
 	} else {
-		transfer(fd, default_tx, default_rx, sizeof(default_tx));
+		transfer(fd, default_tx, sizeof(default_tx));
 	}
 
 	close(fd);
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
  2015-11-17 15:24 ` Joshua Clayton
  (?)
  (?)
@ 2015-11-17 15:24 ` Joshua Clayton
  2015-11-17 17:43   ` Mark Brown
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

Put input from string into its own function.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/spi/spidev_test.c | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index dfe8f47..1ed9110 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -249,12 +249,20 @@ static void parse_opts(int argc, char *argv[])
 	}
 }
 
+static void transfer_escaped_string(int fd, char *str)
+{
+	size_t size = strlen(str + 1);
+	uint8_t *tx = malloc(size);
+
+	size = unescape((char *)tx, str, size);
+	transfer(fd, tx, size);
+	free(tx);
+}
+
 int main(int argc, char *argv[])
 {
 	int ret = 0;
 	int fd;
-	uint8_t *tx;
-	int size;
 
 	parse_opts(argc, argv);
 
@@ -299,15 +307,10 @@ int main(int argc, char *argv[])
 	printf("bits per word: %d\n", bits);
 	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 
-	if (input_tx) {
-		size = strlen(input_tx+1);
-		tx = malloc(size);
-		size = unescape((char *)tx, input_tx, size);
-		transfer(fd, tx, size);
-		free(tx);
-	} else {
+	if (input_tx)
+		transfer_escaped_string(fd, input_tx);
+	else
 		transfer(fd, default_tx, sizeof(default_tx));
-	}
 
 	close(fd);
 
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file
  2015-11-17 15:24 ` Joshua Clayton
                   ` (2 preceding siblings ...)
  (?)
@ 2015-11-17 15:24 ` Joshua Clayton
  2015-11-17 18:26   ` Anton Bondarenko
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

Add input file support to facilitate testing larger data.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/spi/spidev_test.c | 42 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index 1ed9110..ef812ad 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -19,6 +19,7 @@
 #include <getopt.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
+#include <sys/stat.h>
 #include <linux/types.h>
 #include <linux/spi/spidev.h>
 
@@ -33,6 +34,7 @@ static void pabort(const char *s)
 static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
+static char *input_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -144,6 +146,7 @@ static void print_usage(const char *prog)
 	     "  -s --speed    max speed (Hz)\n"
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
+	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -167,6 +170,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "speed",   1, 0, 's' },
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
+			{ "input",   1, 0, 'i' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -182,7 +186,8 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
+		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+				lopts, NULL);
 
 		if (c == -1)
 			break;
@@ -200,6 +205,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'b':
 			bits = atoi(optarg);
 			break;
+		case 'i':
+			input_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
@@ -259,6 +267,33 @@ static void transfer_escaped_string(int fd, char *str)
 	free(tx);
 }
 
+static void transfer_file(int fd, char *filename)
+{
+	ssize_t bytes;
+	struct stat sb;
+	int tx_fd;
+	uint8_t *tx;
+
+	if (stat(filename, &sb) == -1)
+		pabort("can't stat input file");
+
+	if (sb.st_size > 4096)
+		pabort("input file exceeds spidev's 4k limit");
+
+	tx_fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		pabort("can't open input file");
+
+	tx = malloc(sb.st_size);
+	bytes = read(tx_fd, tx, sb.st_size);
+	if (bytes != sb.st_size)
+		pabort("failed to read input file");
+
+	transfer(fd, tx, sb.st_size);
+	free(tx);
+	close(tx_fd);
+}
+
 int main(int argc, char *argv[])
 {
 	int ret = 0;
@@ -307,8 +342,13 @@ int main(int argc, char *argv[])
 	printf("bits per word: %d\n", bits);
 	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 
+	if (input_tx && input_file)
+		pabort("only one of -p and --input may be selected");
+
 	if (input_tx)
 		transfer_escaped_string(fd, input_tx);
+	else if (input_file)
+		transfer_file(fd, input_file);
 	else
 		transfer(fd, default_tx, sizeof(default_tx));
 
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 4/8] Documentation/spi/spidev_test.c: output to a file
@ 2015-11-17 15:24   ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

For testing of larger data transfers, output unmodified data
directly to a file.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/spi/spidev_test.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index ef812ad..273f667 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -35,6 +35,7 @@ static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
 static char *input_file;
+static char *output_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -104,6 +105,7 @@ static int unescape(char *_dst, char *_src, size_t len)
 static void transfer(int fd, uint8_t const *tx, size_t len)
 {
 	int ret;
+	int out_fd;
 	uint8_t *rx = malloc(len);
 	struct spi_ioc_transfer tr = {
 		.tx_buf = (unsigned long)tx,
@@ -135,7 +137,22 @@ static void transfer(int fd, uint8_t const *tx, size_t len)
 
 	if (verbose)
 		hex_dump(tx, len, 32, "TX");
-	hex_dump(rx, len, 32, "RX");
+
+	if (output_file) {
+		out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+		if (out_fd < 0)
+			pabort("could not open output file");
+
+		ret = write(out_fd, rx, len);
+		if (ret != len)
+			pabort("not all bytes written to utput file");
+
+		close(out_fd);
+	}
+
+	if (verbose || !output_file)
+		hex_dump(rx, len, 32, "RX");
+
 	free(rx);
 }
 
@@ -147,6 +164,7 @@ static void print_usage(const char *prog)
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
+	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -171,6 +189,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
 			{ "input",   1, 0, 'i' },
+			{ "output",  1, 0, 'o' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -186,7 +205,7 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+		c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v",
 				lopts, NULL);
 
 		if (c == -1)
@@ -208,6 +227,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'i':
 			input_file = optarg;
 			break;
+		case 'o':
+			output_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 4/8] Documentation/spi/spidev_test.c: output to a file
@ 2015-11-17 15:24   ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Joshua Clayton

For testing of larger data transfers, output unmodified data
directly to a file.

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 Documentation/spi/spidev_test.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index ef812ad..273f667 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -35,6 +35,7 @@ static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
 static char *input_file;
+static char *output_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -104,6 +105,7 @@ static int unescape(char *_dst, char *_src, size_t len)
 static void transfer(int fd, uint8_t const *tx, size_t len)
 {
 	int ret;
+	int out_fd;
 	uint8_t *rx = malloc(len);
 	struct spi_ioc_transfer tr = {
 		.tx_buf = (unsigned long)tx,
@@ -135,7 +137,22 @@ static void transfer(int fd, uint8_t const *tx, size_t len)
 
 	if (verbose)
 		hex_dump(tx, len, 32, "TX");
-	hex_dump(rx, len, 32, "RX");
+
+	if (output_file) {
+		out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+		if (out_fd < 0)
+			pabort("could not open output file");
+
+		ret = write(out_fd, rx, len);
+		if (ret != len)
+			pabort("not all bytes written to utput file");
+
+		close(out_fd);
+	}
+
+	if (verbose || !output_file)
+		hex_dump(rx, len, 32, "RX");
+
 	free(rx);
 }
 
@@ -147,6 +164,7 @@ static void print_usage(const char *prog)
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
+	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -171,6 +189,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
 			{ "input",   1, 0, 'i' },
+			{ "output",  1, 0, 'o' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -186,7 +205,7 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+		c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v",
 				lopts, NULL);
 
 		if (c == -1)
@@ -208,6 +227,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'i':
 			input_file = optarg;
 			break;
+		case 'o':
+			output_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 5/8] Documentation/spi/spidev_test.c: check error
@ 2015-11-17 15:24   ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

Check the result of sscanf to verify a result was found.
report and error and abort if pattern was not found.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/spi/spidev_test.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index 273f667..2ff5fe8 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -85,13 +85,17 @@ static void hex_dump(const void *src, size_t length, size_t line_size, char *pre
 static int unescape(char *_dst, char *_src, size_t len)
 {
 	int ret = 0;
+	int match;
 	char *src = _src;
 	char *dst = _dst;
 	unsigned int ch;
 
 	while (*src) {
 		if (*src == '\\' && *(src+1) == 'x') {
-			sscanf(src + 2, "%2x", &ch);
+			match = sscanf(src + 2, "%2x", &ch);
+			if (!match)
+				pabort("malformed input string");
+
 			src += 4;
 			*dst++ = (unsigned char)ch;
 		} else {
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 5/8] Documentation/spi/spidev_test.c: check error
@ 2015-11-17 15:24   ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA, Joshua Clayton

Check the result of sscanf to verify a result was found.
report and error and abort if pattern was not found.

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 Documentation/spi/spidev_test.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index 273f667..2ff5fe8 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -85,13 +85,17 @@ static void hex_dump(const void *src, size_t length, size_t line_size, char *pre
 static int unescape(char *_dst, char *_src, size_t len)
 {
 	int ret = 0;
+	int match;
 	char *src = _src;
 	char *dst = _dst;
 	unsigned int ch;
 
 	while (*src) {
 		if (*src == '\\' && *(src+1) == 'x') {
-			sscanf(src + 2, "%2x", &ch);
+			match = sscanf(src + 2, "%2x", &ch);
+			if (!match)
+				pabort("malformed input string");
+
 			src += 4;
 			*dst++ = (unsigned char)ch;
 		} else {
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 6/8] Documentation/spi/spidev_test.c: fix whitespace
  2015-11-17 15:24 ` Joshua Clayton
                   ` (5 preceding siblings ...)
  (?)
@ 2015-11-17 15:24 ` Joshua Clayton
  -1 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/spi/spidev_test.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
index 2ff5fe8..bf6070c 100644
--- a/Documentation/spi/spidev_test.c
+++ b/Documentation/spi/spidev_test.c
@@ -51,7 +51,8 @@ uint8_t default_tx[] = {
 
 char *input_tx;
 
-static void hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
+static void hex_dump(const void *src, size_t length, size_t line_size,
+		     char *prefix)
 {
 	int i = 0;
 	const unsigned char *address = src;
@@ -166,7 +167,7 @@ static void print_usage(const char *prog)
 	puts("  -D --device   device to use (default /dev/spidev1.1)\n"
 	     "  -s --speed    max speed (Hz)\n"
 	     "  -d --delay    delay (usec)\n"
-	     "  -b --bpw      bits per word \n"
+	     "  -b --bpw      bits per word\n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
 	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 7/8] tools/Makefile: minor whitespace cleanup
  2015-11-17 15:24 ` Joshua Clayton
                   ` (6 preceding siblings ...)
  (?)
@ 2015-11-17 15:24 ` Joshua Clayton
  2015-11-17 18:09     ` Mark Brown
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 tools/Makefile | 37 ++++++++++++++++++++++++++++++-------
 1 file changed, 30 insertions(+), 7 deletions(-)

diff --git a/tools/Makefile b/tools/Makefile
index 9a617ad..428fb4d 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -80,10 +80,21 @@ turbostat_install x86_energy_perf_policy_install:
 tmon_install:
 	$(call descend,thermal/$(@:_install=),install)
 
-install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \
-		perf_install selftests_install turbostat_install usb_install \
-		virtio_install vm_install net_install x86_energy_perf_policy_install \
-	tmon
+install: acpi_install \
+		cgroup_install \
+		cpupower_install \
+		hv_install \
+		firewire_install \
+		lguest_install \
+		perf_install \
+		selftests_install \
+		tmon \
+		turbostat_install \
+		usb_install \
+		virtio_install \
+		vm_install \
+		net_install \
+		x86_energy_perf_policy_install
 
 acpi_clean:
 	$(call descend,power/acpi,clean)
@@ -112,8 +123,20 @@ turbostat_clean x86_energy_perf_policy_clean:
 tmon_clean:
 	$(call descend,thermal/tmon,clean)
 
-clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean lguest_clean \
-		perf_clean selftests_clean turbostat_clean usb_clean virtio_clean \
-		vm_clean net_clean x86_energy_perf_policy_clean tmon_clean
+clean: acpi_clean \
+		cgroup_clean \
+		cpupower_clean \
+		hv_clean \
+		firewire_clean \
+		lguest_clean \
+		perf_clean \
+		selftests_clean \
+		tmon_clean \
+		turbostat_clean \
+		usb_clean \
+		virtio_clean \
+		vm_clean \
+		net_clean \
+		x86_energy_perf_policy_clean
 
 .PHONY: FORCE
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH 8/8] spi: Move spi code from Documentation to tools
  2015-11-17 15:24 ` Joshua Clayton
                   ` (7 preceding siblings ...)
  (?)
@ 2015-11-17 15:24 ` Joshua Clayton
  2015-11-17 18:11     ` Mark Brown
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 15:24 UTC (permalink / raw)
  To: Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel,
	linux-spi, Joshua Clayton

Jon Corbet requested this code moved with the last changeset,
https://lkml.org/lkml/2015/3/1/144,
but the patch was not applied because it missed the Makefile.
Moved spidev_test, spidev_fdx and their Makefile infrastructure.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/Makefile          |   2 +-
 Documentation/spi/Makefile      |   8 -
 Documentation/spi/spidev_fdx.c  | 158 -----------------
 Documentation/spi/spidev_test.c | 385 ----------------------------------------
 tools/Makefile                  |   6 +-
 tools/spi/Makefile              |   4 +
 tools/spi/spidev_fdx.c          | 158 +++++++++++++++++
 tools/spi/spidev_test.c         | 385 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 552 insertions(+), 554 deletions(-)
 delete mode 100644 Documentation/spi/Makefile
 delete mode 100644 Documentation/spi/spidev_fdx.c
 delete mode 100644 Documentation/spi/spidev_test.c
 create mode 100644 tools/spi/Makefile
 create mode 100644 tools/spi/spidev_fdx.c
 create mode 100644 tools/spi/spidev_test.c

diff --git a/Documentation/Makefile b/Documentation/Makefile
index 6883a1b..f642cb9 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -1,4 +1,4 @@
 subdir-y := accounting arm auxdisplay blackfin connector \
 	filesystems filesystems ia64 laptops mic misc-devices \
-	networking pcmcia prctl ptp spi timers vDSO video4linux \
+	networking pcmcia prctl ptp timers vDSO video4linux \
 	watchdog
diff --git a/Documentation/spi/Makefile b/Documentation/spi/Makefile
deleted file mode 100644
index efa2558..0000000
--- a/Documentation/spi/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# List of programs to build
-hostprogs-y := spidev_test spidev_fdx
-
-# Tell kbuild to always build the programs
-always := $(hostprogs-y)
-
-HOSTCFLAGS_spidev_test.o += -I$(objtree)/usr/include
-HOSTCFLAGS_spidev_fdx.o += -I$(objtree)/usr/include
diff --git a/Documentation/spi/spidev_fdx.c b/Documentation/spi/spidev_fdx.c
deleted file mode 100644
index 0ea3e51..0000000
--- a/Documentation/spi/spidev_fdx.c
+++ /dev/null
@@ -1,158 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <linux/types.h>
-#include <linux/spi/spidev.h>
-
-
-static int verbose;
-
-static void do_read(int fd, int len)
-{
-	unsigned char	buf[32], *bp;
-	int		status;
-
-	/* read at least 2 bytes, no more than 32 */
-	if (len < 2)
-		len = 2;
-	else if (len > sizeof(buf))
-		len = sizeof(buf);
-	memset(buf, 0, sizeof buf);
-
-	status = read(fd, buf, len);
-	if (status < 0) {
-		perror("read");
-		return;
-	}
-	if (status != len) {
-		fprintf(stderr, "short read\n");
-		return;
-	}
-
-	printf("read(%2d, %2d): %02x %02x,", len, status,
-		buf[0], buf[1]);
-	status -= 2;
-	bp = buf + 2;
-	while (status-- > 0)
-		printf(" %02x", *bp++);
-	printf("\n");
-}
-
-static void do_msg(int fd, int len)
-{
-	struct spi_ioc_transfer	xfer[2];
-	unsigned char		buf[32], *bp;
-	int			status;
-
-	memset(xfer, 0, sizeof xfer);
-	memset(buf, 0, sizeof buf);
-
-	if (len > sizeof buf)
-		len = sizeof buf;
-
-	buf[0] = 0xaa;
-	xfer[0].tx_buf = (unsigned long)buf;
-	xfer[0].len = 1;
-
-	xfer[1].rx_buf = (unsigned long) buf;
-	xfer[1].len = len;
-
-	status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
-	if (status < 0) {
-		perror("SPI_IOC_MESSAGE");
-		return;
-	}
-
-	printf("response(%2d, %2d): ", len, status);
-	for (bp = buf; len; len--)
-		printf(" %02x", *bp++);
-	printf("\n");
-}
-
-static void dumpstat(const char *name, int fd)
-{
-	__u8	lsb, bits;
-	__u32	mode, speed;
-
-	if (ioctl(fd, SPI_IOC_RD_MODE32, &mode) < 0) {
-		perror("SPI rd_mode");
-		return;
-	}
-	if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
-		perror("SPI rd_lsb_fist");
-		return;
-	}
-	if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
-		perror("SPI bits_per_word");
-		return;
-	}
-	if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
-		perror("SPI max_speed_hz");
-		return;
-	}
-
-	printf("%s: spi mode 0x%x, %d bits %sper word, %d Hz max\n",
-		name, mode, bits, lsb ? "(lsb first) " : "", speed);
-}
-
-int main(int argc, char **argv)
-{
-	int		c;
-	int		readcount = 0;
-	int		msglen = 0;
-	int		fd;
-	const char	*name;
-
-	while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
-		switch (c) {
-		case 'm':
-			msglen = atoi(optarg);
-			if (msglen < 0)
-				goto usage;
-			continue;
-		case 'r':
-			readcount = atoi(optarg);
-			if (readcount < 0)
-				goto usage;
-			continue;
-		case 'v':
-			verbose++;
-			continue;
-		case 'h':
-		case '?':
-usage:
-			fprintf(stderr,
-				"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
-				argv[0]);
-			return 1;
-		}
-	}
-
-	if ((optind + 1) != argc)
-		goto usage;
-	name = argv[optind];
-
-	fd = open(name, O_RDWR);
-	if (fd < 0) {
-		perror("open");
-		return 1;
-	}
-
-	dumpstat(name, fd);
-
-	if (msglen)
-		do_msg(fd, msglen);
-
-	if (readcount)
-		do_read(fd, readcount);
-
-	close(fd);
-	return 0;
-}
diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
deleted file mode 100644
index bf6070c..0000000
--- a/Documentation/spi/spidev_test.c
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * SPI testing utility (using spidev driver)
- *
- * Copyright (c) 2007  MontaVista Software, Inc.
- * Copyright (c) 2007  Anton Vorontsov <avorontsov@ru.mvista.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License.
- *
- * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
- */
-
-#include <stdint.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <linux/types.h>
-#include <linux/spi/spidev.h>
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-
-static void pabort(const char *s)
-{
-	perror(s);
-	abort();
-}
-
-static const char *device = "/dev/spidev1.1";
-static uint32_t mode;
-static uint8_t bits = 8;
-static char *input_file;
-static char *output_file;
-static uint32_t speed = 500000;
-static uint16_t delay;
-static int verbose;
-
-uint8_t default_tx[] = {
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0xF0, 0x0D,
-};
-
-char *input_tx;
-
-static void hex_dump(const void *src, size_t length, size_t line_size,
-		     char *prefix)
-{
-	int i = 0;
-	const unsigned char *address = src;
-	const unsigned char *line = address;
-	unsigned char c;
-
-	printf("%s | ", prefix);
-	while (length-- > 0) {
-		printf("%02X ", *address++);
-		if (!(++i % line_size) || (length == 0 && i % line_size)) {
-			if (length == 0) {
-				while (i++ % line_size)
-					printf("__ ");
-			}
-			printf(" | ");  /* right close */
-			while (line < address) {
-				c = *line++;
-				printf("%c", (c < 33 || c == 255) ? 0x2E : c);
-			}
-			printf("\n");
-			if (length > 0)
-				printf("%s | ", prefix);
-		}
-	}
-}
-
-/*
- *  Unescape - process hexadecimal escape character
- *      converts shell input "\x23" -> 0x23
- */
-static int unescape(char *_dst, char *_src, size_t len)
-{
-	int ret = 0;
-	int match;
-	char *src = _src;
-	char *dst = _dst;
-	unsigned int ch;
-
-	while (*src) {
-		if (*src == '\\' && *(src+1) == 'x') {
-			match = sscanf(src + 2, "%2x", &ch);
-			if (!match)
-				pabort("malformed input string");
-
-			src += 4;
-			*dst++ = (unsigned char)ch;
-		} else {
-			*dst++ = *src++;
-		}
-		ret++;
-	}
-	return ret;
-}
-
-static void transfer(int fd, uint8_t const *tx, size_t len)
-{
-	int ret;
-	int out_fd;
-	uint8_t *rx = malloc(len);
-	struct spi_ioc_transfer tr = {
-		.tx_buf = (unsigned long)tx,
-		.rx_buf = (unsigned long)rx,
-		.len = len,
-		.delay_usecs = delay,
-		.speed_hz = speed,
-		.bits_per_word = bits,
-	};
-
-	if (mode & SPI_TX_QUAD)
-		tr.tx_nbits = 4;
-	else if (mode & SPI_TX_DUAL)
-		tr.tx_nbits = 2;
-	if (mode & SPI_RX_QUAD)
-		tr.rx_nbits = 4;
-	else if (mode & SPI_RX_DUAL)
-		tr.rx_nbits = 2;
-	if (!(mode & SPI_LOOP)) {
-		if (mode & (SPI_TX_QUAD | SPI_TX_DUAL))
-			tr.rx_buf = 0;
-		else if (mode & (SPI_RX_QUAD | SPI_RX_DUAL))
-			tr.tx_buf = 0;
-	}
-
-	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
-	if (ret < 1)
-		pabort("can't send spi message");
-
-	if (verbose)
-		hex_dump(tx, len, 32, "TX");
-
-	if (output_file) {
-		out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
-		if (out_fd < 0)
-			pabort("could not open output file");
-
-		ret = write(out_fd, rx, len);
-		if (ret != len)
-			pabort("not all bytes written to utput file");
-
-		close(out_fd);
-	}
-
-	if (verbose || !output_file)
-		hex_dump(rx, len, 32, "RX");
-
-	free(rx);
-}
-
-static void print_usage(const char *prog)
-{
-	printf("Usage: %s [-DsbdlHOLC3]\n", prog);
-	puts("  -D --device   device to use (default /dev/spidev1.1)\n"
-	     "  -s --speed    max speed (Hz)\n"
-	     "  -d --delay    delay (usec)\n"
-	     "  -b --bpw      bits per word\n"
-	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
-	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
-	     "  -l --loop     loopback\n"
-	     "  -H --cpha     clock phase\n"
-	     "  -O --cpol     clock polarity\n"
-	     "  -L --lsb      least significant bit first\n"
-	     "  -C --cs-high  chip select active high\n"
-	     "  -3 --3wire    SI/SO signals shared\n"
-	     "  -v --verbose  Verbose (show tx buffer)\n"
-	     "  -p            Send data (e.g. \"1234\\xde\\xad\")\n"
-	     "  -N --no-cs    no chip select\n"
-	     "  -R --ready    slave pulls low to pause\n"
-	     "  -2 --dual     dual transfer\n"
-	     "  -4 --quad     quad transfer\n");
-	exit(1);
-}
-
-static void parse_opts(int argc, char *argv[])
-{
-	while (1) {
-		static const struct option lopts[] = {
-			{ "device",  1, 0, 'D' },
-			{ "speed",   1, 0, 's' },
-			{ "delay",   1, 0, 'd' },
-			{ "bpw",     1, 0, 'b' },
-			{ "input",   1, 0, 'i' },
-			{ "output",  1, 0, 'o' },
-			{ "loop",    0, 0, 'l' },
-			{ "cpha",    0, 0, 'H' },
-			{ "cpol",    0, 0, 'O' },
-			{ "lsb",     0, 0, 'L' },
-			{ "cs-high", 0, 0, 'C' },
-			{ "3wire",   0, 0, '3' },
-			{ "no-cs",   0, 0, 'N' },
-			{ "ready",   0, 0, 'R' },
-			{ "dual",    0, 0, '2' },
-			{ "verbose", 0, 0, 'v' },
-			{ "quad",    0, 0, '4' },
-			{ NULL, 0, 0, 0 },
-		};
-		int c;
-
-		c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v",
-				lopts, NULL);
-
-		if (c == -1)
-			break;
-
-		switch (c) {
-		case 'D':
-			device = optarg;
-			break;
-		case 's':
-			speed = atoi(optarg);
-			break;
-		case 'd':
-			delay = atoi(optarg);
-			break;
-		case 'b':
-			bits = atoi(optarg);
-			break;
-		case 'i':
-			input_file = optarg;
-			break;
-		case 'o':
-			output_file = optarg;
-			break;
-		case 'l':
-			mode |= SPI_LOOP;
-			break;
-		case 'H':
-			mode |= SPI_CPHA;
-			break;
-		case 'O':
-			mode |= SPI_CPOL;
-			break;
-		case 'L':
-			mode |= SPI_LSB_FIRST;
-			break;
-		case 'C':
-			mode |= SPI_CS_HIGH;
-			break;
-		case '3':
-			mode |= SPI_3WIRE;
-			break;
-		case 'N':
-			mode |= SPI_NO_CS;
-			break;
-		case 'v':
-			verbose = 1;
-			break;
-		case 'R':
-			mode |= SPI_READY;
-			break;
-		case 'p':
-			input_tx = optarg;
-			break;
-		case '2':
-			mode |= SPI_TX_DUAL;
-			break;
-		case '4':
-			mode |= SPI_TX_QUAD;
-			break;
-		default:
-			print_usage(argv[0]);
-			break;
-		}
-	}
-	if (mode & SPI_LOOP) {
-		if (mode & SPI_TX_DUAL)
-			mode |= SPI_RX_DUAL;
-		if (mode & SPI_TX_QUAD)
-			mode |= SPI_RX_QUAD;
-	}
-}
-
-static void transfer_escaped_string(int fd, char *str)
-{
-	size_t size = strlen(str + 1);
-	uint8_t *tx = malloc(size);
-
-	size = unescape((char *)tx, str, size);
-	transfer(fd, tx, size);
-	free(tx);
-}
-
-static void transfer_file(int fd, char *filename)
-{
-	ssize_t bytes;
-	struct stat sb;
-	int tx_fd;
-	uint8_t *tx;
-
-	if (stat(filename, &sb) == -1)
-		pabort("can't stat input file");
-
-	if (sb.st_size > 4096)
-		pabort("input file exceeds spidev's 4k limit");
-
-	tx_fd = open(filename, O_RDONLY);
-	if (fd < 0)
-		pabort("can't open input file");
-
-	tx = malloc(sb.st_size);
-	bytes = read(tx_fd, tx, sb.st_size);
-	if (bytes != sb.st_size)
-		pabort("failed to read input file");
-
-	transfer(fd, tx, sb.st_size);
-	free(tx);
-	close(tx_fd);
-}
-
-int main(int argc, char *argv[])
-{
-	int ret = 0;
-	int fd;
-
-	parse_opts(argc, argv);
-
-	fd = open(device, O_RDWR);
-	if (fd < 0)
-		pabort("can't open device");
-
-	/*
-	 * spi mode
-	 */
-	ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
-	if (ret == -1)
-		pabort("can't set spi mode");
-
-	ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode);
-	if (ret == -1)
-		pabort("can't get spi mode");
-
-	/*
-	 * bits per word
-	 */
-	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
-	if (ret == -1)
-		pabort("can't set bits per word");
-
-	ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
-	if (ret == -1)
-		pabort("can't get bits per word");
-
-	/*
-	 * max speed hz
-	 */
-	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
-	if (ret == -1)
-		pabort("can't set max speed hz");
-
-	ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
-	if (ret == -1)
-		pabort("can't get max speed hz");
-
-	printf("spi mode: 0x%x\n", mode);
-	printf("bits per word: %d\n", bits);
-	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
-
-	if (input_tx && input_file)
-		pabort("only one of -p and --input may be selected");
-
-	if (input_tx)
-		transfer_escaped_string(fd, input_tx);
-	else if (input_file)
-		transfer_file(fd, input_file);
-	else
-		transfer(fd, default_tx, sizeof(default_tx));
-
-	close(fd);
-
-	return ret;
-}
diff --git a/tools/Makefile b/tools/Makefile
index 428fb4d..864762a 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -11,6 +11,7 @@ help:
 	@echo '  lguest     - a minimal 32-bit x86 hypervisor'
 	@echo '  perf       - Linux performance measurement and analysis tool'
 	@echo '  selftests  - various kernel selftests'
+	@echo '  spi        - spi tools'
 	@echo '  turbostat  - Intel CPU idle stats and freq reporting tool'
 	@echo '  usb        - USB testing tools'
 	@echo '  virtio     - vhost test module'
@@ -41,7 +42,7 @@ acpi: FORCE
 cpupower: FORCE
 	$(call descend,power/$@)
 
-cgroup firewire hv guest usb virtio vm net: FORCE
+cgroup firewire hv guest spi usb virtio vm net: FORCE
 	$(call descend,$@)
 
 liblockdep: FORCE
@@ -102,7 +103,7 @@ acpi_clean:
 cpupower_clean:
 	$(call descend,power/cpupower,clean)
 
-cgroup_clean hv_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean:
+cgroup_clean hv_clean firewire_clean lguest_clean spi_clean usb_clean virtio_clean vm_clean net_clean:
 	$(call descend,$(@:_clean=),clean)
 
 liblockdep_clean:
@@ -131,6 +132,7 @@ clean: acpi_clean \
 		lguest_clean \
 		perf_clean \
 		selftests_clean \
+		spi_clean \
 		tmon_clean \
 		turbostat_clean \
 		usb_clean \
diff --git a/tools/spi/Makefile b/tools/spi/Makefile
new file mode 100644
index 0000000..cd0db62
--- /dev/null
+++ b/tools/spi/Makefile
@@ -0,0 +1,4 @@
+all: spidev_test spidev_fdx
+
+clean:
+	$(RM) spidev_test spidev_fdx
diff --git a/tools/spi/spidev_fdx.c b/tools/spi/spidev_fdx.c
new file mode 100644
index 0000000..0ea3e51
--- /dev/null
+++ b/tools/spi/spidev_fdx.c
@@ -0,0 +1,158 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <linux/types.h>
+#include <linux/spi/spidev.h>
+
+
+static int verbose;
+
+static void do_read(int fd, int len)
+{
+	unsigned char	buf[32], *bp;
+	int		status;
+
+	/* read at least 2 bytes, no more than 32 */
+	if (len < 2)
+		len = 2;
+	else if (len > sizeof(buf))
+		len = sizeof(buf);
+	memset(buf, 0, sizeof buf);
+
+	status = read(fd, buf, len);
+	if (status < 0) {
+		perror("read");
+		return;
+	}
+	if (status != len) {
+		fprintf(stderr, "short read\n");
+		return;
+	}
+
+	printf("read(%2d, %2d): %02x %02x,", len, status,
+		buf[0], buf[1]);
+	status -= 2;
+	bp = buf + 2;
+	while (status-- > 0)
+		printf(" %02x", *bp++);
+	printf("\n");
+}
+
+static void do_msg(int fd, int len)
+{
+	struct spi_ioc_transfer	xfer[2];
+	unsigned char		buf[32], *bp;
+	int			status;
+
+	memset(xfer, 0, sizeof xfer);
+	memset(buf, 0, sizeof buf);
+
+	if (len > sizeof buf)
+		len = sizeof buf;
+
+	buf[0] = 0xaa;
+	xfer[0].tx_buf = (unsigned long)buf;
+	xfer[0].len = 1;
+
+	xfer[1].rx_buf = (unsigned long) buf;
+	xfer[1].len = len;
+
+	status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
+	if (status < 0) {
+		perror("SPI_IOC_MESSAGE");
+		return;
+	}
+
+	printf("response(%2d, %2d): ", len, status);
+	for (bp = buf; len; len--)
+		printf(" %02x", *bp++);
+	printf("\n");
+}
+
+static void dumpstat(const char *name, int fd)
+{
+	__u8	lsb, bits;
+	__u32	mode, speed;
+
+	if (ioctl(fd, SPI_IOC_RD_MODE32, &mode) < 0) {
+		perror("SPI rd_mode");
+		return;
+	}
+	if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
+		perror("SPI rd_lsb_fist");
+		return;
+	}
+	if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
+		perror("SPI bits_per_word");
+		return;
+	}
+	if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
+		perror("SPI max_speed_hz");
+		return;
+	}
+
+	printf("%s: spi mode 0x%x, %d bits %sper word, %d Hz max\n",
+		name, mode, bits, lsb ? "(lsb first) " : "", speed);
+}
+
+int main(int argc, char **argv)
+{
+	int		c;
+	int		readcount = 0;
+	int		msglen = 0;
+	int		fd;
+	const char	*name;
+
+	while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
+		switch (c) {
+		case 'm':
+			msglen = atoi(optarg);
+			if (msglen < 0)
+				goto usage;
+			continue;
+		case 'r':
+			readcount = atoi(optarg);
+			if (readcount < 0)
+				goto usage;
+			continue;
+		case 'v':
+			verbose++;
+			continue;
+		case 'h':
+		case '?':
+usage:
+			fprintf(stderr,
+				"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
+				argv[0]);
+			return 1;
+		}
+	}
+
+	if ((optind + 1) != argc)
+		goto usage;
+	name = argv[optind];
+
+	fd = open(name, O_RDWR);
+	if (fd < 0) {
+		perror("open");
+		return 1;
+	}
+
+	dumpstat(name, fd);
+
+	if (msglen)
+		do_msg(fd, msglen);
+
+	if (readcount)
+		do_read(fd, readcount);
+
+	close(fd);
+	return 0;
+}
diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
new file mode 100644
index 0000000..bf6070c
--- /dev/null
+++ b/tools/spi/spidev_test.c
@@ -0,0 +1,385 @@
+/*
+ * SPI testing utility (using spidev driver)
+ *
+ * Copyright (c) 2007  MontaVista Software, Inc.
+ * Copyright (c) 2007  Anton Vorontsov <avorontsov@ru.mvista.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License.
+ *
+ * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
+ */
+
+#include <stdint.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <linux/types.h>
+#include <linux/spi/spidev.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+static void pabort(const char *s)
+{
+	perror(s);
+	abort();
+}
+
+static const char *device = "/dev/spidev1.1";
+static uint32_t mode;
+static uint8_t bits = 8;
+static char *input_file;
+static char *output_file;
+static uint32_t speed = 500000;
+static uint16_t delay;
+static int verbose;
+
+uint8_t default_tx[] = {
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xF0, 0x0D,
+};
+
+char *input_tx;
+
+static void hex_dump(const void *src, size_t length, size_t line_size,
+		     char *prefix)
+{
+	int i = 0;
+	const unsigned char *address = src;
+	const unsigned char *line = address;
+	unsigned char c;
+
+	printf("%s | ", prefix);
+	while (length-- > 0) {
+		printf("%02X ", *address++);
+		if (!(++i % line_size) || (length == 0 && i % line_size)) {
+			if (length == 0) {
+				while (i++ % line_size)
+					printf("__ ");
+			}
+			printf(" | ");  /* right close */
+			while (line < address) {
+				c = *line++;
+				printf("%c", (c < 33 || c == 255) ? 0x2E : c);
+			}
+			printf("\n");
+			if (length > 0)
+				printf("%s | ", prefix);
+		}
+	}
+}
+
+/*
+ *  Unescape - process hexadecimal escape character
+ *      converts shell input "\x23" -> 0x23
+ */
+static int unescape(char *_dst, char *_src, size_t len)
+{
+	int ret = 0;
+	int match;
+	char *src = _src;
+	char *dst = _dst;
+	unsigned int ch;
+
+	while (*src) {
+		if (*src == '\\' && *(src+1) == 'x') {
+			match = sscanf(src + 2, "%2x", &ch);
+			if (!match)
+				pabort("malformed input string");
+
+			src += 4;
+			*dst++ = (unsigned char)ch;
+		} else {
+			*dst++ = *src++;
+		}
+		ret++;
+	}
+	return ret;
+}
+
+static void transfer(int fd, uint8_t const *tx, size_t len)
+{
+	int ret;
+	int out_fd;
+	uint8_t *rx = malloc(len);
+	struct spi_ioc_transfer tr = {
+		.tx_buf = (unsigned long)tx,
+		.rx_buf = (unsigned long)rx,
+		.len = len,
+		.delay_usecs = delay,
+		.speed_hz = speed,
+		.bits_per_word = bits,
+	};
+
+	if (mode & SPI_TX_QUAD)
+		tr.tx_nbits = 4;
+	else if (mode & SPI_TX_DUAL)
+		tr.tx_nbits = 2;
+	if (mode & SPI_RX_QUAD)
+		tr.rx_nbits = 4;
+	else if (mode & SPI_RX_DUAL)
+		tr.rx_nbits = 2;
+	if (!(mode & SPI_LOOP)) {
+		if (mode & (SPI_TX_QUAD | SPI_TX_DUAL))
+			tr.rx_buf = 0;
+		else if (mode & (SPI_RX_QUAD | SPI_RX_DUAL))
+			tr.tx_buf = 0;
+	}
+
+	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
+	if (ret < 1)
+		pabort("can't send spi message");
+
+	if (verbose)
+		hex_dump(tx, len, 32, "TX");
+
+	if (output_file) {
+		out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+		if (out_fd < 0)
+			pabort("could not open output file");
+
+		ret = write(out_fd, rx, len);
+		if (ret != len)
+			pabort("not all bytes written to utput file");
+
+		close(out_fd);
+	}
+
+	if (verbose || !output_file)
+		hex_dump(rx, len, 32, "RX");
+
+	free(rx);
+}
+
+static void print_usage(const char *prog)
+{
+	printf("Usage: %s [-DsbdlHOLC3]\n", prog);
+	puts("  -D --device   device to use (default /dev/spidev1.1)\n"
+	     "  -s --speed    max speed (Hz)\n"
+	     "  -d --delay    delay (usec)\n"
+	     "  -b --bpw      bits per word\n"
+	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
+	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
+	     "  -l --loop     loopback\n"
+	     "  -H --cpha     clock phase\n"
+	     "  -O --cpol     clock polarity\n"
+	     "  -L --lsb      least significant bit first\n"
+	     "  -C --cs-high  chip select active high\n"
+	     "  -3 --3wire    SI/SO signals shared\n"
+	     "  -v --verbose  Verbose (show tx buffer)\n"
+	     "  -p            Send data (e.g. \"1234\\xde\\xad\")\n"
+	     "  -N --no-cs    no chip select\n"
+	     "  -R --ready    slave pulls low to pause\n"
+	     "  -2 --dual     dual transfer\n"
+	     "  -4 --quad     quad transfer\n");
+	exit(1);
+}
+
+static void parse_opts(int argc, char *argv[])
+{
+	while (1) {
+		static const struct option lopts[] = {
+			{ "device",  1, 0, 'D' },
+			{ "speed",   1, 0, 's' },
+			{ "delay",   1, 0, 'd' },
+			{ "bpw",     1, 0, 'b' },
+			{ "input",   1, 0, 'i' },
+			{ "output",  1, 0, 'o' },
+			{ "loop",    0, 0, 'l' },
+			{ "cpha",    0, 0, 'H' },
+			{ "cpol",    0, 0, 'O' },
+			{ "lsb",     0, 0, 'L' },
+			{ "cs-high", 0, 0, 'C' },
+			{ "3wire",   0, 0, '3' },
+			{ "no-cs",   0, 0, 'N' },
+			{ "ready",   0, 0, 'R' },
+			{ "dual",    0, 0, '2' },
+			{ "verbose", 0, 0, 'v' },
+			{ "quad",    0, 0, '4' },
+			{ NULL, 0, 0, 0 },
+		};
+		int c;
+
+		c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v",
+				lopts, NULL);
+
+		if (c == -1)
+			break;
+
+		switch (c) {
+		case 'D':
+			device = optarg;
+			break;
+		case 's':
+			speed = atoi(optarg);
+			break;
+		case 'd':
+			delay = atoi(optarg);
+			break;
+		case 'b':
+			bits = atoi(optarg);
+			break;
+		case 'i':
+			input_file = optarg;
+			break;
+		case 'o':
+			output_file = optarg;
+			break;
+		case 'l':
+			mode |= SPI_LOOP;
+			break;
+		case 'H':
+			mode |= SPI_CPHA;
+			break;
+		case 'O':
+			mode |= SPI_CPOL;
+			break;
+		case 'L':
+			mode |= SPI_LSB_FIRST;
+			break;
+		case 'C':
+			mode |= SPI_CS_HIGH;
+			break;
+		case '3':
+			mode |= SPI_3WIRE;
+			break;
+		case 'N':
+			mode |= SPI_NO_CS;
+			break;
+		case 'v':
+			verbose = 1;
+			break;
+		case 'R':
+			mode |= SPI_READY;
+			break;
+		case 'p':
+			input_tx = optarg;
+			break;
+		case '2':
+			mode |= SPI_TX_DUAL;
+			break;
+		case '4':
+			mode |= SPI_TX_QUAD;
+			break;
+		default:
+			print_usage(argv[0]);
+			break;
+		}
+	}
+	if (mode & SPI_LOOP) {
+		if (mode & SPI_TX_DUAL)
+			mode |= SPI_RX_DUAL;
+		if (mode & SPI_TX_QUAD)
+			mode |= SPI_RX_QUAD;
+	}
+}
+
+static void transfer_escaped_string(int fd, char *str)
+{
+	size_t size = strlen(str + 1);
+	uint8_t *tx = malloc(size);
+
+	size = unescape((char *)tx, str, size);
+	transfer(fd, tx, size);
+	free(tx);
+}
+
+static void transfer_file(int fd, char *filename)
+{
+	ssize_t bytes;
+	struct stat sb;
+	int tx_fd;
+	uint8_t *tx;
+
+	if (stat(filename, &sb) == -1)
+		pabort("can't stat input file");
+
+	if (sb.st_size > 4096)
+		pabort("input file exceeds spidev's 4k limit");
+
+	tx_fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		pabort("can't open input file");
+
+	tx = malloc(sb.st_size);
+	bytes = read(tx_fd, tx, sb.st_size);
+	if (bytes != sb.st_size)
+		pabort("failed to read input file");
+
+	transfer(fd, tx, sb.st_size);
+	free(tx);
+	close(tx_fd);
+}
+
+int main(int argc, char *argv[])
+{
+	int ret = 0;
+	int fd;
+
+	parse_opts(argc, argv);
+
+	fd = open(device, O_RDWR);
+	if (fd < 0)
+		pabort("can't open device");
+
+	/*
+	 * spi mode
+	 */
+	ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
+	if (ret == -1)
+		pabort("can't set spi mode");
+
+	ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode);
+	if (ret == -1)
+		pabort("can't get spi mode");
+
+	/*
+	 * bits per word
+	 */
+	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
+	if (ret == -1)
+		pabort("can't set bits per word");
+
+	ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
+	if (ret == -1)
+		pabort("can't get bits per word");
+
+	/*
+	 * max speed hz
+	 */
+	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
+	if (ret == -1)
+		pabort("can't set max speed hz");
+
+	ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
+	if (ret == -1)
+		pabort("can't get max speed hz");
+
+	printf("spi mode: 0x%x\n", mode);
+	printf("bits per word: %d\n", bits);
+	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
+
+	if (input_tx && input_file)
+		pabort("only one of -p and --input may be selected");
+
+	if (input_tx)
+		transfer_escaped_string(fd, input_tx);
+	else if (input_file)
+		transfer_file(fd, input_file);
+	else
+		transfer(fd, default_tx, sizeof(default_tx));
+
+	close(fd);
+
+	return ret;
+}
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Re: [PATCH 0/8] spi: Add file i/o to spidev_test
  2015-11-17 15:24 ` Joshua Clayton
                   ` (8 preceding siblings ...)
  (?)
@ 2015-11-17 15:37 ` Mark Brown
  2015-11-17 16:15     ` Joshua Clayton
  -1 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2015-11-17 15:37 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 457 bytes --]

On Tue, Nov 17, 2015 at 07:24:20AM -0800, Joshua Clayton wrote:

>   Documentation/spi/spidev_test.c: use one rx buffer
>   Documentation/spi/spidev_test.c: clean up input_tx
>   Documentation/spi/spidev_test.c: accept input from a file
>   Documentation/spi/spidev_test.c: output to a file
>   Documentation/spi/spidev_test.c: check error
>   Documentation/spi/spidev_test.c: fix whitespace

Please use subjct lines reflecting the style for the subsystem.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 0/8] spi: Add file i/o to spidev_test
  2015-11-17 15:37 ` [PATCH 0/8] spi: Add file i/o to spidev_test Mark Brown
@ 2015-11-17 16:15     ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 16:15 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Mark Brown, Jonathan Corbet, Adrian Remonda, linux-doc,
	linux-kernel, linux-spi

On Tuesday, November 17, 2015 03:37:46 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:20AM -0800, Joshua Clayton wrote:
> 
> >   Documentation/spi/spidev_test.c: use one rx buffer
> >   Documentation/spi/spidev_test.c: clean up input_tx
> >   Documentation/spi/spidev_test.c: accept input from a file
> >   Documentation/spi/spidev_test.c: output to a file
> >   Documentation/spi/spidev_test.c: check error
> >   Documentation/spi/spidev_test.c: fix whitespace
> 
> Please use subjct lines reflecting the style for the subsystem.
OK. Will do.
Assuming "spi: spidev_test: yadda..." 
It was a bit unclear due to the location of the file.

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 0/8] spi: Add file i/o to spidev_test
@ 2015-11-17 16:15     ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 16:15 UTC (permalink / raw)
  To: linux-arm-kernel

On Tuesday, November 17, 2015 03:37:46 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:20AM -0800, Joshua Clayton wrote:
> 
> >   Documentation/spi/spidev_test.c: use one rx buffer
> >   Documentation/spi/spidev_test.c: clean up input_tx
> >   Documentation/spi/spidev_test.c: accept input from a file
> >   Documentation/spi/spidev_test.c: output to a file
> >   Documentation/spi/spidev_test.c: check error
> >   Documentation/spi/spidev_test.c: fix whitespace
> 
> Please use subjct lines reflecting the style for the subsystem.
OK. Will do.
Assuming "spi: spidev_test: yadda..." 
It was a bit unclear due to the location of the file.

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 0/8] spi: Add file i/o to spidev_test
  2015-11-17 16:15     ` Joshua Clayton
@ 2015-11-17 16:53       ` Mark Brown
  -1 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 16:53 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: linux-arm-kernel, Jonathan Corbet, Adrian Remonda, linux-doc,
	linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 867 bytes --]

On Tue, Nov 17, 2015 at 08:15:45AM -0800, Joshua Clayton wrote:
> On Tuesday, November 17, 2015 03:37:46 PM Mark Brown wrote:
> > On Tue, Nov 17, 2015 at 07:24:20AM -0800, Joshua Clayton wrote:

> > >   Documentation/spi/spidev_test.c: use one rx buffer
> > >   Documentation/spi/spidev_test.c: clean up input_tx
> > >   Documentation/spi/spidev_test.c: accept input from a file
> > >   Documentation/spi/spidev_test.c: output to a file
> > >   Documentation/spi/spidev_test.c: check error
> > >   Documentation/spi/spidev_test.c: fix whitespace

> > Please use subjct lines reflecting the style for the subsystem.

> OK. Will do.
> Assuming "spi: spidev_test: yadda..." 

Something like that.

> It was a bit unclear due to the location of the file.

It's not really the location that you should be focusing on, it's other
commits in the file.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 0/8] spi: Add file i/o to spidev_test
@ 2015-11-17 16:53       ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 16:53 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Nov 17, 2015 at 08:15:45AM -0800, Joshua Clayton wrote:
> On Tuesday, November 17, 2015 03:37:46 PM Mark Brown wrote:
> > On Tue, Nov 17, 2015 at 07:24:20AM -0800, Joshua Clayton wrote:

> > >   Documentation/spi/spidev_test.c: use one rx buffer
> > >   Documentation/spi/spidev_test.c: clean up input_tx
> > >   Documentation/spi/spidev_test.c: accept input from a file
> > >   Documentation/spi/spidev_test.c: output to a file
> > >   Documentation/spi/spidev_test.c: check error
> > >   Documentation/spi/spidev_test.c: fix whitespace

> > Please use subjct lines reflecting the style for the subsystem.

> OK. Will do.
> Assuming "spi: spidev_test: yadda..." 

Something like that.

> It was a bit unclear due to the location of the file.

It's not really the location that you should be focusing on, it's other
commits in the file.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20151117/a48258ac/attachment.sig>

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 1/8] Documentation/spi/spidev_test.c: use one rx buffer
@ 2015-11-17 17:41     ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 17:41 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 489 bytes --]

On Tue, Nov 17, 2015 at 07:24:21AM -0800, Joshua Clayton wrote:

> default_rx and rx are needlessly different.
> Use one buffer, local to transmit()

Why?  This isn't what I'd expect from black boxing the API, from a
userspace point of view the transfer is atomic and in an ideal world
we'd be able to do direct to/from memory transfers rather than memcpy()
into kernel space which means that userspace should assume the transfers
are going on simultaneously even if they don't currently.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 1/8] Documentation/spi/spidev_test.c: use one rx buffer
@ 2015-11-17 17:41     ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 17:41 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 489 bytes --]

On Tue, Nov 17, 2015 at 07:24:21AM -0800, Joshua Clayton wrote:

> default_rx and rx are needlessly different.
> Use one buffer, local to transmit()

Why?  This isn't what I'd expect from black boxing the API, from a
userspace point of view the transfer is atomic and in an ideal world
we'd be able to do direct to/from memory transfers rather than memcpy()
into kernel space which means that userspace should assume the transfers
are going on simultaneously even if they don't currently.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
  2015-11-17 15:24 ` [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx Joshua Clayton
@ 2015-11-17 17:43   ` Mark Brown
  2015-11-17 19:21       ` Joshua Clayton
  0 siblings, 1 reply; 54+ messages in thread
From: Mark Brown @ 2015-11-17 17:43 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 231 bytes --]

On Tue, Nov 17, 2015 at 07:24:22AM -0800, Joshua Clayton wrote:
> Put input from string into its own function.

Again, why are we doing this?  I'm having a hard time seeing what the
gain is, the amount of code being moved is tiny.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 7/8] tools/Makefile: minor whitespace cleanup
@ 2015-11-17 18:09     ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 18:09 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 1413 bytes --]

On Tue, Nov 17, 2015 at 07:24:27AM -0800, Joshua Clayton wrote:
> Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
> ---
>  tools/Makefile | 37 ++++++++++++++++++++++++++++++-------
>  1 file changed, 30 insertions(+), 7 deletions(-)
> 
> diff --git a/tools/Makefile b/tools/Makefile
> index 9a617ad..428fb4d 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -80,10 +80,21 @@ turbostat_install x86_energy_perf_policy_install:
>  tmon_install:
>  	$(call descend,thermal/$(@:_install=),install)
>  
> -install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \
> -		perf_install selftests_install turbostat_install usb_install \
> -		virtio_install vm_install net_install x86_energy_perf_policy_install \
> -	tmon
> +install: acpi_install \
> +		cgroup_install \
> +		cpupower_install \
> +		hv_install \
> +		firewire_install \
> +		lguest_install \
> +		perf_install \
> +		selftests_install \
> +		tmon \
> +		turbostat_install \
> +		usb_install \
> +		virtio_install \
> +		vm_install \
> +		net_install \
> +		x86_energy_perf_policy_install

This isn't a whitespace cleanup, this is a substantial reindentation of
the file :(  Please ensure your changelogs are accurate and in general
try to avoid mixing this sort of invasive stylistic change in with other
patch serieses, it reduces the potential for conflicts.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 7/8] tools/Makefile: minor whitespace cleanup
@ 2015-11-17 18:09     ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 18:09 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 1443 bytes --]

On Tue, Nov 17, 2015 at 07:24:27AM -0800, Joshua Clayton wrote:
> Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
>  tools/Makefile | 37 ++++++++++++++++++++++++++++++-------
>  1 file changed, 30 insertions(+), 7 deletions(-)
> 
> diff --git a/tools/Makefile b/tools/Makefile
> index 9a617ad..428fb4d 100644
> --- a/tools/Makefile
> +++ b/tools/Makefile
> @@ -80,10 +80,21 @@ turbostat_install x86_energy_perf_policy_install:
>  tmon_install:
>  	$(call descend,thermal/$(@:_install=),install)
>  
> -install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \
> -		perf_install selftests_install turbostat_install usb_install \
> -		virtio_install vm_install net_install x86_energy_perf_policy_install \
> -	tmon
> +install: acpi_install \
> +		cgroup_install \
> +		cpupower_install \
> +		hv_install \
> +		firewire_install \
> +		lguest_install \
> +		perf_install \
> +		selftests_install \
> +		tmon \
> +		turbostat_install \
> +		usb_install \
> +		virtio_install \
> +		vm_install \
> +		net_install \
> +		x86_energy_perf_policy_install

This isn't a whitespace cleanup, this is a substantial reindentation of
the file :(  Please ensure your changelogs are accurate and in general
try to avoid mixing this sort of invasive stylistic change in with other
patch serieses, it reduces the potential for conflicts.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 8/8] spi: Move spi code from Documentation to tools
@ 2015-11-17 18:11     ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 18:11 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 485 bytes --]

On Tue, Nov 17, 2015 at 07:24:28AM -0800, Joshua Clayton wrote:
> Jon Corbet requested this code moved with the last changeset,
> https://lkml.org/lkml/2015/3/1/144,
> but the patch was not applied because it missed the Makefile.
> Moved spidev_test, spidev_fdx and their Makefile infrastructure.

Trivial moves like this should generally come early rather than
later in the series so that they are easier to apply, as this is at the
end of the series it depends on the entire series.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 8/8] spi: Move spi code from Documentation to tools
@ 2015-11-17 18:11     ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 18:11 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 485 bytes --]

On Tue, Nov 17, 2015 at 07:24:28AM -0800, Joshua Clayton wrote:
> Jon Corbet requested this code moved with the last changeset,
> https://lkml.org/lkml/2015/3/1/144,
> but the patch was not applied because it missed the Makefile.
> Moved spidev_test, spidev_fdx and their Makefile infrastructure.

Trivial moves like this should generally come early rather than
later in the series so that they are easier to apply, as this is at the
end of the series it depends on the entire series.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file
  2015-11-17 15:24 ` [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file Joshua Clayton
@ 2015-11-17 18:26   ` Anton Bondarenko
  2015-11-17 18:46     ` Mark Brown
  2015-11-17 19:28       ` Joshua Clayton
  0 siblings, 2 replies; 54+ messages in thread
From: Anton Bondarenko @ 2015-11-17 18:26 UTC (permalink / raw)
  To: Joshua Clayton, Mark Brown
  Cc: Jonathan Corbet, Adrian Remonda, linux-doc, linux-kernel, linux-spi

On 17.11.2015 16:24, Joshua Clayton wrote:
> Add input file support to facilitate testing larger data.
>
> Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
> ---
>   Documentation/spi/spidev_test.c | 42 ++++++++++++++++++++++++++++++++++++++++-
>   1 file changed, 41 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
> index 1ed9110..ef812ad 100644
> --- a/Documentation/spi/spidev_test.c
> +++ b/Documentation/spi/spidev_test.c
> @@ -19,6 +19,7 @@
>   #include <getopt.h>
>   #include <fcntl.h>
>   #include <sys/ioctl.h>
> +#include <sys/stat.h>
>   #include <linux/types.h>
>   #include <linux/spi/spidev.h>
>
> @@ -33,6 +34,7 @@ static void pabort(const char *s)
>   static const char *device = "/dev/spidev1.1";
>   static uint32_t mode;
>   static uint8_t bits = 8;
> +static char *input_file;
>   static uint32_t speed = 500000;
>   static uint16_t delay;
>   static int verbose;
> @@ -144,6 +146,7 @@ static void print_usage(const char *prog)
>   	     "  -s --speed    max speed (Hz)\n"
>   	     "  -d --delay    delay (usec)\n"
>   	     "  -b --bpw      bits per word \n"
> +	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
>   	     "  -l --loop     loopback\n"
>   	     "  -H --cpha     clock phase\n"
>   	     "  -O --cpol     clock polarity\n"
> @@ -167,6 +170,7 @@ static void parse_opts(int argc, char *argv[])
>   			{ "speed",   1, 0, 's' },
>   			{ "delay",   1, 0, 'd' },
>   			{ "bpw",     1, 0, 'b' },
> +			{ "input",   1, 0, 'i' },
>   			{ "loop",    0, 0, 'l' },
>   			{ "cpha",    0, 0, 'H' },
>   			{ "cpol",    0, 0, 'O' },
> @@ -182,7 +186,8 @@ static void parse_opts(int argc, char *argv[])
>   		};
>   		int c;
>
> -		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
> +		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
> +				lopts, NULL);
>
>   		if (c == -1)
>   			break;
> @@ -200,6 +205,9 @@ static void parse_opts(int argc, char *argv[])
>   		case 'b':
>   			bits = atoi(optarg);
>   			break;
> +		case 'i':
> +			input_file = optarg;
> +			break;
>   		case 'l':
>   			mode |= SPI_LOOP;
>   			break;
> @@ -259,6 +267,33 @@ static void transfer_escaped_string(int fd, char *str)
>   	free(tx);
>   }
>
> +static void transfer_file(int fd, char *filename)
> +{
> +	ssize_t bytes;
> +	struct stat sb;
> +	int tx_fd;
> +	uint8_t *tx;
> +
> +	if (stat(filename, &sb) == -1)
> +		pabort("can't stat input file");
> +
> +	if (sb.st_size > 4096)
> +		pabort("input file exceeds spidev's 4k limit");
This is not a true. IIRC PAGE_SIZE is the default buffer size for 
spidev, but can be changed using bufsiz module parameter.
Just 'insmod spidev bufsiz=X', where X is number of bytes.
> +
> +	tx_fd = open(filename, O_RDONLY);
> +	if (fd < 0)
> +		pabort("can't open input file");
> +
> +	tx = malloc(sb.st_size);
It would be good to check new allocations for fail.
> +	bytes = read(tx_fd, tx, sb.st_size);
> +	if (bytes != sb.st_size)
> +		pabort("failed to read input file");
> +
> +	transfer(fd, tx, sb.st_size);
> +	free(tx);
> +	close(tx_fd);
> +}
> +
>   int main(int argc, char *argv[])
>   {
>   	int ret = 0;
> @@ -307,8 +342,13 @@ int main(int argc, char *argv[])
>   	printf("bits per word: %d\n", bits);
>   	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
>
> +	if (input_tx && input_file)
> +		pabort("only one of -p and --input may be selected");
> +
>   	if (input_tx)
>   		transfer_escaped_string(fd, input_tx);
> +	else if (input_file)
> +		transfer_file(fd, input_file);
>   	else
>   		transfer(fd, default_tx, sizeof(default_tx));
>
>

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file
  2015-11-17 18:26   ` Anton Bondarenko
@ 2015-11-17 18:46     ` Mark Brown
  2015-11-17 19:28       ` Joshua Clayton
  1 sibling, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 18:46 UTC (permalink / raw)
  To: Anton Bondarenko
  Cc: Joshua Clayton, Jonathan Corbet, Adrian Remonda, linux-doc,
	linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 851 bytes --]

On Tue, Nov 17, 2015 at 07:26:54PM +0100, Anton Bondarenko wrote:
> On 17.11.2015 16:24, Joshua Clayton wrote:

> >+	if (sb.st_size > 4096)
> >+		pabort("input file exceeds spidev's 4k limit");

> This is not a true. IIRC PAGE_SIZE is the default buffer size for spidev,
> but can be changed using bufsiz module parameter.
> Just 'insmod spidev bufsiz=X', where X is number of bytes.

Right, there's also various options for changing PAGE_SIZE on some
architectures.  I was going to go and check what we actually do here but
in general it does seem better to just let the kernel worry about
validating things like this - it needs to do that anyway and it means
that if someone improves the kernel code to accept larger buffers then
the tool will automatically be able to use them instead of requiring
people to remember to separately update the tool.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 1/8] Documentation/spi/spidev_test.c: use one rx buffer
@ 2015-11-17 18:58       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 18:58 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Mark Brown, Jonathan Corbet, Adrian Remonda, linux-doc,
	linux-kernel, linux-spi

On Tuesday, November 17, 2015 05:41:56 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:21AM -0800, Joshua Clayton wrote:
> 
> > default_rx and rx are needlessly different.
> > Use one buffer, local to transmit()
> 
> Why?  This isn't what I'd expect from black boxing the API, from a
> userspace point of view the transfer is atomic and in an ideal world
> we'd be able to do direct to/from memory transfers rather than memcpy()
> into kernel space which means that userspace should assume the transfers
> are going on simultaneously even if they don't currently.

The important thing here was to get rid of the default_rx buffer.
I just noticed that the output can be set up completely within the scope
of the transmit function, since the operands are global. But I would be
just as happy to set it up at the top level. I'll change this in V2

--
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 1/8] Documentation/spi/spidev_test.c: use one rx buffer
@ 2015-11-17 18:58       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 18:58 UTC (permalink / raw)
  To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
  Cc: Mark Brown, Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA

On Tuesday, November 17, 2015 05:41:56 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:21AM -0800, Joshua Clayton wrote:
> 
> > default_rx and rx are needlessly different.
> > Use one buffer, local to transmit()
> 
> Why?  This isn't what I'd expect from black boxing the API, from a
> userspace point of view the transfer is atomic and in an ideal world
> we'd be able to do direct to/from memory transfers rather than memcpy()
> into kernel space which means that userspace should assume the transfers
> are going on simultaneously even if they don't currently.

The important thing here was to get rid of the default_rx buffer.
I just noticed that the output can be set up completely within the scope
of the transmit function, since the operands are global. But I would be
just as happy to set it up at the top level. I'll change this in V2

--
~Joshua Clayton
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 1/8] Documentation/spi/spidev_test.c: use one rx buffer
@ 2015-11-17 18:58       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 18:58 UTC (permalink / raw)
  To: linux-arm-kernel

On Tuesday, November 17, 2015 05:41:56 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:21AM -0800, Joshua Clayton wrote:
> 
> > default_rx and rx are needlessly different.
> > Use one buffer, local to transmit()
> 
> Why?  This isn't what I'd expect from black boxing the API, from a
> userspace point of view the transfer is atomic and in an ideal world
> we'd be able to do direct to/from memory transfers rather than memcpy()
> into kernel space which means that userspace should assume the transfers
> are going on simultaneously even if they don't currently.

The important thing here was to get rid of the default_rx buffer.
I just noticed that the output can be set up completely within the scope
of the transmit function, since the operands are global. But I would be
just as happy to set it up at the top level. I'll change this in V2

--
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
@ 2015-11-17 19:21       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:21 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Mark Brown, Jonathan Corbet, Adrian Remonda, linux-doc,
	linux-kernel, linux-spi

On Tuesday, November 17, 2015 05:43:33 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:22AM -0800, Joshua Clayton wrote:
> > Put input from string into its own function.
> 
> Again, why are we doing this?  I'm having a hard time seeing what the
> gain is, the amount of code being moved is tiny.

It takes some clutter out of main() whose scope is limited to that little block of code, 
and because in the next patch we add another (larger)function to the if/else block.

I don't know if it is valid to say "look at the next commit" for justification, but
That is the reason.

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
@ 2015-11-17 19:21       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:21 UTC (permalink / raw)
  To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
  Cc: Mark Brown, Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA

On Tuesday, November 17, 2015 05:43:33 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:22AM -0800, Joshua Clayton wrote:
> > Put input from string into its own function.
> 
> Again, why are we doing this?  I'm having a hard time seeing what the
> gain is, the amount of code being moved is tiny.

It takes some clutter out of main() whose scope is limited to that little block of code, 
and because in the next patch we add another (larger)function to the if/else block.

I don't know if it is valid to say "look at the next commit" for justification, but
That is the reason.

-- 
~Joshua Clayton
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
@ 2015-11-17 19:21       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:21 UTC (permalink / raw)
  To: linux-arm-kernel

On Tuesday, November 17, 2015 05:43:33 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:22AM -0800, Joshua Clayton wrote:
> > Put input from string into its own function.
> 
> Again, why are we doing this?  I'm having a hard time seeing what the
> gain is, the amount of code being moved is tiny.

It takes some clutter out of main() whose scope is limited to that little block of code, 
and because in the next patch we add another (larger)function to the if/else block.

I don't know if it is valid to say "look at the next commit" for justification, but
That is the reason.

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file
@ 2015-11-17 19:28       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:28 UTC (permalink / raw)
  To: linux-arm-kernel, linux-doc
  Cc: Anton Bondarenko, Mark Brown, linux-kernel, linux-spi

On Tuesday, November 17, 2015 07:26:54 PM Anton Bondarenko wrote:
> On 17.11.2015 16:24, Joshua Clayton wrote:
> > +	if (sb.st_size > 4096)
> > +		pabort("input file exceeds spidev's 4k limit");
> This is not a true. IIRC PAGE_SIZE is the default buffer size for 
> spidev, but can be changed using bufsiz module parameter.
> Just 'insmod spidev bufsiz=X', where X is number of bytes.

You are right. I will drop this. As Mark suggests.
The ioctl gives a nice error code if the buffer is too big.

...
> > +	tx = malloc(sb.st_size);
> It would be good to check new allocations for fail.

I will add a check for this. 

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file
@ 2015-11-17 19:28       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:28 UTC (permalink / raw)
  To: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	linux-doc-u79uwXL29TY76Z2rM5mHXA
  Cc: Anton Bondarenko, Mark Brown,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA

On Tuesday, November 17, 2015 07:26:54 PM Anton Bondarenko wrote:
> On 17.11.2015 16:24, Joshua Clayton wrote:
> > +	if (sb.st_size > 4096)
> > +		pabort("input file exceeds spidev's 4k limit");
> This is not a true. IIRC PAGE_SIZE is the default buffer size for 
> spidev, but can be changed using bufsiz module parameter.
> Just 'insmod spidev bufsiz=X', where X is number of bytes.

You are right. I will drop this. As Mark suggests.
The ioctl gives a nice error code if the buffer is too big.

...
> > +	tx = malloc(sb.st_size);
> It would be good to check new allocations for fail.

I will add a check for this. 

-- 
~Joshua Clayton
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file
@ 2015-11-17 19:28       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:28 UTC (permalink / raw)
  To: linux-arm-kernel

On Tuesday, November 17, 2015 07:26:54 PM Anton Bondarenko wrote:
> On 17.11.2015 16:24, Joshua Clayton wrote:
> > +	if (sb.st_size > 4096)
> > +		pabort("input file exceeds spidev's 4k limit");
> This is not a true. IIRC PAGE_SIZE is the default buffer size for 
> spidev, but can be changed using bufsiz module parameter.
> Just 'insmod spidev bufsiz=X', where X is number of bytes.

You are right. I will drop this. As Mark suggests.
The ioctl gives a nice error code if the buffer is too big.

...
> > +	tx = malloc(sb.st_size);
> It would be good to check new allocations for fail.

I will add a check for this. 

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 7/8] tools/Makefile: minor whitespace cleanup
  2015-11-17 18:09     ` Mark Brown
@ 2015-11-17 19:41       ` Joshua Clayton
  -1 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:41 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Mark Brown, Jonathan Corbet, Adrian Remonda, linux-doc,
	linux-kernel, linux-spi

On Tuesday, November 17, 2015 06:09:24 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:27AM -0800, Joshua Clayton wrote:
> > Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
> > ---
> >  tools/Makefile | 37 ++++++++++++++++++++++++++++++-------
> >  1 file changed, 30 insertions(+), 7 deletions(-)
> > 
> > diff --git a/tools/Makefile b/tools/Makefile
> > index 9a617ad..428fb4d 100644
> > --- a/tools/Makefile
> > +++ b/tools/Makefile
> > @@ -80,10 +80,21 @@ turbostat_install x86_energy_perf_policy_install:
> >  tmon_install:
> >  	$(call descend,thermal/$(@:_install=),install)
> >  
> > -install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \
> > -		perf_install selftests_install turbostat_install usb_install \
> > -		virtio_install vm_install net_install x86_energy_perf_policy_install \
> > -	tmon
> > +install: acpi_install \
> > +		cgroup_install \
> > +		cpupower_install \
> > +		hv_install \
> > +		firewire_install \
> > +		lguest_install \
> > +		perf_install \
> > +		selftests_install \
> > +		tmon \
> > +		turbostat_install \
> > +		usb_install \
> > +		virtio_install \
> > +		vm_install \
> > +		net_install \
> > +		x86_energy_perf_policy_install
> 
> This isn't a whitespace cleanup, this is a substantial reindentation of
> the file :(  Please ensure your changelogs are accurate and in general
> try to avoid mixing this sort of invasive stylistic change in with other
> patch serieses, it reduces the potential for conflicts.
Um.
Inability to resist Makefile cleanup is a weakness of mine. 
It is a tangent from the rest of the series so I'll drop it.

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 7/8] tools/Makefile: minor whitespace cleanup
@ 2015-11-17 19:41       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-17 19:41 UTC (permalink / raw)
  To: linux-arm-kernel

On Tuesday, November 17, 2015 06:09:24 PM Mark Brown wrote:
> On Tue, Nov 17, 2015 at 07:24:27AM -0800, Joshua Clayton wrote:
> > Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
> > ---
> >  tools/Makefile | 37 ++++++++++++++++++++++++++++++-------
> >  1 file changed, 30 insertions(+), 7 deletions(-)
> > 
> > diff --git a/tools/Makefile b/tools/Makefile
> > index 9a617ad..428fb4d 100644
> > --- a/tools/Makefile
> > +++ b/tools/Makefile
> > @@ -80,10 +80,21 @@ turbostat_install x86_energy_perf_policy_install:
> >  tmon_install:
> >  	$(call descend,thermal/$(@:_install=),install)
> >  
> > -install: acpi_install cgroup_install cpupower_install hv_install firewire_install lguest_install \
> > -		perf_install selftests_install turbostat_install usb_install \
> > -		virtio_install vm_install net_install x86_energy_perf_policy_install \
> > -	tmon
> > +install: acpi_install \
> > +		cgroup_install \
> > +		cpupower_install \
> > +		hv_install \
> > +		firewire_install \
> > +		lguest_install \
> > +		perf_install \
> > +		selftests_install \
> > +		tmon \
> > +		turbostat_install \
> > +		usb_install \
> > +		virtio_install \
> > +		vm_install \
> > +		net_install \
> > +		x86_energy_perf_policy_install
> 
> This isn't a whitespace cleanup, this is a substantial reindentation of
> the file :(  Please ensure your changelogs are accurate and in general
> try to avoid mixing this sort of invasive stylistic change in with other
> patch serieses, it reduces the potential for conflicts.
Um.
Inability to resist Makefile cleanup is a weakness of mine. 
It is a tangent from the rest of the series so I'll drop it.

-- 
~Joshua Clayton

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
  2015-11-17 19:21       ` Joshua Clayton
  (?)
@ 2015-11-17 22:52         ` Mark Brown
  -1 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 22:52 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: linux-arm-kernel, Jonathan Corbet, Adrian Remonda, linux-doc,
	linux-kernel, linux-spi

[-- Attachment #1: Type: text/plain, Size: 752 bytes --]

On Tue, Nov 17, 2015 at 11:21:12AM -0800, Joshua Clayton wrote:

Please fix your mail client to word wrap within paragraphs at something
substantially less than 80 columns.  Doing this makes your messages much
easier to read and reply to.

> It takes some clutter out of main() whose scope is limited to that little block of code, 
> and because in the next patch we add another (larger)function to the if/else block.

> I don't know if it is valid to say "look at the next commit" for justification, but
> That is the reason.

That's totally fine - just say that it's to support future changes in
this area.  It's good to split out mechanical changes like this from the
more complex changes, you just need to say why they're happening.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* Re: [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
@ 2015-11-17 22:52         ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 22:52 UTC (permalink / raw)
  To: Joshua Clayton
  Cc: linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	Jonathan Corbet, Adrian Remonda,
	linux-doc-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	linux-spi-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 752 bytes --]

On Tue, Nov 17, 2015 at 11:21:12AM -0800, Joshua Clayton wrote:

Please fix your mail client to word wrap within paragraphs at something
substantially less than 80 columns.  Doing this makes your messages much
easier to read and reply to.

> It takes some clutter out of main() whose scope is limited to that little block of code, 
> and because in the next patch we add another (larger)function to the if/else block.

> I don't know if it is valid to say "look at the next commit" for justification, but
> That is the reason.

That's totally fine - just say that it's to support future changes in
this area.  It's good to split out mechanical changes like this from the
more complex changes, you just need to say why they're happening.

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx
@ 2015-11-17 22:52         ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-17 22:52 UTC (permalink / raw)
  To: linux-arm-kernel

On Tue, Nov 17, 2015 at 11:21:12AM -0800, Joshua Clayton wrote:

Please fix your mail client to word wrap within paragraphs at something
substantially less than 80 columns.  Doing this makes your messages much
easier to read and reply to.

> It takes some clutter out of main() whose scope is limited to that little block of code, 
> and because in the next patch we add another (larger)function to the if/else block.

> I don't know if it is valid to say "look at the next commit" for justification, but
> That is the reason.

That's totally fine - just say that it's to support future changes in
this area.  It's good to split out mechanical changes like this from the
more complex changes, you just need to say why they're happening.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20151117/0a2f7f03/attachment.sig>

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH v2 0/6] spi: Add file i/o to spidev_test
  2015-11-17 16:15     ` Joshua Clayton
@ 2015-11-18 22:30       ` Joshua Clayton
  -1 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi; +Cc: linux-kernel, Anton Bondarenko, Joshua Clayton

Add to spidev_test, the ability to read from and write to a file.
Clean up code along the way.
As I finished, I found that a request has been made to move
spidev_test from Documentation to tools, so I did that as well.

Thanks to Mark Brown and Anton Bodarenko for feedback on v1

v2 Changes:
- Move spidev_test to tools in the first commit instead of the last.
- Drop the patch that formats tools/Makefile
- Drop the patch that changes rx to a local variable in transfer()
- Check the result of malloc everywhere it is called.
- Change all the patch subjects to spi: spidev_test
- Removed a check of the spi transfer buffer size, in favor of
    letting the kernel give an error in the ioctl if too big.

Joshua Clayton (6):
  spi: Move spi code from Documentation to tools
  spi: spidev_test: transfer_escaped_string function
  spi: spidev_test: accept input from a file
  spi: spidev_test: output to a file
  spi: spidev_test: check error
  spi: spidev_test: fix whitespace

 Documentation/Makefile          |   2 +-
 Documentation/spi/Makefile      |   8 -
 Documentation/spi/spidev_fdx.c  | 158 ----------------
 Documentation/spi/spidev_test.c | 318 --------------------------------
 tools/Makefile                  |   7 +-
 tools/spi/Makefile              |   4 +
 tools/spi/spidev_fdx.c          | 158 ++++++++++++++++
 tools/spi/spidev_test.c         | 399 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 566 insertions(+), 488 deletions(-)
 delete mode 100644 Documentation/spi/Makefile
 delete mode 100644 Documentation/spi/spidev_fdx.c
 delete mode 100644 Documentation/spi/spidev_test.c
 create mode 100644 tools/spi/Makefile
 create mode 100644 tools/spi/spidev_fdx.c
 create mode 100644 tools/spi/spidev_test.c

-- 
2.5.0


^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH v2 0/6] spi: Add file i/o to spidev_test
@ 2015-11-18 22:30       ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, Anton Bondarenko, Joshua Clayton

Add to spidev_test, the ability to read from and write to a file.
Clean up code along the way.
As I finished, I found that a request has been made to move
spidev_test from Documentation to tools, so I did that as well.

Thanks to Mark Brown and Anton Bodarenko for feedback on v1

v2 Changes:
- Move spidev_test to tools in the first commit instead of the last.
- Drop the patch that formats tools/Makefile
- Drop the patch that changes rx to a local variable in transfer()
- Check the result of malloc everywhere it is called.
- Change all the patch subjects to spi: spidev_test
- Removed a check of the spi transfer buffer size, in favor of
    letting the kernel give an error in the ioctl if too big.

Joshua Clayton (6):
  spi: Move spi code from Documentation to tools
  spi: spidev_test: transfer_escaped_string function
  spi: spidev_test: accept input from a file
  spi: spidev_test: output to a file
  spi: spidev_test: check error
  spi: spidev_test: fix whitespace

 Documentation/Makefile          |   2 +-
 Documentation/spi/Makefile      |   8 -
 Documentation/spi/spidev_fdx.c  | 158 ----------------
 Documentation/spi/spidev_test.c | 318 --------------------------------
 tools/Makefile                  |   7 +-
 tools/spi/Makefile              |   4 +
 tools/spi/spidev_fdx.c          | 158 ++++++++++++++++
 tools/spi/spidev_test.c         | 399 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 566 insertions(+), 488 deletions(-)
 delete mode 100644 Documentation/spi/Makefile
 delete mode 100644 Documentation/spi/spidev_fdx.c
 delete mode 100644 Documentation/spi/spidev_test.c
 create mode 100644 tools/spi/Makefile
 create mode 100644 tools/spi/spidev_fdx.c
 create mode 100644 tools/spi/spidev_test.c

-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 54+ messages in thread

* [PATCH v2 1/6] spi: Move spi code from Documentation to tools
  2015-11-18 22:30       ` Joshua Clayton
  (?)
@ 2015-11-18 22:30       ` Joshua Clayton
  -1 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi; +Cc: linux-kernel, Anton Bondarenko, Joshua Clayton

Jon Corbet requested this code moved with the last changeset,
https://lkml.org/lkml/2015/3/1/144,
but the patch was not applied because it missed the Makefile.
Moved spidev_test, spidev_fdx and their Makefile infrastructure.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 Documentation/Makefile          |   2 +-
 Documentation/spi/Makefile      |   8 -
 Documentation/spi/spidev_fdx.c  | 158 --------------------
 Documentation/spi/spidev_test.c | 318 ----------------------------------------
 tools/Makefile                  |   7 +-
 tools/spi/Makefile              |   4 +
 tools/spi/spidev_fdx.c          | 158 ++++++++++++++++++++
 tools/spi/spidev_test.c         | 318 ++++++++++++++++++++++++++++++++++++++++
 8 files changed, 485 insertions(+), 488 deletions(-)
 delete mode 100644 Documentation/spi/Makefile
 delete mode 100644 Documentation/spi/spidev_fdx.c
 delete mode 100644 Documentation/spi/spidev_test.c
 create mode 100644 tools/spi/Makefile
 create mode 100644 tools/spi/spidev_fdx.c
 create mode 100644 tools/spi/spidev_test.c

diff --git a/Documentation/Makefile b/Documentation/Makefile
index 6883a1b..f642cb9 100644
--- a/Documentation/Makefile
+++ b/Documentation/Makefile
@@ -1,4 +1,4 @@
 subdir-y := accounting arm auxdisplay blackfin connector \
 	filesystems filesystems ia64 laptops mic misc-devices \
-	networking pcmcia prctl ptp spi timers vDSO video4linux \
+	networking pcmcia prctl ptp timers vDSO video4linux \
 	watchdog
diff --git a/Documentation/spi/Makefile b/Documentation/spi/Makefile
deleted file mode 100644
index efa2558..0000000
--- a/Documentation/spi/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-# List of programs to build
-hostprogs-y := spidev_test spidev_fdx
-
-# Tell kbuild to always build the programs
-always := $(hostprogs-y)
-
-HOSTCFLAGS_spidev_test.o += -I$(objtree)/usr/include
-HOSTCFLAGS_spidev_fdx.o += -I$(objtree)/usr/include
diff --git a/Documentation/spi/spidev_fdx.c b/Documentation/spi/spidev_fdx.c
deleted file mode 100644
index 0ea3e51..0000000
--- a/Documentation/spi/spidev_fdx.c
+++ /dev/null
@@ -1,158 +0,0 @@
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include <linux/types.h>
-#include <linux/spi/spidev.h>
-
-
-static int verbose;
-
-static void do_read(int fd, int len)
-{
-	unsigned char	buf[32], *bp;
-	int		status;
-
-	/* read at least 2 bytes, no more than 32 */
-	if (len < 2)
-		len = 2;
-	else if (len > sizeof(buf))
-		len = sizeof(buf);
-	memset(buf, 0, sizeof buf);
-
-	status = read(fd, buf, len);
-	if (status < 0) {
-		perror("read");
-		return;
-	}
-	if (status != len) {
-		fprintf(stderr, "short read\n");
-		return;
-	}
-
-	printf("read(%2d, %2d): %02x %02x,", len, status,
-		buf[0], buf[1]);
-	status -= 2;
-	bp = buf + 2;
-	while (status-- > 0)
-		printf(" %02x", *bp++);
-	printf("\n");
-}
-
-static void do_msg(int fd, int len)
-{
-	struct spi_ioc_transfer	xfer[2];
-	unsigned char		buf[32], *bp;
-	int			status;
-
-	memset(xfer, 0, sizeof xfer);
-	memset(buf, 0, sizeof buf);
-
-	if (len > sizeof buf)
-		len = sizeof buf;
-
-	buf[0] = 0xaa;
-	xfer[0].tx_buf = (unsigned long)buf;
-	xfer[0].len = 1;
-
-	xfer[1].rx_buf = (unsigned long) buf;
-	xfer[1].len = len;
-
-	status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
-	if (status < 0) {
-		perror("SPI_IOC_MESSAGE");
-		return;
-	}
-
-	printf("response(%2d, %2d): ", len, status);
-	for (bp = buf; len; len--)
-		printf(" %02x", *bp++);
-	printf("\n");
-}
-
-static void dumpstat(const char *name, int fd)
-{
-	__u8	lsb, bits;
-	__u32	mode, speed;
-
-	if (ioctl(fd, SPI_IOC_RD_MODE32, &mode) < 0) {
-		perror("SPI rd_mode");
-		return;
-	}
-	if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
-		perror("SPI rd_lsb_fist");
-		return;
-	}
-	if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
-		perror("SPI bits_per_word");
-		return;
-	}
-	if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
-		perror("SPI max_speed_hz");
-		return;
-	}
-
-	printf("%s: spi mode 0x%x, %d bits %sper word, %d Hz max\n",
-		name, mode, bits, lsb ? "(lsb first) " : "", speed);
-}
-
-int main(int argc, char **argv)
-{
-	int		c;
-	int		readcount = 0;
-	int		msglen = 0;
-	int		fd;
-	const char	*name;
-
-	while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
-		switch (c) {
-		case 'm':
-			msglen = atoi(optarg);
-			if (msglen < 0)
-				goto usage;
-			continue;
-		case 'r':
-			readcount = atoi(optarg);
-			if (readcount < 0)
-				goto usage;
-			continue;
-		case 'v':
-			verbose++;
-			continue;
-		case 'h':
-		case '?':
-usage:
-			fprintf(stderr,
-				"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
-				argv[0]);
-			return 1;
-		}
-	}
-
-	if ((optind + 1) != argc)
-		goto usage;
-	name = argv[optind];
-
-	fd = open(name, O_RDWR);
-	if (fd < 0) {
-		perror("open");
-		return 1;
-	}
-
-	dumpstat(name, fd);
-
-	if (msglen)
-		do_msg(fd, msglen);
-
-	if (readcount)
-		do_read(fd, readcount);
-
-	close(fd);
-	return 0;
-}
diff --git a/Documentation/spi/spidev_test.c b/Documentation/spi/spidev_test.c
deleted file mode 100644
index 135b3f5..0000000
--- a/Documentation/spi/spidev_test.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- * SPI testing utility (using spidev driver)
- *
- * Copyright (c) 2007  MontaVista Software, Inc.
- * Copyright (c) 2007  Anton Vorontsov <avorontsov@ru.mvista.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License.
- *
- * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
- */
-
-#include <stdint.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <getopt.h>
-#include <fcntl.h>
-#include <sys/ioctl.h>
-#include <linux/types.h>
-#include <linux/spi/spidev.h>
-
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-
-static void pabort(const char *s)
-{
-	perror(s);
-	abort();
-}
-
-static const char *device = "/dev/spidev1.1";
-static uint32_t mode;
-static uint8_t bits = 8;
-static uint32_t speed = 500000;
-static uint16_t delay;
-static int verbose;
-
-uint8_t default_tx[] = {
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-	0xF0, 0x0D,
-};
-
-uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, };
-char *input_tx;
-
-static void hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
-{
-	int i = 0;
-	const unsigned char *address = src;
-	const unsigned char *line = address;
-	unsigned char c;
-
-	printf("%s | ", prefix);
-	while (length-- > 0) {
-		printf("%02X ", *address++);
-		if (!(++i % line_size) || (length == 0 && i % line_size)) {
-			if (length == 0) {
-				while (i++ % line_size)
-					printf("__ ");
-			}
-			printf(" | ");  /* right close */
-			while (line < address) {
-				c = *line++;
-				printf("%c", (c < 33 || c == 255) ? 0x2E : c);
-			}
-			printf("\n");
-			if (length > 0)
-				printf("%s | ", prefix);
-		}
-	}
-}
-
-/*
- *  Unescape - process hexadecimal escape character
- *      converts shell input "\x23" -> 0x23
- */
-static int unescape(char *_dst, char *_src, size_t len)
-{
-	int ret = 0;
-	char *src = _src;
-	char *dst = _dst;
-	unsigned int ch;
-
-	while (*src) {
-		if (*src == '\\' && *(src+1) == 'x') {
-			sscanf(src + 2, "%2x", &ch);
-			src += 4;
-			*dst++ = (unsigned char)ch;
-		} else {
-			*dst++ = *src++;
-		}
-		ret++;
-	}
-	return ret;
-}
-
-static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
-{
-	int ret;
-
-	struct spi_ioc_transfer tr = {
-		.tx_buf = (unsigned long)tx,
-		.rx_buf = (unsigned long)rx,
-		.len = len,
-		.delay_usecs = delay,
-		.speed_hz = speed,
-		.bits_per_word = bits,
-	};
-
-	if (mode & SPI_TX_QUAD)
-		tr.tx_nbits = 4;
-	else if (mode & SPI_TX_DUAL)
-		tr.tx_nbits = 2;
-	if (mode & SPI_RX_QUAD)
-		tr.rx_nbits = 4;
-	else if (mode & SPI_RX_DUAL)
-		tr.rx_nbits = 2;
-	if (!(mode & SPI_LOOP)) {
-		if (mode & (SPI_TX_QUAD | SPI_TX_DUAL))
-			tr.rx_buf = 0;
-		else if (mode & (SPI_RX_QUAD | SPI_RX_DUAL))
-			tr.tx_buf = 0;
-	}
-
-	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
-	if (ret < 1)
-		pabort("can't send spi message");
-
-	if (verbose)
-		hex_dump(tx, len, 32, "TX");
-	hex_dump(rx, len, 32, "RX");
-}
-
-static void print_usage(const char *prog)
-{
-	printf("Usage: %s [-DsbdlHOLC3]\n", prog);
-	puts("  -D --device   device to use (default /dev/spidev1.1)\n"
-	     "  -s --speed    max speed (Hz)\n"
-	     "  -d --delay    delay (usec)\n"
-	     "  -b --bpw      bits per word \n"
-	     "  -l --loop     loopback\n"
-	     "  -H --cpha     clock phase\n"
-	     "  -O --cpol     clock polarity\n"
-	     "  -L --lsb      least significant bit first\n"
-	     "  -C --cs-high  chip select active high\n"
-	     "  -3 --3wire    SI/SO signals shared\n"
-	     "  -v --verbose  Verbose (show tx buffer)\n"
-	     "  -p            Send data (e.g. \"1234\\xde\\xad\")\n"
-	     "  -N --no-cs    no chip select\n"
-	     "  -R --ready    slave pulls low to pause\n"
-	     "  -2 --dual     dual transfer\n"
-	     "  -4 --quad     quad transfer\n");
-	exit(1);
-}
-
-static void parse_opts(int argc, char *argv[])
-{
-	while (1) {
-		static const struct option lopts[] = {
-			{ "device",  1, 0, 'D' },
-			{ "speed",   1, 0, 's' },
-			{ "delay",   1, 0, 'd' },
-			{ "bpw",     1, 0, 'b' },
-			{ "loop",    0, 0, 'l' },
-			{ "cpha",    0, 0, 'H' },
-			{ "cpol",    0, 0, 'O' },
-			{ "lsb",     0, 0, 'L' },
-			{ "cs-high", 0, 0, 'C' },
-			{ "3wire",   0, 0, '3' },
-			{ "no-cs",   0, 0, 'N' },
-			{ "ready",   0, 0, 'R' },
-			{ "dual",    0, 0, '2' },
-			{ "verbose", 0, 0, 'v' },
-			{ "quad",    0, 0, '4' },
-			{ NULL, 0, 0, 0 },
-		};
-		int c;
-
-		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
-
-		if (c == -1)
-			break;
-
-		switch (c) {
-		case 'D':
-			device = optarg;
-			break;
-		case 's':
-			speed = atoi(optarg);
-			break;
-		case 'd':
-			delay = atoi(optarg);
-			break;
-		case 'b':
-			bits = atoi(optarg);
-			break;
-		case 'l':
-			mode |= SPI_LOOP;
-			break;
-		case 'H':
-			mode |= SPI_CPHA;
-			break;
-		case 'O':
-			mode |= SPI_CPOL;
-			break;
-		case 'L':
-			mode |= SPI_LSB_FIRST;
-			break;
-		case 'C':
-			mode |= SPI_CS_HIGH;
-			break;
-		case '3':
-			mode |= SPI_3WIRE;
-			break;
-		case 'N':
-			mode |= SPI_NO_CS;
-			break;
-		case 'v':
-			verbose = 1;
-			break;
-		case 'R':
-			mode |= SPI_READY;
-			break;
-		case 'p':
-			input_tx = optarg;
-			break;
-		case '2':
-			mode |= SPI_TX_DUAL;
-			break;
-		case '4':
-			mode |= SPI_TX_QUAD;
-			break;
-		default:
-			print_usage(argv[0]);
-			break;
-		}
-	}
-	if (mode & SPI_LOOP) {
-		if (mode & SPI_TX_DUAL)
-			mode |= SPI_RX_DUAL;
-		if (mode & SPI_TX_QUAD)
-			mode |= SPI_RX_QUAD;
-	}
-}
-
-int main(int argc, char *argv[])
-{
-	int ret = 0;
-	int fd;
-	uint8_t *tx;
-	uint8_t *rx;
-	int size;
-
-	parse_opts(argc, argv);
-
-	fd = open(device, O_RDWR);
-	if (fd < 0)
-		pabort("can't open device");
-
-	/*
-	 * spi mode
-	 */
-	ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
-	if (ret == -1)
-		pabort("can't set spi mode");
-
-	ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode);
-	if (ret == -1)
-		pabort("can't get spi mode");
-
-	/*
-	 * bits per word
-	 */
-	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
-	if (ret == -1)
-		pabort("can't set bits per word");
-
-	ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
-	if (ret == -1)
-		pabort("can't get bits per word");
-
-	/*
-	 * max speed hz
-	 */
-	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
-	if (ret == -1)
-		pabort("can't set max speed hz");
-
-	ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
-	if (ret == -1)
-		pabort("can't get max speed hz");
-
-	printf("spi mode: 0x%x\n", mode);
-	printf("bits per word: %d\n", bits);
-	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
-
-	if (input_tx) {
-		size = strlen(input_tx+1);
-		tx = malloc(size);
-		rx = malloc(size);
-		size = unescape((char *)tx, input_tx, size);
-		transfer(fd, tx, rx, size);
-		free(rx);
-		free(tx);
-	} else {
-		transfer(fd, default_tx, default_rx, sizeof(default_tx));
-	}
-
-	close(fd);
-
-	return ret;
-}
diff --git a/tools/Makefile b/tools/Makefile
index 9a617ad..d238a96 100644
--- a/tools/Makefile
+++ b/tools/Makefile
@@ -11,6 +11,7 @@ help:
 	@echo '  lguest     - a minimal 32-bit x86 hypervisor'
 	@echo '  perf       - Linux performance measurement and analysis tool'
 	@echo '  selftests  - various kernel selftests'
+	@echo '  spi        - spi tools'
 	@echo '  turbostat  - Intel CPU idle stats and freq reporting tool'
 	@echo '  usb        - USB testing tools'
 	@echo '  virtio     - vhost test module'
@@ -41,7 +42,7 @@ acpi: FORCE
 cpupower: FORCE
 	$(call descend,power/$@)
 
-cgroup firewire hv guest usb virtio vm net: FORCE
+cgroup firewire hv guest spi usb virtio vm net: FORCE
 	$(call descend,$@)
 
 liblockdep: FORCE
@@ -91,7 +92,7 @@ acpi_clean:
 cpupower_clean:
 	$(call descend,power/cpupower,clean)
 
-cgroup_clean hv_clean firewire_clean lguest_clean usb_clean virtio_clean vm_clean net_clean:
+cgroup_clean hv_clean firewire_clean lguest_clean spi_clean usb_clean virtio_clean vm_clean net_clean:
 	$(call descend,$(@:_clean=),clean)
 
 liblockdep_clean:
@@ -113,7 +114,7 @@ tmon_clean:
 	$(call descend,thermal/tmon,clean)
 
 clean: acpi_clean cgroup_clean cpupower_clean hv_clean firewire_clean lguest_clean \
-		perf_clean selftests_clean turbostat_clean usb_clean virtio_clean \
+		perf_clean selftests_clean spi_clean turbostat_clean usb_clean virtio_clean \
 		vm_clean net_clean x86_energy_perf_policy_clean tmon_clean
 
 .PHONY: FORCE
diff --git a/tools/spi/Makefile b/tools/spi/Makefile
new file mode 100644
index 0000000..cd0db62
--- /dev/null
+++ b/tools/spi/Makefile
@@ -0,0 +1,4 @@
+all: spidev_test spidev_fdx
+
+clean:
+	$(RM) spidev_test spidev_fdx
diff --git a/tools/spi/spidev_fdx.c b/tools/spi/spidev_fdx.c
new file mode 100644
index 0000000..0ea3e51
--- /dev/null
+++ b/tools/spi/spidev_fdx.c
@@ -0,0 +1,158 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include <sys/ioctl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <linux/types.h>
+#include <linux/spi/spidev.h>
+
+
+static int verbose;
+
+static void do_read(int fd, int len)
+{
+	unsigned char	buf[32], *bp;
+	int		status;
+
+	/* read at least 2 bytes, no more than 32 */
+	if (len < 2)
+		len = 2;
+	else if (len > sizeof(buf))
+		len = sizeof(buf);
+	memset(buf, 0, sizeof buf);
+
+	status = read(fd, buf, len);
+	if (status < 0) {
+		perror("read");
+		return;
+	}
+	if (status != len) {
+		fprintf(stderr, "short read\n");
+		return;
+	}
+
+	printf("read(%2d, %2d): %02x %02x,", len, status,
+		buf[0], buf[1]);
+	status -= 2;
+	bp = buf + 2;
+	while (status-- > 0)
+		printf(" %02x", *bp++);
+	printf("\n");
+}
+
+static void do_msg(int fd, int len)
+{
+	struct spi_ioc_transfer	xfer[2];
+	unsigned char		buf[32], *bp;
+	int			status;
+
+	memset(xfer, 0, sizeof xfer);
+	memset(buf, 0, sizeof buf);
+
+	if (len > sizeof buf)
+		len = sizeof buf;
+
+	buf[0] = 0xaa;
+	xfer[0].tx_buf = (unsigned long)buf;
+	xfer[0].len = 1;
+
+	xfer[1].rx_buf = (unsigned long) buf;
+	xfer[1].len = len;
+
+	status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
+	if (status < 0) {
+		perror("SPI_IOC_MESSAGE");
+		return;
+	}
+
+	printf("response(%2d, %2d): ", len, status);
+	for (bp = buf; len; len--)
+		printf(" %02x", *bp++);
+	printf("\n");
+}
+
+static void dumpstat(const char *name, int fd)
+{
+	__u8	lsb, bits;
+	__u32	mode, speed;
+
+	if (ioctl(fd, SPI_IOC_RD_MODE32, &mode) < 0) {
+		perror("SPI rd_mode");
+		return;
+	}
+	if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
+		perror("SPI rd_lsb_fist");
+		return;
+	}
+	if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
+		perror("SPI bits_per_word");
+		return;
+	}
+	if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
+		perror("SPI max_speed_hz");
+		return;
+	}
+
+	printf("%s: spi mode 0x%x, %d bits %sper word, %d Hz max\n",
+		name, mode, bits, lsb ? "(lsb first) " : "", speed);
+}
+
+int main(int argc, char **argv)
+{
+	int		c;
+	int		readcount = 0;
+	int		msglen = 0;
+	int		fd;
+	const char	*name;
+
+	while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
+		switch (c) {
+		case 'm':
+			msglen = atoi(optarg);
+			if (msglen < 0)
+				goto usage;
+			continue;
+		case 'r':
+			readcount = atoi(optarg);
+			if (readcount < 0)
+				goto usage;
+			continue;
+		case 'v':
+			verbose++;
+			continue;
+		case 'h':
+		case '?':
+usage:
+			fprintf(stderr,
+				"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
+				argv[0]);
+			return 1;
+		}
+	}
+
+	if ((optind + 1) != argc)
+		goto usage;
+	name = argv[optind];
+
+	fd = open(name, O_RDWR);
+	if (fd < 0) {
+		perror("open");
+		return 1;
+	}
+
+	dumpstat(name, fd);
+
+	if (msglen)
+		do_msg(fd, msglen);
+
+	if (readcount)
+		do_read(fd, readcount);
+
+	close(fd);
+	return 0;
+}
diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
new file mode 100644
index 0000000..135b3f5
--- /dev/null
+++ b/tools/spi/spidev_test.c
@@ -0,0 +1,318 @@
+/*
+ * SPI testing utility (using spidev driver)
+ *
+ * Copyright (c) 2007  MontaVista Software, Inc.
+ * Copyright (c) 2007  Anton Vorontsov <avorontsov@ru.mvista.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License.
+ *
+ * Cross-compile with cross-gcc -I/path/to/cross-kernel/include
+ */
+
+#include <stdint.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <linux/types.h>
+#include <linux/spi/spidev.h>
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+static void pabort(const char *s)
+{
+	perror(s);
+	abort();
+}
+
+static const char *device = "/dev/spidev1.1";
+static uint32_t mode;
+static uint8_t bits = 8;
+static uint32_t speed = 500000;
+static uint16_t delay;
+static int verbose;
+
+uint8_t default_tx[] = {
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+	0xF0, 0x0D,
+};
+
+uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, };
+char *input_tx;
+
+static void hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
+{
+	int i = 0;
+	const unsigned char *address = src;
+	const unsigned char *line = address;
+	unsigned char c;
+
+	printf("%s | ", prefix);
+	while (length-- > 0) {
+		printf("%02X ", *address++);
+		if (!(++i % line_size) || (length == 0 && i % line_size)) {
+			if (length == 0) {
+				while (i++ % line_size)
+					printf("__ ");
+			}
+			printf(" | ");  /* right close */
+			while (line < address) {
+				c = *line++;
+				printf("%c", (c < 33 || c == 255) ? 0x2E : c);
+			}
+			printf("\n");
+			if (length > 0)
+				printf("%s | ", prefix);
+		}
+	}
+}
+
+/*
+ *  Unescape - process hexadecimal escape character
+ *      converts shell input "\x23" -> 0x23
+ */
+static int unescape(char *_dst, char *_src, size_t len)
+{
+	int ret = 0;
+	char *src = _src;
+	char *dst = _dst;
+	unsigned int ch;
+
+	while (*src) {
+		if (*src == '\\' && *(src+1) == 'x') {
+			sscanf(src + 2, "%2x", &ch);
+			src += 4;
+			*dst++ = (unsigned char)ch;
+		} else {
+			*dst++ = *src++;
+		}
+		ret++;
+	}
+	return ret;
+}
+
+static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
+{
+	int ret;
+
+	struct spi_ioc_transfer tr = {
+		.tx_buf = (unsigned long)tx,
+		.rx_buf = (unsigned long)rx,
+		.len = len,
+		.delay_usecs = delay,
+		.speed_hz = speed,
+		.bits_per_word = bits,
+	};
+
+	if (mode & SPI_TX_QUAD)
+		tr.tx_nbits = 4;
+	else if (mode & SPI_TX_DUAL)
+		tr.tx_nbits = 2;
+	if (mode & SPI_RX_QUAD)
+		tr.rx_nbits = 4;
+	else if (mode & SPI_RX_DUAL)
+		tr.rx_nbits = 2;
+	if (!(mode & SPI_LOOP)) {
+		if (mode & (SPI_TX_QUAD | SPI_TX_DUAL))
+			tr.rx_buf = 0;
+		else if (mode & (SPI_RX_QUAD | SPI_RX_DUAL))
+			tr.tx_buf = 0;
+	}
+
+	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
+	if (ret < 1)
+		pabort("can't send spi message");
+
+	if (verbose)
+		hex_dump(tx, len, 32, "TX");
+	hex_dump(rx, len, 32, "RX");
+}
+
+static void print_usage(const char *prog)
+{
+	printf("Usage: %s [-DsbdlHOLC3]\n", prog);
+	puts("  -D --device   device to use (default /dev/spidev1.1)\n"
+	     "  -s --speed    max speed (Hz)\n"
+	     "  -d --delay    delay (usec)\n"
+	     "  -b --bpw      bits per word \n"
+	     "  -l --loop     loopback\n"
+	     "  -H --cpha     clock phase\n"
+	     "  -O --cpol     clock polarity\n"
+	     "  -L --lsb      least significant bit first\n"
+	     "  -C --cs-high  chip select active high\n"
+	     "  -3 --3wire    SI/SO signals shared\n"
+	     "  -v --verbose  Verbose (show tx buffer)\n"
+	     "  -p            Send data (e.g. \"1234\\xde\\xad\")\n"
+	     "  -N --no-cs    no chip select\n"
+	     "  -R --ready    slave pulls low to pause\n"
+	     "  -2 --dual     dual transfer\n"
+	     "  -4 --quad     quad transfer\n");
+	exit(1);
+}
+
+static void parse_opts(int argc, char *argv[])
+{
+	while (1) {
+		static const struct option lopts[] = {
+			{ "device",  1, 0, 'D' },
+			{ "speed",   1, 0, 's' },
+			{ "delay",   1, 0, 'd' },
+			{ "bpw",     1, 0, 'b' },
+			{ "loop",    0, 0, 'l' },
+			{ "cpha",    0, 0, 'H' },
+			{ "cpol",    0, 0, 'O' },
+			{ "lsb",     0, 0, 'L' },
+			{ "cs-high", 0, 0, 'C' },
+			{ "3wire",   0, 0, '3' },
+			{ "no-cs",   0, 0, 'N' },
+			{ "ready",   0, 0, 'R' },
+			{ "dual",    0, 0, '2' },
+			{ "verbose", 0, 0, 'v' },
+			{ "quad",    0, 0, '4' },
+			{ NULL, 0, 0, 0 },
+		};
+		int c;
+
+		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
+
+		if (c == -1)
+			break;
+
+		switch (c) {
+		case 'D':
+			device = optarg;
+			break;
+		case 's':
+			speed = atoi(optarg);
+			break;
+		case 'd':
+			delay = atoi(optarg);
+			break;
+		case 'b':
+			bits = atoi(optarg);
+			break;
+		case 'l':
+			mode |= SPI_LOOP;
+			break;
+		case 'H':
+			mode |= SPI_CPHA;
+			break;
+		case 'O':
+			mode |= SPI_CPOL;
+			break;
+		case 'L':
+			mode |= SPI_LSB_FIRST;
+			break;
+		case 'C':
+			mode |= SPI_CS_HIGH;
+			break;
+		case '3':
+			mode |= SPI_3WIRE;
+			break;
+		case 'N':
+			mode |= SPI_NO_CS;
+			break;
+		case 'v':
+			verbose = 1;
+			break;
+		case 'R':
+			mode |= SPI_READY;
+			break;
+		case 'p':
+			input_tx = optarg;
+			break;
+		case '2':
+			mode |= SPI_TX_DUAL;
+			break;
+		case '4':
+			mode |= SPI_TX_QUAD;
+			break;
+		default:
+			print_usage(argv[0]);
+			break;
+		}
+	}
+	if (mode & SPI_LOOP) {
+		if (mode & SPI_TX_DUAL)
+			mode |= SPI_RX_DUAL;
+		if (mode & SPI_TX_QUAD)
+			mode |= SPI_RX_QUAD;
+	}
+}
+
+int main(int argc, char *argv[])
+{
+	int ret = 0;
+	int fd;
+	uint8_t *tx;
+	uint8_t *rx;
+	int size;
+
+	parse_opts(argc, argv);
+
+	fd = open(device, O_RDWR);
+	if (fd < 0)
+		pabort("can't open device");
+
+	/*
+	 * spi mode
+	 */
+	ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
+	if (ret == -1)
+		pabort("can't set spi mode");
+
+	ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode);
+	if (ret == -1)
+		pabort("can't get spi mode");
+
+	/*
+	 * bits per word
+	 */
+	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
+	if (ret == -1)
+		pabort("can't set bits per word");
+
+	ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
+	if (ret == -1)
+		pabort("can't get bits per word");
+
+	/*
+	 * max speed hz
+	 */
+	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
+	if (ret == -1)
+		pabort("can't set max speed hz");
+
+	ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
+	if (ret == -1)
+		pabort("can't get max speed hz");
+
+	printf("spi mode: 0x%x\n", mode);
+	printf("bits per word: %d\n", bits);
+	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
+
+	if (input_tx) {
+		size = strlen(input_tx+1);
+		tx = malloc(size);
+		rx = malloc(size);
+		size = unescape((char *)tx, input_tx, size);
+		transfer(fd, tx, rx, size);
+		free(rx);
+		free(tx);
+	} else {
+		transfer(fd, default_tx, default_rx, sizeof(default_tx));
+	}
+
+	close(fd);
+
+	return ret;
+}
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH v2 2/6] spi: spidev_test: transfer_escaped_string function
  2015-11-18 22:30       ` Joshua Clayton
  (?)
  (?)
@ 2015-11-18 22:30       ` Joshua Clayton
       [not found]         ` <b0719c2739aabcd9894e85d82cbae21fcf83df3a.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi; +Cc: linux-kernel, Anton Bondarenko, Joshua Clayton

Move the input_tx code into its own small function.
This cleans up some variables from main() that are used only here.
While we are at it, check malloc calls instead of assuming they succeed.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 tools/spi/spidev_test.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 135b3f5..f9d2957 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -249,13 +249,30 @@ static void parse_opts(int argc, char *argv[])
 	}
 }
 
+static void transfer_escaped_string(int fd, char *str)
+{
+	size_t size = strlen(str + 1);
+	uint8_t *tx;
+	uint8_t *rx;
+
+	tx = malloc(size);
+	if (!tx)
+		pabort("can't allocate tx buffer");
+
+	rx = malloc(size);
+	if (!rx)
+		pabort("can't allocate rx buffer");
+
+	size = unescape((char *)tx, str, size);
+	transfer(fd, tx, rx, size);
+	free(rx);
+	free(tx);
+}
+
 int main(int argc, char *argv[])
 {
 	int ret = 0;
 	int fd;
-	uint8_t *tx;
-	uint8_t *rx;
-	int size;
 
 	parse_opts(argc, argv);
 
@@ -300,17 +317,10 @@ int main(int argc, char *argv[])
 	printf("bits per word: %d\n", bits);
 	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 
-	if (input_tx) {
-		size = strlen(input_tx+1);
-		tx = malloc(size);
-		rx = malloc(size);
-		size = unescape((char *)tx, input_tx, size);
-		transfer(fd, tx, rx, size);
-		free(rx);
-		free(tx);
-	} else {
+	if (input_tx)
+		transfer_escaped_string(fd, input_tx);
+	else
 		transfer(fd, default_tx, default_rx, sizeof(default_tx));
-	}
 
 	close(fd);
 
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH v2 3/6] spi: spidev_test: accept input from a file
  2015-11-18 22:30       ` Joshua Clayton
                         ` (2 preceding siblings ...)
  (?)
@ 2015-11-18 22:30       ` Joshua Clayton
       [not found]         ` <783ea7346741b23f17c73a13f03f64ac17de8c2e.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi; +Cc: linux-kernel, Anton Bondarenko, Joshua Clayton

Add input file support to facilitate testing larger data.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 tools/spi/spidev_test.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 47 insertions(+), 1 deletion(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index f9d2957..71a45a4 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -19,6 +19,7 @@
 #include <getopt.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
+#include <sys/stat.h>
 #include <linux/types.h>
 #include <linux/spi/spidev.h>
 
@@ -33,6 +34,7 @@ static void pabort(const char *s)
 static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
+static char *input_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -144,6 +146,7 @@ static void print_usage(const char *prog)
 	     "  -s --speed    max speed (Hz)\n"
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
+	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -167,6 +170,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "speed",   1, 0, 's' },
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
+			{ "input",   1, 0, 'i' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -182,7 +186,8 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
+		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+				lopts, NULL);
 
 		if (c == -1)
 			break;
@@ -200,6 +205,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'b':
 			bits = atoi(optarg);
 			break;
+		case 'i':
+			input_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
@@ -269,6 +277,39 @@ static void transfer_escaped_string(int fd, char *str)
 	free(tx);
 }
 
+static void transfer_file(int fd, char *filename)
+{
+	ssize_t bytes;
+	struct stat sb;
+	int tx_fd;
+	uint8_t *tx;
+	uint8_t *rx;
+
+	if (stat(filename, &sb) == -1)
+		pabort("can't stat input file");
+
+	tx_fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		pabort("can't open input file");
+
+	tx = malloc(sb.st_size);
+	if (!tx)
+		pabort("can't allocate tx buffer");
+
+	rx = malloc(sb.st_size);
+	if (!rx)
+		pabort("can't allocate rx buffer");
+
+	bytes = read(tx_fd, tx, sb.st_size);
+	if (bytes != sb.st_size)
+		pabort("failed to read input file");
+
+	transfer(fd, tx, rx, sb.st_size);
+	free(rx);
+	free(tx);
+	close(tx_fd);
+}
+
 int main(int argc, char *argv[])
 {
 	int ret = 0;
@@ -317,8 +358,13 @@ int main(int argc, char *argv[])
 	printf("bits per word: %d\n", bits);
 	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 
+	if (input_tx && input_file)
+		pabort("only one of -p and --input may be selected");
+
 	if (input_tx)
 		transfer_escaped_string(fd, input_tx);
+	else if (input_file)
+		transfer_file(fd, input_file);
 	else
 		transfer(fd, default_tx, default_rx, sizeof(default_tx));
 
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH v2 4/6] spi: spidev_test: output to a file
@ 2015-11-18 22:30         ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi; +Cc: linux-kernel, Anton Bondarenko, Joshua Clayton

For testing of larger data transfers, output unmodified data
directly to a file.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 tools/spi/spidev_test.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 71a45a4..02fc3a4 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -35,6 +35,7 @@ static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
 static char *input_file;
+static char *output_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -105,7 +106,7 @@ static int unescape(char *_dst, char *_src, size_t len)
 static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 {
 	int ret;
-
+	int out_fd;
 	struct spi_ioc_transfer tr = {
 		.tx_buf = (unsigned long)tx,
 		.rx_buf = (unsigned long)rx,
@@ -136,7 +137,21 @@ static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 
 	if (verbose)
 		hex_dump(tx, len, 32, "TX");
-	hex_dump(rx, len, 32, "RX");
+
+	if (output_file) {
+		out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+		if (out_fd < 0)
+			pabort("could not open output file");
+
+		ret = write(out_fd, rx, len);
+		if (ret != len)
+			pabort("not all bytes written to utput file");
+
+		close(out_fd);
+	}
+
+	if (verbose || !output_file)
+		hex_dump(rx, len, 32, "RX");
 }
 
 static void print_usage(const char *prog)
@@ -147,6 +162,7 @@ static void print_usage(const char *prog)
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
+	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -171,6 +187,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
 			{ "input",   1, 0, 'i' },
+			{ "output",  1, 0, 'o' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -186,7 +203,7 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+		c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v",
 				lopts, NULL);
 
 		if (c == -1)
@@ -208,6 +225,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'i':
 			input_file = optarg;
 			break;
+		case 'o':
+			output_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH v2 4/6] spi: spidev_test: output to a file
@ 2015-11-18 22:30         ` Joshua Clayton
  0 siblings, 0 replies; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, Anton Bondarenko, Joshua Clayton

For testing of larger data transfers, output unmodified data
directly to a file.

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 tools/spi/spidev_test.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 71a45a4..02fc3a4 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -35,6 +35,7 @@ static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
 static char *input_file;
+static char *output_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -105,7 +106,7 @@ static int unescape(char *_dst, char *_src, size_t len)
 static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 {
 	int ret;
-
+	int out_fd;
 	struct spi_ioc_transfer tr = {
 		.tx_buf = (unsigned long)tx,
 		.rx_buf = (unsigned long)rx,
@@ -136,7 +137,21 @@ static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 
 	if (verbose)
 		hex_dump(tx, len, 32, "TX");
-	hex_dump(rx, len, 32, "RX");
+
+	if (output_file) {
+		out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+		if (out_fd < 0)
+			pabort("could not open output file");
+
+		ret = write(out_fd, rx, len);
+		if (ret != len)
+			pabort("not all bytes written to utput file");
+
+		close(out_fd);
+	}
+
+	if (verbose || !output_file)
+		hex_dump(rx, len, 32, "RX");
 }
 
 static void print_usage(const char *prog)
@@ -147,6 +162,7 @@ static void print_usage(const char *prog)
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
+	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -171,6 +187,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
 			{ "input",   1, 0, 'i' },
+			{ "output",  1, 0, 'o' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -186,7 +203,7 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+		c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v",
 				lopts, NULL);
 
 		if (c == -1)
@@ -208,6 +225,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'i':
 			input_file = optarg;
 			break;
+		case 'o':
+			output_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
-- 
2.5.0

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH v2 5/6] spi: spidev_test: check error
  2015-11-18 22:30       ` Joshua Clayton
                         ` (4 preceding siblings ...)
  (?)
@ 2015-11-18 22:30       ` Joshua Clayton
       [not found]         ` <2bbb0374d7fd390a04ceb8d7b552f1a8d946c0f0.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi; +Cc: linux-kernel, Anton Bondarenko, Joshua Clayton

Check the result of sscanf to verify a result was found.
report and error and abort if pattern was not found.

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 tools/spi/spidev_test.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 02fc3a4..322370d 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -86,13 +86,17 @@ static void hex_dump(const void *src, size_t length, size_t line_size, char *pre
 static int unescape(char *_dst, char *_src, size_t len)
 {
 	int ret = 0;
+	int match;
 	char *src = _src;
 	char *dst = _dst;
 	unsigned int ch;
 
 	while (*src) {
 		if (*src == '\\' && *(src+1) == 'x') {
-			sscanf(src + 2, "%2x", &ch);
+			match = sscanf(src + 2, "%2x", &ch);
+			if (!match)
+				pabort("malformed input string");
+
 			src += 4;
 			*dst++ = (unsigned char)ch;
 		} else {
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* [PATCH v2 6/6] spi: spidev_test: fix whitespace
  2015-11-18 22:30       ` Joshua Clayton
                         ` (5 preceding siblings ...)
  (?)
@ 2015-11-18 22:30       ` Joshua Clayton
       [not found]         ` <0365b51d6bfd3002287a1ebe382e58a2766aa2d2.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  -1 siblings, 1 reply; 54+ messages in thread
From: Joshua Clayton @ 2015-11-18 22:30 UTC (permalink / raw)
  To: Mark Brown, linux-spi; +Cc: linux-kernel, Anton Bondarenko, Joshua Clayton

Signed-off-by: Joshua Clayton <stillcompiling@gmail.com>
---
 tools/spi/spidev_test.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 322370d..eddfc33 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -52,7 +52,8 @@ uint8_t default_tx[] = {
 uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, };
 char *input_tx;
 
-static void hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
+static void hex_dump(const void *src, size_t length, size_t line_size,
+		     char *prefix)
 {
 	int i = 0;
 	const unsigned char *address = src;
@@ -164,7 +165,7 @@ static void print_usage(const char *prog)
 	puts("  -D --device   device to use (default /dev/spidev1.1)\n"
 	     "  -s --speed    max speed (Hz)\n"
 	     "  -d --delay    delay (usec)\n"
-	     "  -b --bpw      bits per word \n"
+	     "  -b --bpw      bits per word\n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
 	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Applied "spi: spidev_test: fix whitespace" to the spi tree
       [not found]         ` <0365b51d6bfd3002287a1ebe382e58a2766aa2d2.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-11-23 14:54           ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-23 14:54 UTC (permalink / raw)
  To: Joshua Clayton, Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA

The patch

   spi: spidev_test: fix whitespace

has been applied to the spi tree at

   git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From b2cfc90428f1c24ce4920f06b584bd05c62741e6 Mon Sep 17 00:00:00 2001
From: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: Wed, 18 Nov 2015 14:30:42 -0800
Subject: [PATCH] spi: spidev_test: fix whitespace

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 tools/spi/spidev_test.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 322370dbc770..eddfc336a960 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -52,7 +52,8 @@ uint8_t default_tx[] = {
 uint8_t default_rx[ARRAY_SIZE(default_tx)] = {0, };
 char *input_tx;
 
-static void hex_dump(const void *src, size_t length, size_t line_size, char *prefix)
+static void hex_dump(const void *src, size_t length, size_t line_size,
+		     char *prefix)
 {
 	int i = 0;
 	const unsigned char *address = src;
@@ -164,7 +165,7 @@ static void print_usage(const char *prog)
 	puts("  -D --device   device to use (default /dev/spidev1.1)\n"
 	     "  -s --speed    max speed (Hz)\n"
 	     "  -d --delay    delay (usec)\n"
-	     "  -b --bpw      bits per word \n"
+	     "  -b --bpw      bits per word\n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
 	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Applied "spi: spidev_test: check error" to the spi tree
       [not found]         ` <2bbb0374d7fd390a04ceb8d7b552f1a8d946c0f0.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-11-23 14:54           ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-23 14:54 UTC (permalink / raw)
  To: Joshua Clayton, Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA

The patch

   spi: spidev_test: check error

has been applied to the spi tree at

   git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From a20874f78be633b9e3a505d5f191735188b110a5 Mon Sep 17 00:00:00 2001
From: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: Wed, 18 Nov 2015 14:30:41 -0800
Subject: [PATCH] spi: spidev_test: check error

Check the result of sscanf to verify a result was found.
report and error and abort if pattern was not found.

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 tools/spi/spidev_test.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 02fc3a44901b..322370dbc770 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -86,13 +86,17 @@ static void hex_dump(const void *src, size_t length, size_t line_size, char *pre
 static int unescape(char *_dst, char *_src, size_t len)
 {
 	int ret = 0;
+	int match;
 	char *src = _src;
 	char *dst = _dst;
 	unsigned int ch;
 
 	while (*src) {
 		if (*src == '\\' && *(src+1) == 'x') {
-			sscanf(src + 2, "%2x", &ch);
+			match = sscanf(src + 2, "%2x", &ch);
+			if (!match)
+				pabort("malformed input string");
+
 			src += 4;
 			*dst++ = (unsigned char)ch;
 		} else {
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Applied "spi: spidev_test: output to a file" to the spi tree
       [not found]         ` <9ef02d085de706dfbf7eb57370ce33f076dfd9ce.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-11-23 14:54           ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-23 14:54 UTC (permalink / raw)
  To: Joshua Clayton, Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA

The patch

   spi: spidev_test: output to a file

has been applied to the spi tree at

   git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 983b27886a3c7f6eff4e987ddba932da74703f4e Mon Sep 17 00:00:00 2001
From: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: Wed, 18 Nov 2015 14:30:40 -0800
Subject: [PATCH] spi: spidev_test: output to a file

For testing of larger data transfers, output unmodified data
directly to a file.

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 tools/spi/spidev_test.c | 26 +++++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 71a45a4d7d49..02fc3a44901b 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -35,6 +35,7 @@ static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
 static char *input_file;
+static char *output_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -105,7 +106,7 @@ static int unescape(char *_dst, char *_src, size_t len)
 static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 {
 	int ret;
-
+	int out_fd;
 	struct spi_ioc_transfer tr = {
 		.tx_buf = (unsigned long)tx,
 		.rx_buf = (unsigned long)rx,
@@ -136,7 +137,21 @@ static void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
 
 	if (verbose)
 		hex_dump(tx, len, 32, "TX");
-	hex_dump(rx, len, 32, "RX");
+
+	if (output_file) {
+		out_fd = open(output_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+		if (out_fd < 0)
+			pabort("could not open output file");
+
+		ret = write(out_fd, rx, len);
+		if (ret != len)
+			pabort("not all bytes written to utput file");
+
+		close(out_fd);
+	}
+
+	if (verbose || !output_file)
+		hex_dump(rx, len, 32, "RX");
 }
 
 static void print_usage(const char *prog)
@@ -147,6 +162,7 @@ static void print_usage(const char *prog)
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
 	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
+	     "  -o --output   output data to a file (e.g. \"results.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -171,6 +187,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
 			{ "input",   1, 0, 'i' },
+			{ "output",  1, 0, 'o' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -186,7 +203,7 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+		c = getopt_long(argc, argv, "D:s:d:b:i:o:lHOLC3NR24p:v",
 				lopts, NULL);
 
 		if (c == -1)
@@ -208,6 +225,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'i':
 			input_file = optarg;
 			break;
+		case 'o':
+			output_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Applied "spi: spidev_test: accept input from a file" to the spi tree
       [not found]         ` <783ea7346741b23f17c73a13f03f64ac17de8c2e.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-11-23 14:54           ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-23 14:54 UTC (permalink / raw)
  To: Joshua Clayton, Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA

The patch

   spi: spidev_test: accept input from a file

has been applied to the spi tree at

   git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 7af475a5b55e8e47327818e8133fe22204c1fc4d Mon Sep 17 00:00:00 2001
From: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: Wed, 18 Nov 2015 14:30:39 -0800
Subject: [PATCH] spi: spidev_test: accept input from a file

Add input file support to facilitate testing larger data.

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 tools/spi/spidev_test.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 47 insertions(+), 1 deletion(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index f9d2957e538b..71a45a4d7d49 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -19,6 +19,7 @@
 #include <getopt.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
+#include <sys/stat.h>
 #include <linux/types.h>
 #include <linux/spi/spidev.h>
 
@@ -33,6 +34,7 @@ static void pabort(const char *s)
 static const char *device = "/dev/spidev1.1";
 static uint32_t mode;
 static uint8_t bits = 8;
+static char *input_file;
 static uint32_t speed = 500000;
 static uint16_t delay;
 static int verbose;
@@ -144,6 +146,7 @@ static void print_usage(const char *prog)
 	     "  -s --speed    max speed (Hz)\n"
 	     "  -d --delay    delay (usec)\n"
 	     "  -b --bpw      bits per word \n"
+	     "  -i --input    input data from a file (e.g. \"test.bin\")\n"
 	     "  -l --loop     loopback\n"
 	     "  -H --cpha     clock phase\n"
 	     "  -O --cpol     clock polarity\n"
@@ -167,6 +170,7 @@ static void parse_opts(int argc, char *argv[])
 			{ "speed",   1, 0, 's' },
 			{ "delay",   1, 0, 'd' },
 			{ "bpw",     1, 0, 'b' },
+			{ "input",   1, 0, 'i' },
 			{ "loop",    0, 0, 'l' },
 			{ "cpha",    0, 0, 'H' },
 			{ "cpol",    0, 0, 'O' },
@@ -182,7 +186,8 @@ static void parse_opts(int argc, char *argv[])
 		};
 		int c;
 
-		c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24p:v", lopts, NULL);
+		c = getopt_long(argc, argv, "D:s:d:b:i:lHOLC3NR24p:v",
+				lopts, NULL);
 
 		if (c == -1)
 			break;
@@ -200,6 +205,9 @@ static void parse_opts(int argc, char *argv[])
 		case 'b':
 			bits = atoi(optarg);
 			break;
+		case 'i':
+			input_file = optarg;
+			break;
 		case 'l':
 			mode |= SPI_LOOP;
 			break;
@@ -269,6 +277,39 @@ static void transfer_escaped_string(int fd, char *str)
 	free(tx);
 }
 
+static void transfer_file(int fd, char *filename)
+{
+	ssize_t bytes;
+	struct stat sb;
+	int tx_fd;
+	uint8_t *tx;
+	uint8_t *rx;
+
+	if (stat(filename, &sb) == -1)
+		pabort("can't stat input file");
+
+	tx_fd = open(filename, O_RDONLY);
+	if (fd < 0)
+		pabort("can't open input file");
+
+	tx = malloc(sb.st_size);
+	if (!tx)
+		pabort("can't allocate tx buffer");
+
+	rx = malloc(sb.st_size);
+	if (!rx)
+		pabort("can't allocate rx buffer");
+
+	bytes = read(tx_fd, tx, sb.st_size);
+	if (bytes != sb.st_size)
+		pabort("failed to read input file");
+
+	transfer(fd, tx, rx, sb.st_size);
+	free(rx);
+	free(tx);
+	close(tx_fd);
+}
+
 int main(int argc, char *argv[])
 {
 	int ret = 0;
@@ -317,8 +358,13 @@ int main(int argc, char *argv[])
 	printf("bits per word: %d\n", bits);
 	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 
+	if (input_tx && input_file)
+		pabort("only one of -p and --input may be selected");
+
 	if (input_tx)
 		transfer_escaped_string(fd, input_tx);
+	else if (input_file)
+		transfer_file(fd, input_file);
 	else
 		transfer(fd, default_tx, default_rx, sizeof(default_tx));
 
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

* Applied "spi: spidev_test: transfer_escaped_string function" to the spi tree
       [not found]         ` <b0719c2739aabcd9894e85d82cbae21fcf83df3a.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2015-11-23 14:54           ` Mark Brown
  0 siblings, 0 replies; 54+ messages in thread
From: Mark Brown @ 2015-11-23 14:54 UTC (permalink / raw)
  To: Joshua Clayton, Mark Brown; +Cc: linux-spi-u79uwXL29TY76Z2rM5mHXA

The patch

   spi: spidev_test: transfer_escaped_string function

has been applied to the spi tree at

   git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 5c437a401b824399b6fa7342c66b675ebb7af43e Mon Sep 17 00:00:00 2001
From: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Date: Wed, 18 Nov 2015 14:30:38 -0800
Subject: [PATCH] spi: spidev_test: transfer_escaped_string function

Move the input_tx code into its own small function.
This cleans up some variables from main() that are used only here.
While we are at it, check malloc calls instead of assuming they succeed.

Signed-off-by: Joshua Clayton <stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Signed-off-by: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 tools/spi/spidev_test.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/tools/spi/spidev_test.c b/tools/spi/spidev_test.c
index 135b3f592b83..f9d2957e538b 100644
--- a/tools/spi/spidev_test.c
+++ b/tools/spi/spidev_test.c
@@ -249,13 +249,30 @@ static void parse_opts(int argc, char *argv[])
 	}
 }
 
+static void transfer_escaped_string(int fd, char *str)
+{
+	size_t size = strlen(str + 1);
+	uint8_t *tx;
+	uint8_t *rx;
+
+	tx = malloc(size);
+	if (!tx)
+		pabort("can't allocate tx buffer");
+
+	rx = malloc(size);
+	if (!rx)
+		pabort("can't allocate rx buffer");
+
+	size = unescape((char *)tx, str, size);
+	transfer(fd, tx, rx, size);
+	free(rx);
+	free(tx);
+}
+
 int main(int argc, char *argv[])
 {
 	int ret = 0;
 	int fd;
-	uint8_t *tx;
-	uint8_t *rx;
-	int size;
 
 	parse_opts(argc, argv);
 
@@ -300,17 +317,10 @@ int main(int argc, char *argv[])
 	printf("bits per word: %d\n", bits);
 	printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
 
-	if (input_tx) {
-		size = strlen(input_tx+1);
-		tx = malloc(size);
-		rx = malloc(size);
-		size = unescape((char *)tx, input_tx, size);
-		transfer(fd, tx, rx, size);
-		free(rx);
-		free(tx);
-	} else {
+	if (input_tx)
+		transfer_escaped_string(fd, input_tx);
+	else
 		transfer(fd, default_tx, default_rx, sizeof(default_tx));
-	}
 
 	close(fd);
 
-- 
2.6.2

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 54+ messages in thread

end of thread, other threads:[~2015-11-23 14:54 UTC | newest]

Thread overview: 54+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-17 15:24 [PATCH 0/8] spi: Add file i/o to spidev_test Joshua Clayton
2015-11-17 15:24 ` Joshua Clayton
2015-11-17 15:24 ` [PATCH 1/8] Documentation/spi/spidev_test.c: use one rx buffer Joshua Clayton
2015-11-17 17:41   ` Mark Brown
2015-11-17 17:41     ` Mark Brown
2015-11-17 18:58     ` Joshua Clayton
2015-11-17 18:58       ` Joshua Clayton
2015-11-17 18:58       ` Joshua Clayton
2015-11-17 15:24 ` [PATCH 2/8] Documentation/spi/spidev_test.c: clean up input_tx Joshua Clayton
2015-11-17 17:43   ` Mark Brown
2015-11-17 19:21     ` Joshua Clayton
2015-11-17 19:21       ` Joshua Clayton
2015-11-17 19:21       ` Joshua Clayton
2015-11-17 22:52       ` Mark Brown
2015-11-17 22:52         ` Mark Brown
2015-11-17 22:52         ` Mark Brown
2015-11-17 15:24 ` [PATCH 3/8] Documentation/spi/spidev_test.c: accept input from a file Joshua Clayton
2015-11-17 18:26   ` Anton Bondarenko
2015-11-17 18:46     ` Mark Brown
2015-11-17 19:28     ` Joshua Clayton
2015-11-17 19:28       ` Joshua Clayton
2015-11-17 19:28       ` Joshua Clayton
2015-11-17 15:24 ` [PATCH 4/8] Documentation/spi/spidev_test.c: output to " Joshua Clayton
2015-11-17 15:24   ` Joshua Clayton
2015-11-17 15:24 ` [PATCH 5/8] Documentation/spi/spidev_test.c: check error Joshua Clayton
2015-11-17 15:24   ` Joshua Clayton
2015-11-17 15:24 ` [PATCH 6/8] Documentation/spi/spidev_test.c: fix whitespace Joshua Clayton
2015-11-17 15:24 ` [PATCH 7/8] tools/Makefile: minor whitespace cleanup Joshua Clayton
2015-11-17 18:09   ` Mark Brown
2015-11-17 18:09     ` Mark Brown
2015-11-17 19:41     ` Joshua Clayton
2015-11-17 19:41       ` Joshua Clayton
2015-11-17 15:24 ` [PATCH 8/8] spi: Move spi code from Documentation to tools Joshua Clayton
2015-11-17 18:11   ` Mark Brown
2015-11-17 18:11     ` Mark Brown
2015-11-17 15:37 ` [PATCH 0/8] spi: Add file i/o to spidev_test Mark Brown
2015-11-17 16:15   ` Joshua Clayton
2015-11-17 16:15     ` Joshua Clayton
2015-11-17 16:53     ` Mark Brown
2015-11-17 16:53       ` Mark Brown
2015-11-18 22:30     ` [PATCH v2 0/6] " Joshua Clayton
2015-11-18 22:30       ` Joshua Clayton
2015-11-18 22:30       ` [PATCH v2 1/6] spi: Move spi code from Documentation to tools Joshua Clayton
2015-11-18 22:30       ` [PATCH v2 2/6] spi: spidev_test: transfer_escaped_string function Joshua Clayton
     [not found]         ` <b0719c2739aabcd9894e85d82cbae21fcf83df3a.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-11-23 14:54           ` Applied "spi: spidev_test: transfer_escaped_string function" to the spi tree Mark Brown
2015-11-18 22:30       ` [PATCH v2 3/6] spi: spidev_test: accept input from a file Joshua Clayton
     [not found]         ` <783ea7346741b23f17c73a13f03f64ac17de8c2e.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-11-23 14:54           ` Applied "spi: spidev_test: accept input from a file" to the spi tree Mark Brown
2015-11-18 22:30       ` [PATCH v2 4/6] spi: spidev_test: output to a file Joshua Clayton
2015-11-18 22:30         ` Joshua Clayton
     [not found]         ` <9ef02d085de706dfbf7eb57370ce33f076dfd9ce.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-11-23 14:54           ` Applied "spi: spidev_test: output to a file" to the spi tree Mark Brown
2015-11-18 22:30       ` [PATCH v2 5/6] spi: spidev_test: check error Joshua Clayton
     [not found]         ` <2bbb0374d7fd390a04ceb8d7b552f1a8d946c0f0.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-11-23 14:54           ` Applied "spi: spidev_test: check error" to the spi tree Mark Brown
2015-11-18 22:30       ` [PATCH v2 6/6] spi: spidev_test: fix whitespace Joshua Clayton
     [not found]         ` <0365b51d6bfd3002287a1ebe382e58a2766aa2d2.1447880230.git.stillcompiling-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-11-23 14:54           ` Applied "spi: spidev_test: fix whitespace" to the spi tree Mark Brown

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.