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

Merge remote-tracking branches 'spi/topic/s3c64xx', 'spi/topic/sc18is602', 'spi/topic/sh-hspi', 'spi/topic/sh-msiof', 'spi/topic/sh-sci', 'spi/topic/sirf' and 'spi/topic/spidev' into spi-next

+448 -533
+25 -3
Documentation/devicetree/bindings/spi/sh-hspi.txt
··· 1 1 Renesas HSPI. 2 2 3 3 Required properties: 4 - - compatible : "renesas,hspi" 5 - - reg : Offset and length of the register set for the device 6 - - interrupts : interrupt line used by HSPI 4 + - compatible : "renesas,hspi-<soctype>", "renesas,hspi" as fallback. 5 + Examples with soctypes are: 6 + - "renesas,hspi-r8a7778" (R-Car M1) 7 + - "renesas,hspi-r8a7779" (R-Car H1) 8 + - reg : Offset and length of the register set for the device 9 + - interrupt-parent : The phandle for the interrupt controller that 10 + services interrupts for this device 11 + - interrupts : Interrupt specifier 12 + - #address-cells : Must be <1> 13 + - #size-cells : Must be <0> 14 + 15 + Pinctrl properties might be needed, too. See 16 + Documentation/devicetree/bindings/pinctrl/renesas,*. 17 + 18 + Example: 19 + 20 + hspi0: spi@fffc7000 { 21 + compatible = "renesas,hspi-r8a7778", "renesas,hspi"; 22 + reg = <0xfffc7000 0x18>; 23 + interrupt-parent = <&gic>; 24 + interrupts = <0 63 IRQ_TYPE_LEVEL_HIGH>; 25 + #address-cells = <1>; 26 + #size-cells = <0>; 27 + status = "disabled"; 28 + }; 7 29
+35 -7
Documentation/devicetree/bindings/spi/sh-msiof.txt
··· 1 1 Renesas MSIOF spi controller 2 2 3 3 Required properties: 4 - - compatible : "renesas,sh-msiof" for SuperH or 5 - "renesas,sh-mobile-msiof" for SH Mobile series 6 - - reg : Offset and length of the register set for the device 7 - - interrupts : interrupt line used by MSIOF 4 + - compatible : "renesas,msiof-<soctype>" for SoCs, 5 + "renesas,sh-msiof" for SuperH, or 6 + "renesas,sh-mobile-msiof" for SH Mobile series. 7 + Examples with soctypes are: 8 + "renesas,msiof-r8a7790" (R-Car H2) 9 + "renesas,msiof-r8a7791" (R-Car M2) 10 + - reg : Offset and length of the register set for the device 11 + - interrupt-parent : The phandle for the interrupt controller that 12 + services interrupts for this device 13 + - interrupts : Interrupt specifier 14 + - #address-cells : Must be <1> 15 + - #size-cells : Must be <0> 8 16 9 17 Optional properties: 10 - - num-cs : total number of chip-selects 11 - - renesas,tx-fifo-size : Overrides the default tx fifo size given in words 12 - - renesas,rx-fifo-size : Overrides the default rx fifo size given in words 18 + - clocks : Must contain a reference to the functional clock. 19 + - num-cs : Total number of chip-selects (default is 1) 20 + 21 + Optional properties, deprecated for soctype-specific bindings: 22 + - renesas,tx-fifo-size : Overrides the default tx fifo size given in words 23 + (default is 64) 24 + - renesas,rx-fifo-size : Overrides the default rx fifo size given in words 25 + (default is 64, or 256 on R-Car H2 and M2) 26 + 27 + Pinctrl properties might be needed, too. See 28 + Documentation/devicetree/bindings/pinctrl/renesas,*. 29 + 30 + Example: 31 + 32 + msiof0: spi@e6e20000 { 33 + compatible = "renesas,msiof-r8a7791"; 34 + reg = <0 0xe6e20000 0 0x0064>; 35 + interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>; 36 + clocks = <&mstp0_clks R8A7791_CLK_MSIOF0>; 37 + #address-cells = <1>; 38 + #size-cells = <0>; 39 + status = "disabled"; 40 + };
+6
Documentation/spi/spidev
··· 85 85 SPI_MODE_0..SPI_MODE_3; or if you prefer you can combine SPI_CPOL 86 86 (clock polarity, idle high iff this is set) or SPI_CPHA (clock phase, 87 87 sample on trailing edge iff this is set) flags. 88 + Note that this request is limited to SPI mode flags that fit in a 89 + single byte. 90 + 91 + SPI_IOC_RD_MODE32, SPI_IOC_WR_MODE32 ... pass a pointer to a uin32_t 92 + which will return (RD) or assign (WR) the full SPI transfer mode, 93 + not limited to the bits that fit in one byte. 88 94 89 95 SPI_IOC_RD_LSB_FIRST, SPI_IOC_WR_LSB_FIRST ... pass a pointer to a byte 90 96 which will return (RD) or assign (WR) the bit justification used to
+4 -4
Documentation/spi/spidev_fdx.c
··· 78 78 79 79 static void dumpstat(const char *name, int fd) 80 80 { 81 - __u8 mode, lsb, bits; 82 - __u32 speed; 81 + __u8 lsb, bits; 82 + __u32 mode, speed; 83 83 84 - if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) { 84 + if (ioctl(fd, SPI_IOC_RD_MODE32, &mode) < 0) { 85 85 perror("SPI rd_mode"); 86 86 return; 87 87 } ··· 98 98 return; 99 99 } 100 100 101 - printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n", 101 + printf("%s: spi mode 0x%x, %d bits %sper word, %d Hz max\n", 102 102 name, mode, bits, lsb ? "(lsb first) " : "", speed); 103 103 } 104 104
+39 -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; ··· 57 57 .bits_per_word = bits, 58 58 }; 59 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 + } 74 + 60 75 ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); 61 76 if (ret < 1) 62 77 pabort("can't send spi message"); ··· 96 81 " -O --cpol clock polarity\n" 97 82 " -L --lsb least significant bit first\n" 98 83 " -C --cs-high chip select active high\n" 99 - " -3 --3wire SI/SO signals shared\n"); 84 + " -3 --3wire SI/SO signals shared\n" 85 + " -N --no-cs no chip select\n" 86 + " -R --ready slave pulls low to pause\n" 87 + " -2 --dual dual transfer\n" 88 + " -4 --quad quad transfer\n"); 100 89 exit(1); 101 90 } 102 91 ··· 120 101 { "3wire", 0, 0, '3' }, 121 102 { "no-cs", 0, 0, 'N' }, 122 103 { "ready", 0, 0, 'R' }, 104 + { "dual", 0, 0, '2' }, 105 + { "quad", 0, 0, '4' }, 123 106 { NULL, 0, 0, 0 }, 124 107 }; 125 108 int c; 126 109 127 - c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL); 110 + c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR24", lopts, NULL); 128 111 129 112 if (c == -1) 130 113 break; ··· 168 147 case 'R': 169 148 mode |= SPI_READY; 170 149 break; 150 + case '2': 151 + mode |= SPI_TX_DUAL; 152 + break; 153 + case '4': 154 + mode |= SPI_TX_QUAD; 155 + break; 171 156 default: 172 157 print_usage(argv[0]); 173 158 break; 174 159 } 160 + } 161 + if (mode & SPI_LOOP) { 162 + if (mode & SPI_TX_DUAL) 163 + mode |= SPI_RX_DUAL; 164 + if (mode & SPI_TX_QUAD) 165 + mode |= SPI_RX_QUAD; 175 166 } 176 167 } 177 168 ··· 201 168 /* 202 169 * spi mode 203 170 */ 204 - ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); 171 + ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode); 205 172 if (ret == -1) 206 173 pabort("can't set spi mode"); 207 174 208 - ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); 175 + ret = ioctl(fd, SPI_IOC_RD_MODE32, &mode); 209 176 if (ret == -1) 210 177 pabort("can't get spi mode"); 211 178 ··· 231 198 if (ret == -1) 232 199 pabort("can't get max speed hz"); 233 200 234 - printf("spi mode: %d\n", mode); 201 + printf("spi mode: 0x%x\n", mode); 235 202 printf("bits per word: %d\n", bits); 236 203 printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); 237 204
-1
drivers/spi/Kconfig
··· 429 429 tristate "SuperH MSIOF SPI controller" 430 430 depends on HAVE_CLK 431 431 depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST 432 - select SPI_BITBANG 433 432 help 434 433 SPI driver for SuperH and SH Mobile MSIOF blocks. 435 434
+12 -217
drivers/spi/spi-s3c64xx.c
··· 34 34 35 35 #include <linux/platform_data/spi-s3c64xx.h> 36 36 37 - #ifdef CONFIG_S3C_DMA 38 - #include <mach/dma.h> 39 - #endif 40 - 41 37 #define MAX_SPI_PORTS 3 42 38 #define S3C64XX_SPI_QUIRK_POLL (1 << 0) 43 39 ··· 196 200 unsigned cur_speed; 197 201 struct s3c64xx_spi_dma_data rx_dma; 198 202 struct s3c64xx_spi_dma_data tx_dma; 199 - #ifdef CONFIG_S3C_DMA 200 - struct samsung_dma_ops *ops; 201 - #endif 202 203 struct s3c64xx_spi_port_config *port_conf; 203 204 unsigned int port_id; 204 205 bool cs_gpio; ··· 277 284 spin_unlock_irqrestore(&sdd->lock, flags); 278 285 } 279 286 280 - #ifdef CONFIG_S3C_DMA 281 - /* FIXME: remove this section once arch/arm/mach-s3c64xx uses dmaengine */ 282 - 283 - static struct s3c2410_dma_client s3c64xx_spi_dma_client = { 284 - .name = "samsung-spi-dma", 285 - }; 286 - 287 - static void prepare_dma(struct s3c64xx_spi_dma_data *dma, 288 - unsigned len, dma_addr_t buf) 289 - { 290 - struct s3c64xx_spi_driver_data *sdd; 291 - struct samsung_dma_prep info; 292 - struct samsung_dma_config config; 293 - 294 - if (dma->direction == DMA_DEV_TO_MEM) { 295 - sdd = container_of((void *)dma, 296 - struct s3c64xx_spi_driver_data, rx_dma); 297 - config.direction = sdd->rx_dma.direction; 298 - config.fifo = sdd->sfr_start + S3C64XX_SPI_RX_DATA; 299 - config.width = sdd->cur_bpw / 8; 300 - sdd->ops->config((enum dma_ch)sdd->rx_dma.ch, &config); 301 - } else { 302 - sdd = container_of((void *)dma, 303 - struct s3c64xx_spi_driver_data, tx_dma); 304 - config.direction = sdd->tx_dma.direction; 305 - config.fifo = sdd->sfr_start + S3C64XX_SPI_TX_DATA; 306 - config.width = sdd->cur_bpw / 8; 307 - sdd->ops->config((enum dma_ch)sdd->tx_dma.ch, &config); 308 - } 309 - 310 - info.cap = DMA_SLAVE; 311 - info.len = len; 312 - info.fp = s3c64xx_spi_dmacb; 313 - info.fp_param = dma; 314 - info.direction = dma->direction; 315 - info.buf = buf; 316 - 317 - sdd->ops->prepare((enum dma_ch)dma->ch, &info); 318 - sdd->ops->trigger((enum dma_ch)dma->ch); 319 - } 320 - 321 - static int acquire_dma(struct s3c64xx_spi_driver_data *sdd) 322 - { 323 - struct samsung_dma_req req; 324 - struct device *dev = &sdd->pdev->dev; 325 - 326 - sdd->ops = samsung_dma_get_ops(); 327 - 328 - req.cap = DMA_SLAVE; 329 - req.client = &s3c64xx_spi_dma_client; 330 - 331 - sdd->rx_dma.ch = (struct dma_chan *)(unsigned long)sdd->ops->request( 332 - sdd->rx_dma.dmach, &req, dev, "rx"); 333 - sdd->tx_dma.ch = (struct dma_chan *)(unsigned long)sdd->ops->request( 334 - sdd->tx_dma.dmach, &req, dev, "tx"); 335 - 336 - return 1; 337 - } 338 - 339 - static int s3c64xx_spi_prepare_transfer(struct spi_master *spi) 340 - { 341 - struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi); 342 - 343 - /* 344 - * If DMA resource was not available during 345 - * probe, no need to continue with dma requests 346 - * else Acquire DMA channels 347 - */ 348 - while (!is_polling(sdd) && !acquire_dma(sdd)) 349 - usleep_range(10000, 11000); 350 - 351 - return 0; 352 - } 353 - 354 - static int s3c64xx_spi_unprepare_transfer(struct spi_master *spi) 355 - { 356 - struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi); 357 - 358 - /* Free DMA channels */ 359 - if (!is_polling(sdd)) { 360 - sdd->ops->release((enum dma_ch)sdd->rx_dma.ch, 361 - &s3c64xx_spi_dma_client); 362 - sdd->ops->release((enum dma_ch)sdd->tx_dma.ch, 363 - &s3c64xx_spi_dma_client); 364 - } 365 - 366 - return 0; 367 - } 368 - 369 - static void s3c64xx_spi_dma_stop(struct s3c64xx_spi_driver_data *sdd, 370 - struct s3c64xx_spi_dma_data *dma) 371 - { 372 - sdd->ops->stop((enum dma_ch)dma->ch); 373 - } 374 - #else 375 - 376 287 static void prepare_dma(struct s3c64xx_spi_dma_data *dma, 377 288 struct sg_table *sgt) 378 289 { ··· 334 437 ret = -EBUSY; 335 438 goto out; 336 439 } 440 + spi->dma_rx = sdd->rx_dma.ch; 337 441 338 442 sdd->tx_dma.ch = dma_request_slave_channel_compat(mask, filter, 339 443 (void *)sdd->tx_dma.dmach, dev, "tx"); ··· 343 445 ret = -EBUSY; 344 446 goto out_rx; 345 447 } 448 + spi->dma_tx = sdd->tx_dma.ch; 346 449 } 347 450 348 451 ret = pm_runtime_get_sync(&sdd->pdev->dev); ··· 376 477 return 0; 377 478 } 378 479 379 - static void s3c64xx_spi_dma_stop(struct s3c64xx_spi_driver_data *sdd, 380 - struct s3c64xx_spi_dma_data *dma) 480 + static bool s3c64xx_spi_can_dma(struct spi_master *master, 481 + struct spi_device *spi, 482 + struct spi_transfer *xfer) 381 483 { 382 - dmaengine_terminate_all(dma->ch); 484 + struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); 485 + 486 + return xfer->len > (FIFO_LVL_MASK(sdd) >> 1) + 1; 383 487 } 384 - #endif 385 488 386 489 static void enable_datapath(struct s3c64xx_spi_driver_data *sdd, 387 490 struct spi_device *spi, ··· 416 515 chcfg |= S3C64XX_SPI_CH_TXCH_ON; 417 516 if (dma_mode) { 418 517 modecfg |= S3C64XX_SPI_MODE_TXDMA_ON; 419 - #ifndef CONFIG_S3C_DMA 420 518 prepare_dma(&sdd->tx_dma, &xfer->tx_sg); 421 - #else 422 - prepare_dma(&sdd->tx_dma, xfer->len, xfer->tx_dma); 423 - #endif 424 519 } else { 425 520 switch (sdd->cur_bpw) { 426 521 case 32: ··· 448 551 writel(((xfer->len * 8 / sdd->cur_bpw) & 0xffff) 449 552 | S3C64XX_SPI_PACKET_CNT_EN, 450 553 regs + S3C64XX_SPI_PACKET_CNT); 451 - #ifndef CONFIG_S3C_DMA 452 554 prepare_dma(&sdd->rx_dma, &xfer->rx_sg); 453 - #else 454 - prepare_dma(&sdd->rx_dma, xfer->len, xfer->rx_dma); 455 - #endif 456 555 } 457 556 } 458 557 ··· 657 764 658 765 #define XFER_DMAADDR_INVALID DMA_BIT_MASK(32) 659 766 660 - static int s3c64xx_spi_map_mssg(struct s3c64xx_spi_driver_data *sdd, 661 - struct spi_message *msg) 662 - { 663 - struct device *dev = &sdd->pdev->dev; 664 - struct spi_transfer *xfer; 665 - 666 - if (is_polling(sdd) || msg->is_dma_mapped) 667 - return 0; 668 - 669 - /* First mark all xfer unmapped */ 670 - list_for_each_entry(xfer, &msg->transfers, transfer_list) { 671 - xfer->rx_dma = XFER_DMAADDR_INVALID; 672 - xfer->tx_dma = XFER_DMAADDR_INVALID; 673 - } 674 - 675 - /* Map until end or first fail */ 676 - list_for_each_entry(xfer, &msg->transfers, transfer_list) { 677 - 678 - if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1)) 679 - continue; 680 - 681 - if (xfer->tx_buf != NULL) { 682 - xfer->tx_dma = dma_map_single(dev, 683 - (void *)xfer->tx_buf, xfer->len, 684 - DMA_TO_DEVICE); 685 - if (dma_mapping_error(dev, xfer->tx_dma)) { 686 - dev_err(dev, "dma_map_single Tx failed\n"); 687 - xfer->tx_dma = XFER_DMAADDR_INVALID; 688 - return -ENOMEM; 689 - } 690 - } 691 - 692 - if (xfer->rx_buf != NULL) { 693 - xfer->rx_dma = dma_map_single(dev, xfer->rx_buf, 694 - xfer->len, DMA_FROM_DEVICE); 695 - if (dma_mapping_error(dev, xfer->rx_dma)) { 696 - dev_err(dev, "dma_map_single Rx failed\n"); 697 - dma_unmap_single(dev, xfer->tx_dma, 698 - xfer->len, DMA_TO_DEVICE); 699 - xfer->tx_dma = XFER_DMAADDR_INVALID; 700 - xfer->rx_dma = XFER_DMAADDR_INVALID; 701 - return -ENOMEM; 702 - } 703 - } 704 - } 705 - 706 - return 0; 707 - } 708 - 709 - static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd, 710 - struct spi_message *msg) 711 - { 712 - struct device *dev = &sdd->pdev->dev; 713 - struct spi_transfer *xfer; 714 - 715 - if (is_polling(sdd) || msg->is_dma_mapped) 716 - return; 717 - 718 - list_for_each_entry(xfer, &msg->transfers, transfer_list) { 719 - 720 - if (xfer->len <= ((FIFO_LVL_MASK(sdd) >> 1) + 1)) 721 - continue; 722 - 723 - if (xfer->rx_buf != NULL 724 - && xfer->rx_dma != XFER_DMAADDR_INVALID) 725 - dma_unmap_single(dev, xfer->rx_dma, 726 - xfer->len, DMA_FROM_DEVICE); 727 - 728 - if (xfer->tx_buf != NULL 729 - && xfer->tx_dma != XFER_DMAADDR_INVALID) 730 - dma_unmap_single(dev, xfer->tx_dma, 731 - xfer->len, DMA_TO_DEVICE); 732 - } 733 - } 734 - 735 767 static int s3c64xx_spi_prepare_message(struct spi_master *master, 736 768 struct spi_message *msg) 737 769 { ··· 672 854 sdd->cur_speed = spi->max_speed_hz; 673 855 sdd->cur_mode = spi->mode; 674 856 s3c64xx_spi_config(sdd); 675 - } 676 - 677 - /* Map all the transfers if needed */ 678 - if (s3c64xx_spi_map_mssg(sdd, msg)) { 679 - dev_err(&spi->dev, 680 - "Xfer: Unable to map message buffers!\n"); 681 - return -ENOMEM; 682 857 } 683 858 684 859 /* Configure feedback delay */ ··· 696 885 /* Only BPW and Speed may change across transfers */ 697 886 bpw = xfer->bits_per_word; 698 887 speed = xfer->speed_hz ? : spi->max_speed_hz; 699 - 700 - if (xfer->len % (bpw / 8)) { 701 - dev_err(&spi->dev, 702 - "Xfer length(%u) not a multiple of word size(%u)\n", 703 - xfer->len, bpw / 8); 704 - return -EIO; 705 - } 706 888 707 889 if (bpw != sdd->cur_bpw || speed != sdd->cur_speed) { 708 890 sdd->cur_bpw = bpw; ··· 738 934 if (use_dma) { 739 935 if (xfer->tx_buf != NULL 740 936 && (sdd->state & TXBUSY)) 741 - s3c64xx_spi_dma_stop(sdd, &sdd->tx_dma); 937 + dmaengine_terminate_all(sdd->tx_dma.ch); 742 938 if (xfer->rx_buf != NULL 743 939 && (sdd->state & RXBUSY)) 744 - s3c64xx_spi_dma_stop(sdd, &sdd->rx_dma); 940 + dmaengine_terminate_all(sdd->rx_dma.ch); 745 941 } 746 942 } else { 747 943 flush_fifo(sdd); 748 944 } 749 945 750 946 return status; 751 - } 752 - 753 - static int s3c64xx_spi_unprepare_message(struct spi_master *master, 754 - struct spi_message *msg) 755 - { 756 - struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); 757 - 758 - s3c64xx_spi_unmap_mssg(sdd, msg); 759 - 760 - return 0; 761 947 } 762 948 763 949 static struct s3c64xx_spi_csinfo *s3c64xx_get_slave_ctrldata( ··· 1123 1329 master->prepare_transfer_hardware = s3c64xx_spi_prepare_transfer; 1124 1330 master->prepare_message = s3c64xx_spi_prepare_message; 1125 1331 master->transfer_one = s3c64xx_spi_transfer_one; 1126 - master->unprepare_message = s3c64xx_spi_unprepare_message; 1127 1332 master->unprepare_transfer_hardware = s3c64xx_spi_unprepare_transfer; 1128 1333 master->num_chipselect = sci->num_cs; 1129 1334 master->dma_alignment = 8; ··· 1131 1338 /* the spi->mode bits understood by this driver: */ 1132 1339 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; 1133 1340 master->auto_runtime_pm = true; 1341 + if (!is_polling(sdd)) 1342 + master->can_dma = s3c64xx_spi_can_dma; 1134 1343 1135 1344 sdd->regs = devm_ioremap_resource(&pdev->dev, mem_res); 1136 1345 if (IS_ERR(sdd->regs)) {
+9 -20
drivers/spi/spi-sc18is602.c
··· 183 183 static int sc18is602_check_transfer(struct spi_device *spi, 184 184 struct spi_transfer *t, int tlen) 185 185 { 186 - uint32_t hz; 187 - 188 186 if (t && t->len + tlen > SC18IS602_BUFSIZ) 189 - return -EINVAL; 190 - 191 - hz = spi->max_speed_hz; 192 - if (t && t->speed_hz) 193 - hz = t->speed_hz; 194 - if (hz == 0) 195 187 return -EINVAL; 196 188 197 189 return 0; ··· 197 205 struct spi_transfer *t; 198 206 int status = 0; 199 207 200 - /* SC18IS602 does not support CS2 */ 201 - if (hw->id == sc18is602 && spi->chip_select == 2) { 202 - status = -ENXIO; 203 - goto error; 204 - } 205 - 206 208 hw->tlen = 0; 207 209 list_for_each_entry(t, &m->transfers, transfer_list) { 208 - u32 hz = t->speed_hz ? : spi->max_speed_hz; 209 210 bool do_transfer; 210 211 211 212 status = sc18is602_check_transfer(spi, t, hw->tlen); 212 213 if (status < 0) 213 214 break; 214 215 215 - status = sc18is602_setup_transfer(hw, hz, spi->mode); 216 + status = sc18is602_setup_transfer(hw, t->speed_hz, spi->mode); 216 217 if (status < 0) 217 218 break; 218 219 ··· 223 238 if (t->delay_usecs) 224 239 udelay(t->delay_usecs); 225 240 } 226 - error: 227 241 m->status = status; 228 242 spi_finalize_current_message(master); 229 243 ··· 231 247 232 248 static int sc18is602_setup(struct spi_device *spi) 233 249 { 234 - if (spi->mode & ~(SPI_CPHA | SPI_CPOL | SPI_LSB_FIRST)) 235 - return -EINVAL; 250 + struct sc18is602 *hw = spi_master_get_devdata(spi->master); 236 251 237 - return sc18is602_check_transfer(spi, NULL, 0); 252 + /* SC18IS602 does not support CS2 */ 253 + if (hw->id == sc18is602 && spi->chip_select == 2) 254 + return -ENXIO; 255 + 256 + return 0; 238 257 } 239 258 240 259 static int sc18is602_probe(struct i2c_client *client, ··· 296 309 master->setup = sc18is602_setup; 297 310 master->transfer_one_message = sc18is602_transfer_one; 298 311 master->dev.of_node = np; 312 + master->min_speed_hz = hw->freq / 128; 313 + master->max_speed_hz = hw->freq / 4; 299 314 300 315 error = devm_spi_register_master(dev, master); 301 316 if (error)
+7 -35
drivers/spi/spi-sh-hspi.c
··· 46 46 /* SPSR */ 47 47 #define RXFL (1 << 2) 48 48 49 - #define hspi2info(h) (h->dev->platform_data) 50 - 51 49 struct hspi_priv { 52 50 void __iomem *addr; 53 51 struct spi_master *master; ··· 111 113 { 112 114 struct spi_device *spi = msg->spi; 113 115 struct device *dev = hspi->dev; 114 - u32 target_rate; 115 116 u32 spcr, idiv_clk; 116 117 u32 rate, best_rate, min, tmp; 117 - 118 - target_rate = t ? t->speed_hz : 0; 119 - if (!target_rate) 120 - target_rate = spi->max_speed_hz; 121 118 122 119 /* 123 120 * find best IDIV/CLKCx settings ··· 133 140 rate /= (((idiv_clk & 0x1F) + 1) * 2); 134 141 135 142 /* save best settings */ 136 - tmp = abs(target_rate - rate); 143 + tmp = abs(t->speed_hz - rate); 137 144 if (tmp < min) { 138 145 min = tmp; 139 146 spcr = idiv_clk; ··· 146 153 if (spi->mode & SPI_CPOL) 147 154 spcr |= 1 << 6; 148 155 149 - dev_dbg(dev, "speed %d/%d\n", target_rate, best_rate); 156 + dev_dbg(dev, "speed %d/%d\n", t->speed_hz, best_rate); 150 157 151 158 hspi_write(hspi, SPCR, spcr); 152 159 hspi_write(hspi, SPSR, 0x0); ··· 223 230 return ret; 224 231 } 225 232 226 - static int hspi_setup(struct spi_device *spi) 227 - { 228 - struct hspi_priv *hspi = spi_master_get_devdata(spi->master); 229 - struct device *dev = hspi->dev; 230 - 231 - if (8 != spi->bits_per_word) { 232 - dev_err(dev, "bits_per_word should be 8\n"); 233 - return -EIO; 234 - } 235 - 236 - dev_dbg(dev, "%s setup\n", spi->modalias); 237 - 238 - return 0; 239 - } 240 - 241 - static void hspi_cleanup(struct spi_device *spi) 242 - { 243 - struct hspi_priv *hspi = spi_master_get_devdata(spi->master); 244 - struct device *dev = hspi->dev; 245 - 246 - dev_dbg(dev, "%s cleanup\n", spi->modalias); 247 - } 248 - 249 233 static int hspi_probe(struct platform_device *pdev) 250 234 { 251 235 struct resource *res; ··· 269 299 pm_runtime_enable(&pdev->dev); 270 300 271 301 master->bus_num = pdev->id; 272 - master->setup = hspi_setup; 273 - master->cleanup = hspi_cleanup; 274 302 master->mode_bits = SPI_CPOL | SPI_CPHA; 275 303 master->dev.of_node = pdev->dev.of_node; 276 304 master->auto_runtime_pm = true; 277 305 master->transfer_one_message = hspi_transfer_one_message; 306 + master->bits_per_word_mask = SPI_BPW_MASK(8); 307 + 278 308 ret = devm_spi_register_master(&pdev->dev, master); 279 309 if (ret < 0) { 280 310 dev_err(&pdev->dev, "spi_register_master error.\n"); 281 - goto error1; 311 + goto error2; 282 312 } 283 313 284 314 return 0; 285 315 316 + error2: 317 + pm_runtime_disable(&pdev->dev); 286 318 error1: 287 319 clk_put(clk); 288 320 error0:
+204 -178
drivers/spi/spi-sh-msiof.c
··· 20 20 #include <linux/kernel.h> 21 21 #include <linux/module.h> 22 22 #include <linux/of.h> 23 + #include <linux/of_device.h> 23 24 #include <linux/platform_device.h> 24 25 #include <linux/pm_runtime.h> 25 26 26 27 #include <linux/spi/sh_msiof.h> 27 28 #include <linux/spi/spi.h> 28 - #include <linux/spi/spi_bitbang.h> 29 29 30 30 #include <asm/unaligned.h> 31 31 32 + 33 + struct sh_msiof_chipdata { 34 + u16 tx_fifo_size; 35 + u16 rx_fifo_size; 36 + u16 master_flags; 37 + }; 38 + 32 39 struct sh_msiof_spi_priv { 33 - struct spi_bitbang bitbang; /* must be first for spi_bitbang.c */ 34 40 void __iomem *mapbase; 35 41 struct clk *clk; 36 42 struct platform_device *pdev; 43 + const struct sh_msiof_chipdata *chipdata; 37 44 struct sh_msiof_spi_info *info; 38 45 struct completion done; 39 - unsigned long flags; 40 46 int tx_fifo_size; 41 47 int rx_fifo_size; 42 48 }; 43 49 44 - #define TMDR1 0x00 45 - #define TMDR2 0x04 46 - #define TMDR3 0x08 47 - #define RMDR1 0x10 48 - #define RMDR2 0x14 49 - #define RMDR3 0x18 50 - #define TSCR 0x20 51 - #define RSCR 0x22 52 - #define CTR 0x28 53 - #define FCTR 0x30 54 - #define STR 0x40 55 - #define IER 0x44 56 - #define TDR1 0x48 57 - #define TDR2 0x4c 58 - #define TFDR 0x50 59 - #define RDR1 0x58 60 - #define RDR2 0x5c 61 - #define RFDR 0x60 50 + #define TMDR1 0x00 /* Transmit Mode Register 1 */ 51 + #define TMDR2 0x04 /* Transmit Mode Register 2 */ 52 + #define TMDR3 0x08 /* Transmit Mode Register 3 */ 53 + #define RMDR1 0x10 /* Receive Mode Register 1 */ 54 + #define RMDR2 0x14 /* Receive Mode Register 2 */ 55 + #define RMDR3 0x18 /* Receive Mode Register 3 */ 56 + #define TSCR 0x20 /* Transmit Clock Select Register */ 57 + #define RSCR 0x22 /* Receive Clock Select Register (SH, A1, APE6) */ 58 + #define CTR 0x28 /* Control Register */ 59 + #define FCTR 0x30 /* FIFO Control Register */ 60 + #define STR 0x40 /* Status Register */ 61 + #define IER 0x44 /* Interrupt Enable Register */ 62 + #define TDR1 0x48 /* Transmit Control Data Register 1 (SH, A1) */ 63 + #define TDR2 0x4c /* Transmit Control Data Register 2 (SH, A1) */ 64 + #define TFDR 0x50 /* Transmit FIFO Data Register */ 65 + #define RDR1 0x58 /* Receive Control Data Register 1 (SH, A1) */ 66 + #define RDR2 0x5c /* Receive Control Data Register 2 (SH, A1) */ 67 + #define RFDR 0x60 /* Receive FIFO Data Register */ 62 68 63 - #define CTR_TSCKE (1 << 15) 64 - #define CTR_TFSE (1 << 14) 65 - #define CTR_TXE (1 << 9) 66 - #define CTR_RXE (1 << 8) 69 + /* TMDR1 and RMDR1 */ 70 + #define MDR1_TRMD 0x80000000 /* Transfer Mode (1 = Master mode) */ 71 + #define MDR1_SYNCMD_MASK 0x30000000 /* SYNC Mode */ 72 + #define MDR1_SYNCMD_SPI 0x20000000 /* Level mode/SPI */ 73 + #define MDR1_SYNCMD_LR 0x30000000 /* L/R mode */ 74 + #define MDR1_SYNCAC_SHIFT 25 /* Sync Polarity (1 = Active-low) */ 75 + #define MDR1_BITLSB_SHIFT 24 /* MSB/LSB First (1 = LSB first) */ 76 + #define MDR1_FLD_MASK 0x000000c0 /* Frame Sync Signal Interval (0-3) */ 77 + #define MDR1_FLD_SHIFT 2 78 + #define MDR1_XXSTP 0x00000001 /* Transmission/Reception Stop on FIFO */ 79 + /* TMDR1 */ 80 + #define TMDR1_PCON 0x40000000 /* Transfer Signal Connection */ 67 81 68 - #define STR_TEOF (1 << 23) 69 - #define STR_REOF (1 << 7) 82 + /* TMDR2 and RMDR2 */ 83 + #define MDR2_BITLEN1(i) (((i) - 1) << 24) /* Data Size (8-32 bits) */ 84 + #define MDR2_WDLEN1(i) (((i) - 1) << 16) /* Word Count (1-64/256 (SH, A1))) */ 85 + #define MDR2_GRPMASK1 0x00000001 /* Group Output Mask 1 (SH, A1) */ 86 + 87 + /* TSCR and RSCR */ 88 + #define SCR_BRPS_MASK 0x1f00 /* Prescaler Setting (1-32) */ 89 + #define SCR_BRPS(i) (((i) - 1) << 8) 90 + #define SCR_BRDV_MASK 0x0007 /* Baud Rate Generator's Division Ratio */ 91 + #define SCR_BRDV_DIV_2 0x0000 92 + #define SCR_BRDV_DIV_4 0x0001 93 + #define SCR_BRDV_DIV_8 0x0002 94 + #define SCR_BRDV_DIV_16 0x0003 95 + #define SCR_BRDV_DIV_32 0x0004 96 + #define SCR_BRDV_DIV_1 0x0007 97 + 98 + /* CTR */ 99 + #define CTR_TSCKIZ_MASK 0xc0000000 /* Transmit Clock I/O Polarity Select */ 100 + #define CTR_TSCKIZ_SCK 0x80000000 /* Disable SCK when TX disabled */ 101 + #define CTR_TSCKIZ_POL_SHIFT 30 /* Transmit Clock Polarity */ 102 + #define CTR_RSCKIZ_MASK 0x30000000 /* Receive Clock Polarity Select */ 103 + #define CTR_RSCKIZ_SCK 0x20000000 /* Must match CTR_TSCKIZ_SCK */ 104 + #define CTR_RSCKIZ_POL_SHIFT 28 /* Receive Clock Polarity */ 105 + #define CTR_TEDG_SHIFT 27 /* Transmit Timing (1 = falling edge) */ 106 + #define CTR_REDG_SHIFT 26 /* Receive Timing (1 = falling edge) */ 107 + #define CTR_TXDIZ_MASK 0x00c00000 /* Pin Output When TX is Disabled */ 108 + #define CTR_TXDIZ_LOW 0x00000000 /* 0 */ 109 + #define CTR_TXDIZ_HIGH 0x00400000 /* 1 */ 110 + #define CTR_TXDIZ_HIZ 0x00800000 /* High-impedance */ 111 + #define CTR_TSCKE 0x00008000 /* Transmit Serial Clock Output Enable */ 112 + #define CTR_TFSE 0x00004000 /* Transmit Frame Sync Signal Output Enable */ 113 + #define CTR_TXE 0x00000200 /* Transmit Enable */ 114 + #define CTR_RXE 0x00000100 /* Receive Enable */ 115 + 116 + /* STR and IER */ 117 + #define STR_TEOF 0x00800000 /* Frame Transmission End */ 118 + #define STR_REOF 0x00000080 /* Frame Reception End */ 119 + 70 120 71 121 static u32 sh_msiof_read(struct sh_msiof_spi_priv *p, int reg_offs) 72 122 { ··· 180 130 unsigned short div; 181 131 unsigned short scr; 182 132 } const sh_msiof_spi_clk_table[] = { 183 - { 1, 0x0007 }, 184 - { 2, 0x0000 }, 185 - { 4, 0x0001 }, 186 - { 8, 0x0002 }, 187 - { 16, 0x0003 }, 188 - { 32, 0x0004 }, 189 - { 64, 0x1f00 }, 190 - { 128, 0x1f01 }, 191 - { 256, 0x1f02 }, 192 - { 512, 0x1f03 }, 193 - { 1024, 0x1f04 }, 133 + { 1, SCR_BRPS( 1) | SCR_BRDV_DIV_1 }, 134 + { 2, SCR_BRPS( 1) | SCR_BRDV_DIV_2 }, 135 + { 4, SCR_BRPS( 1) | SCR_BRDV_DIV_4 }, 136 + { 8, SCR_BRPS( 1) | SCR_BRDV_DIV_8 }, 137 + { 16, SCR_BRPS( 1) | SCR_BRDV_DIV_16 }, 138 + { 32, SCR_BRPS( 1) | SCR_BRDV_DIV_32 }, 139 + { 64, SCR_BRPS(32) | SCR_BRDV_DIV_2 }, 140 + { 128, SCR_BRPS(32) | SCR_BRDV_DIV_4 }, 141 + { 256, SCR_BRPS(32) | SCR_BRDV_DIV_8 }, 142 + { 512, SCR_BRPS(32) | SCR_BRDV_DIV_16 }, 143 + { 1024, SCR_BRPS(32) | SCR_BRDV_DIV_32 }, 194 144 }; 195 145 196 146 static void sh_msiof_spi_set_clk_regs(struct sh_msiof_spi_priv *p, 197 - unsigned long parent_rate, 198 - unsigned long spi_hz) 147 + unsigned long parent_rate, u32 spi_hz) 199 148 { 200 149 unsigned long div = 1024; 201 150 size_t k; ··· 212 163 k = min_t(int, k, ARRAY_SIZE(sh_msiof_spi_clk_table) - 1); 213 164 214 165 sh_msiof_write(p, TSCR, sh_msiof_spi_clk_table[k].scr); 215 - sh_msiof_write(p, RSCR, sh_msiof_spi_clk_table[k].scr); 166 + if (!(p->chipdata->master_flags & SPI_MASTER_MUST_TX)) 167 + sh_msiof_write(p, RSCR, sh_msiof_spi_clk_table[k].scr); 216 168 } 217 169 218 170 static void sh_msiof_spi_set_pin_regs(struct sh_msiof_spi_priv *p, ··· 232 182 */ 233 183 sh_msiof_write(p, FCTR, 0); 234 184 235 - tmp = 0; 236 - tmp |= !cs_high << 25; 237 - tmp |= lsb_first << 24; 238 - sh_msiof_write(p, TMDR1, 0xe0000005 | tmp); 239 - sh_msiof_write(p, RMDR1, 0x20000005 | tmp); 185 + tmp = MDR1_SYNCMD_SPI | 1 << MDR1_FLD_SHIFT | MDR1_XXSTP; 186 + tmp |= !cs_high << MDR1_SYNCAC_SHIFT; 187 + tmp |= lsb_first << MDR1_BITLSB_SHIFT; 188 + sh_msiof_write(p, TMDR1, tmp | MDR1_TRMD | TMDR1_PCON); 189 + if (p->chipdata->master_flags & SPI_MASTER_MUST_TX) { 190 + /* These bits are reserved if RX needs TX */ 191 + tmp &= ~0x0000ffff; 192 + } 193 + sh_msiof_write(p, RMDR1, tmp); 240 194 241 - tmp = 0xa0000000; 242 - tmp |= cpol << 30; /* TSCKIZ */ 243 - tmp |= cpol << 28; /* RSCKIZ */ 195 + tmp = 0; 196 + tmp |= CTR_TSCKIZ_SCK | cpol << CTR_TSCKIZ_POL_SHIFT; 197 + tmp |= CTR_RSCKIZ_SCK | cpol << CTR_RSCKIZ_POL_SHIFT; 244 198 245 199 edge = cpol ^ !cpha; 246 200 247 - tmp |= edge << 27; /* TEDG */ 248 - tmp |= edge << 26; /* REDG */ 249 - tmp |= (tx_hi_z ? 2 : 0) << 22; /* TXDIZ */ 201 + tmp |= edge << CTR_TEDG_SHIFT; 202 + tmp |= edge << CTR_REDG_SHIFT; 203 + tmp |= tx_hi_z ? CTR_TXDIZ_HIZ : CTR_TXDIZ_LOW; 250 204 sh_msiof_write(p, CTR, tmp); 251 205 } 252 206 ··· 258 204 const void *tx_buf, void *rx_buf, 259 205 u32 bits, u32 words) 260 206 { 261 - u32 dr2 = ((bits - 1) << 24) | ((words - 1) << 16); 207 + u32 dr2 = MDR2_BITLEN1(bits) | MDR2_WDLEN1(words); 262 208 263 - if (tx_buf) 209 + if (tx_buf || (p->chipdata->master_flags & SPI_MASTER_MUST_TX)) 264 210 sh_msiof_write(p, TMDR2, dr2); 265 211 else 266 - sh_msiof_write(p, TMDR2, dr2 | 1); 212 + sh_msiof_write(p, TMDR2, dr2 | MDR2_GRPMASK1); 267 213 268 214 if (rx_buf) 269 215 sh_msiof_write(p, RMDR2, dr2); ··· 416 362 put_unaligned(swab32(sh_msiof_read(p, RFDR) >> fs), &buf_32[k]); 417 363 } 418 364 419 - static int sh_msiof_spi_bits(struct spi_device *spi, struct spi_transfer *t) 365 + static int sh_msiof_spi_setup(struct spi_device *spi) 420 366 { 421 - int bits; 422 - 423 - bits = t ? t->bits_per_word : 0; 424 - if (!bits) 425 - bits = spi->bits_per_word; 426 - return bits; 427 - } 428 - 429 - static unsigned long sh_msiof_spi_hz(struct spi_device *spi, 430 - struct spi_transfer *t) 431 - { 432 - unsigned long hz; 433 - 434 - hz = t ? t->speed_hz : 0; 435 - if (!hz) 436 - hz = spi->max_speed_hz; 437 - return hz; 438 - } 439 - 440 - static int sh_msiof_spi_setup_transfer(struct spi_device *spi, 441 - struct spi_transfer *t) 442 - { 443 - int bits; 444 - 445 - /* noting to check hz values against since parent clock is disabled */ 446 - 447 - bits = sh_msiof_spi_bits(spi, t); 448 - if (bits < 8) 449 - return -EINVAL; 450 - if (bits > 32) 451 - return -EINVAL; 452 - 453 - return spi_bitbang_setup_transfer(spi, t); 454 - } 455 - 456 - static void sh_msiof_spi_chipselect(struct spi_device *spi, int is_on) 457 - { 367 + struct device_node *np = spi->master->dev.of_node; 458 368 struct sh_msiof_spi_priv *p = spi_master_get_devdata(spi->master); 459 - int value; 460 369 461 - /* chip select is active low unless SPI_CS_HIGH is set */ 462 - if (spi->mode & SPI_CS_HIGH) 463 - value = (is_on == BITBANG_CS_ACTIVE) ? 1 : 0; 464 - else 465 - value = (is_on == BITBANG_CS_ACTIVE) ? 0 : 1; 466 - 467 - if (is_on == BITBANG_CS_ACTIVE) { 468 - if (!test_and_set_bit(0, &p->flags)) { 469 - pm_runtime_get_sync(&p->pdev->dev); 470 - clk_enable(p->clk); 471 - } 472 - 473 - /* Configure pins before asserting CS */ 474 - sh_msiof_spi_set_pin_regs(p, !!(spi->mode & SPI_CPOL), 475 - !!(spi->mode & SPI_CPHA), 476 - !!(spi->mode & SPI_3WIRE), 477 - !!(spi->mode & SPI_LSB_FIRST), 478 - !!(spi->mode & SPI_CS_HIGH)); 370 + if (!np) { 371 + /* 372 + * Use spi->controller_data for CS (same strategy as spi_gpio), 373 + * if any. otherwise let HW control CS 374 + */ 375 + spi->cs_gpio = (uintptr_t)spi->controller_data; 479 376 } 480 377 481 - /* use spi->controller data for CS (same strategy as spi_gpio) */ 482 - gpio_set_value((uintptr_t)spi->controller_data, value); 378 + /* Configure pins before deasserting CS */ 379 + sh_msiof_spi_set_pin_regs(p, !!(spi->mode & SPI_CPOL), 380 + !!(spi->mode & SPI_CPHA), 381 + !!(spi->mode & SPI_3WIRE), 382 + !!(spi->mode & SPI_LSB_FIRST), 383 + !!(spi->mode & SPI_CS_HIGH)); 483 384 484 - if (is_on == BITBANG_CS_INACTIVE) { 485 - if (test_and_clear_bit(0, &p->flags)) { 486 - clk_disable(p->clk); 487 - pm_runtime_put(&p->pdev->dev); 488 - } 489 - } 385 + if (spi->cs_gpio >= 0) 386 + gpio_set_value(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH)); 387 + 388 + return 0; 389 + } 390 + 391 + static int sh_msiof_prepare_message(struct spi_master *master, 392 + struct spi_message *msg) 393 + { 394 + struct sh_msiof_spi_priv *p = spi_master_get_devdata(master); 395 + const struct spi_device *spi = msg->spi; 396 + 397 + /* Configure pins before asserting CS */ 398 + sh_msiof_spi_set_pin_regs(p, !!(spi->mode & SPI_CPOL), 399 + !!(spi->mode & SPI_CPHA), 400 + !!(spi->mode & SPI_3WIRE), 401 + !!(spi->mode & SPI_LSB_FIRST), 402 + !!(spi->mode & SPI_CS_HIGH)); 403 + return 0; 490 404 } 491 405 492 406 static int sh_msiof_spi_txrx_once(struct sh_msiof_spi_priv *p, ··· 508 486 /* clear status bits */ 509 487 sh_msiof_reset_str(p); 510 488 511 - /* shut down frame, tx/tx and clock signals */ 489 + /* shut down frame, rx/tx and clock signals */ 512 490 ret = sh_msiof_modify_ctr_wait(p, CTR_TFSE, 0); 513 491 ret = ret ? ret : sh_msiof_modify_ctr_wait(p, CTR_TXE, 0); 514 492 if (rx_buf) ··· 526 504 return ret; 527 505 } 528 506 529 - static int sh_msiof_spi_txrx(struct spi_device *spi, struct spi_transfer *t) 507 + static int sh_msiof_transfer_one(struct spi_master *master, 508 + struct spi_device *spi, 509 + struct spi_transfer *t) 530 510 { 531 - struct sh_msiof_spi_priv *p = spi_master_get_devdata(spi->master); 511 + struct sh_msiof_spi_priv *p = spi_master_get_devdata(master); 532 512 void (*tx_fifo)(struct sh_msiof_spi_priv *, const void *, int, int); 533 513 void (*rx_fifo)(struct sh_msiof_spi_priv *, void *, int, int); 534 514 int bits; ··· 540 516 int n; 541 517 bool swab; 542 518 543 - bits = sh_msiof_spi_bits(spi, t); 519 + bits = t->bits_per_word; 544 520 545 521 if (bits <= 8 && t->len > 15 && !(t->len & 3)) { 546 522 bits = 32; ··· 590 566 } 591 567 592 568 /* setup clocks (clock already enabled in chipselect()) */ 593 - sh_msiof_spi_set_clk_regs(p, clk_get_rate(p->clk), 594 - sh_msiof_spi_hz(spi, t)); 569 + sh_msiof_spi_set_clk_regs(p, clk_get_rate(p->clk), t->speed_hz); 595 570 596 571 /* transfer in fifo sized chunks */ 597 572 words = t->len / bytes_per_word; ··· 610 587 words -= n; 611 588 } 612 589 613 - return bytes_done; 614 - } 615 - 616 - static u32 sh_msiof_spi_txrx_word(struct spi_device *spi, unsigned nsecs, 617 - u32 word, u8 bits) 618 - { 619 - BUG(); /* unused but needed by bitbang code */ 620 590 return 0; 621 591 } 592 + 593 + static const struct sh_msiof_chipdata sh_data = { 594 + .tx_fifo_size = 64, 595 + .rx_fifo_size = 64, 596 + .master_flags = 0, 597 + }; 598 + 599 + static const struct sh_msiof_chipdata r8a779x_data = { 600 + .tx_fifo_size = 64, 601 + .rx_fifo_size = 256, 602 + .master_flags = SPI_MASTER_MUST_TX, 603 + }; 604 + 605 + static const struct of_device_id sh_msiof_match[] = { 606 + { .compatible = "renesas,sh-msiof", .data = &sh_data }, 607 + { .compatible = "renesas,sh-mobile-msiof", .data = &sh_data }, 608 + { .compatible = "renesas,msiof-r8a7790", .data = &r8a779x_data }, 609 + { .compatible = "renesas,msiof-r8a7791", .data = &r8a779x_data }, 610 + {}, 611 + }; 612 + MODULE_DEVICE_TABLE(of, sh_msiof_match); 622 613 623 614 #ifdef CONFIG_OF 624 615 static struct sh_msiof_spi_info *sh_msiof_spi_parse_dt(struct device *dev) 625 616 { 626 617 struct sh_msiof_spi_info *info; 627 618 struct device_node *np = dev->of_node; 628 - u32 num_cs = 0; 619 + u32 num_cs = 1; 629 620 630 621 info = devm_kzalloc(dev, sizeof(struct sh_msiof_spi_info), GFP_KERNEL); 631 622 if (!info) { ··· 669 632 { 670 633 struct resource *r; 671 634 struct spi_master *master; 635 + const struct of_device_id *of_id; 672 636 struct sh_msiof_spi_priv *p; 673 637 int i; 674 638 int ret; ··· 683 645 p = spi_master_get_devdata(master); 684 646 685 647 platform_set_drvdata(pdev, p); 686 - if (pdev->dev.of_node) 648 + 649 + of_id = of_match_device(sh_msiof_match, &pdev->dev); 650 + if (of_id) { 651 + p->chipdata = of_id->data; 687 652 p->info = sh_msiof_spi_parse_dt(&pdev->dev); 688 - else 653 + } else { 654 + p->chipdata = (const void *)pdev->id_entry->driver_data; 689 655 p->info = dev_get_platdata(&pdev->dev); 656 + } 690 657 691 658 if (!p->info) { 692 659 dev_err(&pdev->dev, "failed to obtain device info\n"); ··· 729 686 goto err1; 730 687 } 731 688 732 - ret = clk_prepare(p->clk); 733 - if (ret < 0) { 734 - dev_err(&pdev->dev, "unable to prepare clock\n"); 735 - goto err1; 736 - } 737 - 738 689 p->pdev = pdev; 739 690 pm_runtime_enable(&pdev->dev); 740 691 741 - /* The standard version of MSIOF use 64 word FIFOs */ 742 - p->tx_fifo_size = 64; 743 - p->rx_fifo_size = 64; 744 - 745 692 /* Platform data may override FIFO sizes */ 693 + p->tx_fifo_size = p->chipdata->tx_fifo_size; 694 + p->rx_fifo_size = p->chipdata->rx_fifo_size; 746 695 if (p->info->tx_fifo_override) 747 696 p->tx_fifo_size = p->info->tx_fifo_override; 748 697 if (p->info->rx_fifo_override) 749 698 p->rx_fifo_size = p->info->rx_fifo_override; 750 699 751 - /* init master and bitbang code */ 700 + /* init master code */ 752 701 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH; 753 702 master->mode_bits |= SPI_LSB_FIRST | SPI_3WIRE; 754 - master->flags = 0; 703 + master->flags = p->chipdata->master_flags; 755 704 master->bus_num = pdev->id; 705 + master->dev.of_node = pdev->dev.of_node; 756 706 master->num_chipselect = p->info->num_chipselect; 757 - master->setup = spi_bitbang_setup; 758 - master->cleanup = spi_bitbang_cleanup; 707 + master->setup = sh_msiof_spi_setup; 708 + master->prepare_message = sh_msiof_prepare_message; 709 + master->bits_per_word_mask = SPI_BPW_RANGE_MASK(8, 32); 710 + master->auto_runtime_pm = true; 711 + master->transfer_one = sh_msiof_transfer_one; 759 712 760 - p->bitbang.master = master; 761 - p->bitbang.chipselect = sh_msiof_spi_chipselect; 762 - p->bitbang.setup_transfer = sh_msiof_spi_setup_transfer; 763 - p->bitbang.txrx_bufs = sh_msiof_spi_txrx; 764 - p->bitbang.txrx_word[SPI_MODE_0] = sh_msiof_spi_txrx_word; 765 - p->bitbang.txrx_word[SPI_MODE_1] = sh_msiof_spi_txrx_word; 766 - p->bitbang.txrx_word[SPI_MODE_2] = sh_msiof_spi_txrx_word; 767 - p->bitbang.txrx_word[SPI_MODE_3] = sh_msiof_spi_txrx_word; 713 + ret = devm_spi_register_master(&pdev->dev, master); 714 + if (ret < 0) { 715 + dev_err(&pdev->dev, "spi_register_master error.\n"); 716 + goto err2; 717 + } 768 718 769 - ret = spi_bitbang_start(&p->bitbang); 770 - if (ret == 0) 771 - return 0; 719 + return 0; 772 720 721 + err2: 773 722 pm_runtime_disable(&pdev->dev); 774 - clk_unprepare(p->clk); 775 723 err1: 776 724 spi_master_put(master); 777 725 return ret; ··· 770 736 771 737 static int sh_msiof_spi_remove(struct platform_device *pdev) 772 738 { 773 - struct sh_msiof_spi_priv *p = platform_get_drvdata(pdev); 774 - int ret; 775 - 776 - ret = spi_bitbang_stop(&p->bitbang); 777 - if (!ret) { 778 - pm_runtime_disable(&pdev->dev); 779 - clk_unprepare(p->clk); 780 - spi_master_put(p->bitbang.master); 781 - } 782 - return ret; 739 + pm_runtime_disable(&pdev->dev); 740 + return 0; 783 741 } 784 742 785 - #ifdef CONFIG_OF 786 - static const struct of_device_id sh_msiof_match[] = { 787 - { .compatible = "renesas,sh-msiof", }, 788 - { .compatible = "renesas,sh-mobile-msiof", }, 743 + static struct platform_device_id spi_driver_ids[] = { 744 + { "spi_sh_msiof", (kernel_ulong_t)&sh_data }, 745 + { "spi_r8a7790_msiof", (kernel_ulong_t)&r8a779x_data }, 746 + { "spi_r8a7791_msiof", (kernel_ulong_t)&r8a779x_data }, 789 747 {}, 790 748 }; 791 - MODULE_DEVICE_TABLE(of, sh_msiof_match); 792 - #endif 749 + MODULE_DEVICE_TABLE(platform, spi_driver_ids); 793 750 794 751 static struct platform_driver sh_msiof_spi_drv = { 795 752 .probe = sh_msiof_spi_probe, 796 753 .remove = sh_msiof_spi_remove, 754 + .id_table = spi_driver_ids, 797 755 .driver = { 798 756 .name = "spi_sh_msiof", 799 757 .owner = THIS_MODULE,
+6 -1
drivers/spi/spi-sh-sci.c
··· 108 108 { 109 109 struct sh_sci_spi *sp = spi_master_get_devdata(dev->master); 110 110 111 - if (sp->info && sp->info->chip_select) 111 + if (sp->info->chip_select) 112 112 (sp->info->chip_select)(sp->info, dev->chip_select, value); 113 113 } 114 114 ··· 130 130 131 131 platform_set_drvdata(dev, sp); 132 132 sp->info = dev_get_platdata(&dev->dev); 133 + if (!sp->info) { 134 + dev_err(&dev->dev, "platform data is missing\n"); 135 + ret = -ENOENT; 136 + goto err1; 137 + } 133 138 134 139 /* setup spi bitbang adaptor */ 135 140 sp->bitbang.master = master;
+68 -48
drivers/spi/spi-sirf.c
··· 22 22 #include <linux/dmaengine.h> 23 23 #include <linux/dma-direction.h> 24 24 #include <linux/dma-mapping.h> 25 - #include <linux/sirfsoc_dma.h> 26 25 27 26 #define DRIVER_NAME "sirfsoc_spi" 28 27 ··· 131 132 #define IS_DMA_VALID(x) (x && ALIGNED(x->tx_buf) && ALIGNED(x->rx_buf) && \ 132 133 ALIGNED(x->len) && (x->len < 2 * PAGE_SIZE)) 133 134 135 + #define SIRFSOC_MAX_CMD_BYTES 4 136 + 134 137 struct sirfsoc_spi { 135 138 struct spi_bitbang bitbang; 136 139 struct completion rx_done; ··· 162 161 dma_addr_t dst_start; 163 162 void *dummypage; 164 163 int word_width; /* in bytes */ 164 + 165 + /* 166 + * if tx size is not more than 4 and rx size is NULL, use 167 + * command model 168 + */ 169 + bool tx_by_cmd; 165 170 166 171 int chipselect[0]; 167 172 }; ··· 267 260 268 261 writel(spi_stat, sspi->base + SIRFSOC_SPI_INT_STATUS); 269 262 263 + if (sspi->tx_by_cmd && (spi_stat & SIRFSOC_SPI_FRM_END)) { 264 + complete(&sspi->tx_done); 265 + writel(0x0, sspi->base + SIRFSOC_SPI_INT_EN); 266 + return IRQ_HANDLED; 267 + } 268 + 270 269 /* Error Conditions */ 271 270 if (spi_stat & SIRFSOC_SPI_RX_OFLOW || 272 271 spi_stat & SIRFSOC_SPI_TX_UFLOW) { ··· 322 309 reinit_completion(&sspi->tx_done); 323 310 324 311 writel(SIRFSOC_SPI_INT_MASK_ALL, sspi->base + SIRFSOC_SPI_INT_STATUS); 312 + 313 + /* 314 + * fill tx_buf into command register and wait for its completion 315 + */ 316 + if (sspi->tx_by_cmd) { 317 + u32 cmd; 318 + memcpy(&cmd, sspi->tx, t->len); 319 + 320 + if (sspi->word_width == 1 && !(spi->mode & SPI_LSB_FIRST)) 321 + cmd = cpu_to_be32(cmd) >> 322 + ((SIRFSOC_MAX_CMD_BYTES - t->len) * 8); 323 + if (sspi->word_width == 2 && t->len == 4 && 324 + (!(spi->mode & SPI_LSB_FIRST))) 325 + cmd = ((cmd & 0xffff) << 16) | (cmd >> 16); 326 + 327 + writel(cmd, sspi->base + SIRFSOC_SPI_CMD); 328 + writel(SIRFSOC_SPI_FRM_END_INT_EN, 329 + sspi->base + SIRFSOC_SPI_INT_EN); 330 + writel(SIRFSOC_SPI_CMD_TX_EN, 331 + sspi->base + SIRFSOC_SPI_TX_RX_EN); 332 + 333 + if (wait_for_completion_timeout(&sspi->tx_done, timeout) == 0) { 334 + dev_err(&spi->dev, "transfer timeout\n"); 335 + return 0; 336 + } 337 + 338 + return t->len; 339 + } 325 340 326 341 if (sspi->left_tx_word == 1) { 327 342 writel(readl(sspi->base + SIRFSOC_SPI_CTRL) | ··· 500 459 regval |= SIRFSOC_SPI_TRAN_DAT_FORMAT_8; 501 460 sspi->rx_word = spi_sirfsoc_rx_word_u8; 502 461 sspi->tx_word = spi_sirfsoc_tx_word_u8; 503 - txfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 504 - SIRFSOC_SPI_FIFO_WIDTH_BYTE; 505 - rxfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 506 - SIRFSOC_SPI_FIFO_WIDTH_BYTE; 507 - sspi->word_width = 1; 508 462 break; 509 463 case 12: 510 464 case 16: ··· 507 471 SIRFSOC_SPI_TRAN_DAT_FORMAT_16; 508 472 sspi->rx_word = spi_sirfsoc_rx_word_u16; 509 473 sspi->tx_word = spi_sirfsoc_tx_word_u16; 510 - txfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 511 - SIRFSOC_SPI_FIFO_WIDTH_WORD; 512 - rxfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 513 - SIRFSOC_SPI_FIFO_WIDTH_WORD; 514 - sspi->word_width = 2; 515 474 break; 516 475 case 32: 517 476 regval |= SIRFSOC_SPI_TRAN_DAT_FORMAT_32; 518 477 sspi->rx_word = spi_sirfsoc_rx_word_u32; 519 478 sspi->tx_word = spi_sirfsoc_tx_word_u32; 520 - txfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 521 - SIRFSOC_SPI_FIFO_WIDTH_DWORD; 522 - rxfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 523 - SIRFSOC_SPI_FIFO_WIDTH_DWORD; 524 - sspi->word_width = 4; 525 479 break; 526 480 default: 527 481 BUG(); 528 482 } 483 + 484 + sspi->word_width = DIV_ROUND_UP(bits_per_word, 8); 485 + txfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 486 + sspi->word_width; 487 + rxfifo_ctrl = SIRFSOC_SPI_FIFO_THD(SIRFSOC_SPI_FIFO_SIZE / 2) | 488 + sspi->word_width; 529 489 530 490 if (!(spi->mode & SPI_CS_HIGH)) 531 491 regval |= SIRFSOC_SPI_CS_IDLE_STAT; ··· 551 519 writel(txfifo_ctrl, sspi->base + SIRFSOC_SPI_TXFIFO_CTRL); 552 520 writel(rxfifo_ctrl, sspi->base + SIRFSOC_SPI_RXFIFO_CTRL); 553 521 522 + if (t && t->tx_buf && !t->rx_buf && (t->len <= SIRFSOC_MAX_CMD_BYTES)) { 523 + regval |= (SIRFSOC_SPI_CMD_BYTE_NUM((t->len - 1)) | 524 + SIRFSOC_SPI_CMD_MODE); 525 + sspi->tx_by_cmd = true; 526 + } else { 527 + regval &= ~SIRFSOC_SPI_CMD_MODE; 528 + sspi->tx_by_cmd = false; 529 + } 554 530 writel(regval, sspi->base + SIRFSOC_SPI_CTRL); 555 531 556 532 if (IS_DMA_VALID(t)) { ··· 588 548 struct spi_master *master; 589 549 struct resource *mem_res; 590 550 int num_cs, cs_gpio, irq; 591 - u32 rx_dma_ch, tx_dma_ch; 592 - dma_cap_mask_t dma_cap_mask; 593 551 int i; 594 552 int ret; 595 553 ··· 595 557 "sirf,spi-num-chipselects", &num_cs); 596 558 if (ret < 0) { 597 559 dev_err(&pdev->dev, "Unable to get chip select number\n"); 598 - goto err_cs; 599 - } 600 - 601 - ret = of_property_read_u32(pdev->dev.of_node, 602 - "sirf,spi-dma-rx-channel", &rx_dma_ch); 603 - if (ret < 0) { 604 - dev_err(&pdev->dev, "Unable to get rx dma channel\n"); 605 - goto err_cs; 606 - } 607 - 608 - ret = of_property_read_u32(pdev->dev.of_node, 609 - "sirf,spi-dma-tx-channel", &tx_dma_ch); 610 - if (ret < 0) { 611 - dev_err(&pdev->dev, "Unable to get tx dma channel\n"); 612 560 goto err_cs; 613 561 } 614 562 ··· 661 637 sspi->bitbang.master->dev.of_node = pdev->dev.of_node; 662 638 663 639 /* request DMA channels */ 664 - dma_cap_zero(dma_cap_mask); 665 - dma_cap_set(DMA_INTERLEAVE, dma_cap_mask); 666 - 667 - sspi->rx_chan = dma_request_channel(dma_cap_mask, (dma_filter_fn)sirfsoc_dma_filter_id, 668 - (void *)rx_dma_ch); 640 + sspi->rx_chan = dma_request_slave_channel(&pdev->dev, "rx"); 669 641 if (!sspi->rx_chan) { 670 642 dev_err(&pdev->dev, "can not allocate rx dma channel\n"); 671 643 ret = -ENODEV; 672 644 goto free_master; 673 645 } 674 - sspi->tx_chan = dma_request_channel(dma_cap_mask, (dma_filter_fn)sirfsoc_dma_filter_id, 675 - (void *)tx_dma_ch); 646 + sspi->tx_chan = dma_request_slave_channel(&pdev->dev, "tx"); 676 647 if (!sspi->tx_chan) { 677 648 dev_err(&pdev->dev, "can not allocate tx dma channel\n"); 678 649 ret = -ENODEV; ··· 743 724 return 0; 744 725 } 745 726 746 - #ifdef CONFIG_PM 727 + #ifdef CONFIG_PM_SLEEP 747 728 static int spi_sirfsoc_suspend(struct device *dev) 748 729 { 749 730 struct spi_master *master = dev_get_drvdata(dev); 750 731 struct sirfsoc_spi *sspi = spi_master_get_devdata(master); 732 + int ret; 733 + 734 + ret = spi_master_suspend(master); 735 + if (ret) 736 + return ret; 751 737 752 738 clk_disable(sspi->clk); 753 739 return 0; ··· 769 745 writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_RXFIFO_OP); 770 746 writel(SIRFSOC_SPI_FIFO_START, sspi->base + SIRFSOC_SPI_TXFIFO_OP); 771 747 772 - return 0; 748 + return spi_master_resume(master); 773 749 } 774 - 775 - static const struct dev_pm_ops spi_sirfsoc_pm_ops = { 776 - .suspend = spi_sirfsoc_suspend, 777 - .resume = spi_sirfsoc_resume, 778 - }; 779 750 #endif 751 + 752 + static SIMPLE_DEV_PM_OPS(spi_sirfsoc_pm_ops, spi_sirfsoc_suspend, 753 + spi_sirfsoc_resume); 780 754 781 755 static const struct of_device_id spi_sirfsoc_of_match[] = { 782 756 { .compatible = "sirf,prima2-spi", }, ··· 787 765 .driver = { 788 766 .name = DRIVER_NAME, 789 767 .owner = THIS_MODULE, 790 - #ifdef CONFIG_PM 791 768 .pm = &spi_sirfsoc_pm_ops, 792 - #endif 793 769 .of_match_table = spi_sirfsoc_of_match, 794 770 }, 795 771 .probe = spi_sirfsoc_probe,
+17 -6
drivers/spi/spidev.c
··· 73 73 */ 74 74 #define SPI_MODE_MASK (SPI_CPHA | SPI_CPOL | SPI_CS_HIGH \ 75 75 | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP \ 76 - | SPI_NO_CS | SPI_READY) 76 + | SPI_NO_CS | SPI_READY | SPI_TX_DUAL \ 77 + | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD) 77 78 78 79 struct spidev_data { 79 80 dev_t devt; ··· 266 265 buf += k_tmp->len; 267 266 268 267 k_tmp->cs_change = !!u_tmp->cs_change; 268 + k_tmp->tx_nbits = u_tmp->tx_nbits; 269 + k_tmp->rx_nbits = u_tmp->rx_nbits; 269 270 k_tmp->bits_per_word = u_tmp->bits_per_word; 270 271 k_tmp->delay_usecs = u_tmp->delay_usecs; 271 272 k_tmp->speed_hz = u_tmp->speed_hz; ··· 362 359 retval = __put_user(spi->mode & SPI_MODE_MASK, 363 360 (__u8 __user *)arg); 364 361 break; 362 + case SPI_IOC_RD_MODE32: 363 + retval = __put_user(spi->mode & SPI_MODE_MASK, 364 + (__u32 __user *)arg); 365 + break; 365 366 case SPI_IOC_RD_LSB_FIRST: 366 367 retval = __put_user((spi->mode & SPI_LSB_FIRST) ? 1 : 0, 367 368 (__u8 __user *)arg); ··· 379 372 380 373 /* write requests */ 381 374 case SPI_IOC_WR_MODE: 382 - retval = __get_user(tmp, (u8 __user *)arg); 375 + case SPI_IOC_WR_MODE32: 376 + if (cmd == SPI_IOC_WR_MODE) 377 + retval = __get_user(tmp, (u8 __user *)arg); 378 + else 379 + retval = __get_user(tmp, (u32 __user *)arg); 383 380 if (retval == 0) { 384 - u8 save = spi->mode; 381 + u32 save = spi->mode; 385 382 386 383 if (tmp & ~SPI_MODE_MASK) { 387 384 retval = -EINVAL; ··· 393 382 } 394 383 395 384 tmp |= spi->mode & ~SPI_MODE_MASK; 396 - spi->mode = (u8)tmp; 385 + spi->mode = (u16)tmp; 397 386 retval = spi_setup(spi); 398 387 if (retval < 0) 399 388 spi->mode = save; 400 389 else 401 - dev_dbg(&spi->dev, "spi mode %02x\n", tmp); 390 + dev_dbg(&spi->dev, "spi mode %x\n", tmp); 402 391 } 403 392 break; 404 393 case SPI_IOC_WR_LSB_FIRST: 405 394 retval = __get_user(tmp, (__u8 __user *)arg); 406 395 if (retval == 0) { 407 - u8 save = spi->mode; 396 + u32 save = spi->mode; 408 397 409 398 if (tmp) 410 399 spi->mode |= SPI_LSB_FIRST;
+4 -5
include/linux/platform_data/spi-s3c64xx.h
··· 1 - /* linux/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h 2 - * 1 + /* 3 2 * Copyright (C) 2009 Samsung Electronics Ltd. 4 3 * Jaswinder Singh <jassi.brar@samsung.com> 5 4 * ··· 7 8 * published by the Free Software Foundation. 8 9 */ 9 10 10 - #ifndef __S3C64XX_PLAT_SPI_H 11 - #define __S3C64XX_PLAT_SPI_H 11 + #ifndef __SPI_S3C64XX_H 12 + #define __SPI_S3C64XX_H 12 13 13 14 #include <linux/dmaengine.h> 14 15 ··· 67 68 extern struct s3c64xx_spi_info s3c64xx_spi0_pdata; 68 69 extern struct s3c64xx_spi_info s3c64xx_spi1_pdata; 69 70 extern struct s3c64xx_spi_info s3c64xx_spi2_pdata; 70 - #endif /* __S3C64XX_PLAT_SPI_H */ 71 + #endif /*__SPI_S3C64XX_H */
+12 -2
include/uapi/linux/spi/spidev.h
··· 42 42 #define SPI_LOOP 0x20 43 43 #define SPI_NO_CS 0x40 44 44 #define SPI_READY 0x80 45 + #define SPI_TX_DUAL 0x100 46 + #define SPI_TX_QUAD 0x200 47 + #define SPI_RX_DUAL 0x400 48 + #define SPI_RX_QUAD 0x800 45 49 46 50 /*---------------------------------------------------------------------------*/ 47 51 ··· 96 92 __u16 delay_usecs; 97 93 __u8 bits_per_word; 98 94 __u8 cs_change; 99 - __u32 pad; 95 + __u8 tx_nbits; 96 + __u8 rx_nbits; 97 + __u16 pad; 100 98 101 99 /* If the contents of 'struct spi_ioc_transfer' ever change 102 100 * incompatibly, then the ioctl number (currently 0) must change; ··· 116 110 #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) 117 111 118 112 119 - /* Read / Write of SPI mode (SPI_MODE_0..SPI_MODE_3) */ 113 + /* Read / Write of SPI mode (SPI_MODE_0..SPI_MODE_3) (limited to 8 bits) */ 120 114 #define SPI_IOC_RD_MODE _IOR(SPI_IOC_MAGIC, 1, __u8) 121 115 #define SPI_IOC_WR_MODE _IOW(SPI_IOC_MAGIC, 1, __u8) 122 116 ··· 131 125 /* Read / Write SPI device default max speed hz */ 132 126 #define SPI_IOC_RD_MAX_SPEED_HZ _IOR(SPI_IOC_MAGIC, 4, __u32) 133 127 #define SPI_IOC_WR_MAX_SPEED_HZ _IOW(SPI_IOC_MAGIC, 4, __u32) 128 + 129 + /* Read / Write of the SPI mode field */ 130 + #define SPI_IOC_RD_MODE32 _IOR(SPI_IOC_MAGIC, 5, __u32) 131 + #define SPI_IOC_WR_MODE32 _IOW(SPI_IOC_MAGIC, 5, __u32) 134 132 135 133 136 134