Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: spidev_test: Add support for Dual/Quad SPI Transfers

Signed-off-by: Geert Uytterhoeven <geert+renesas@linux-m68k.org>
Signed-off-by: Mark Brown <broonie@linaro.org>

authored by

Geert Uytterhoeven and committed by
Mark Brown
c2e78c34 dc64d39b

+37 -6
+37 -6
Documentation/spi/spidev_test.c
··· 30 30 } 31 31 32 32 static const char *device = "/dev/spidev1.1"; 33 - static uint8_t mode; 33 + static uint32_t mode; 34 34 static uint8_t bits = 8; 35 35 static uint32_t speed = 500000; 36 36 static uint16_t delay; ··· 56 56 .speed_hz = speed, 57 57 .bits_per_word = bits, 58 58 }; 59 + 60 + if (mode & SPI_TX_QUAD) 61 + tr.tx_nbits = 4; 62 + else if (mode & SPI_TX_DUAL) 63 + tr.tx_nbits = 2; 64 + if (mode & SPI_RX_QUAD) 65 + tr.rx_nbits = 4; 66 + else if (mode & SPI_RX_DUAL) 67 + tr.rx_nbits = 2; 68 + if (!(mode & SPI_LOOP)) { 69 + if (mode & (SPI_TX_QUAD | SPI_TX_DUAL)) 70 + tr.rx_buf = 0; 71 + else if (mode & (SPI_RX_QUAD | SPI_RX_DUAL)) 72 + tr.tx_buf = 0; 73 + } 59 74 60 75 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); 61 76 if (ret < 1) ··· 98 83 " -C --cs-high chip select active high\n" 99 84 " -3 --3wire SI/SO signals shared\n" 100 85 " -N --no-cs no chip select\n" 101 - " -R --ready slave pulls low to pause\n"); 86 + " -R --ready slave pulls low to pause\n" 87 + " -2 --dual dual transfer\n" 88 + " -4 --quad quad transfer\n"); 102 89 exit(1); 103 90 } 104 91 ··· 120 103 { "3wire", 0, 0, '3' }, 121 104 { "no-cs", 0, 0, 'N' }, 122 105 { "ready", 0, 0, 'R' }, 106 + { "dual", 0, 0, '2' }, 107 + { "quad", 0, 0, '4' }, 123 108 { NULL, 0, 0, 0 }, 124 109 }; 125 110 int c; 126 111 127 - c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL); 112 + c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24", lopts, NULL); 128 113 129 114 if (c == -1) 130 115 break; ··· 168 149 case 'R': 169 150 mode |= SPI_READY; 170 151 break; 152 + case '2': 153 + mode |= SPI_TX_DUAL; 154 + break; 155 + case '4': 156 + mode |= SPI_TX_QUAD; 157 + break; 171 158 default: 172 159 print_usage(argv[0]); 173 160 break; 174 161 } 162 + } 163 + if (mode & SPI_LOOP) { 164 + if (mode & SPI_TX_DUAL) 165 + mode |= SPI_RX_DUAL; 166 + if (mode & SPI_TX_QUAD) 167 + mode |= SPI_RX_QUAD; 175 168 } 176 169 } 177 170 ··· 201 170 /* 202 171 * spi mode 203 172 */ 204 - ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); 173 + ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode); 205 174 if (ret == -1) 206 175 pabort("can't set spi mode"); 207 176 208 - ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); 177 + ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode); 209 178 if (ret == -1) 210 179 pabort("can't get spi mode"); 211 180 ··· 231 200 if (ret == -1) 232 201 pabort("can't get max speed hz"); 233 202 234 - printf("spi mode: %d\n", mode); 203 + printf("spi mode: 0x%x\n", mode); 235 204 printf("bits per word: %d\n", bits); 236 205 printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); 237 206