diff options
| -rw-r--r-- | Documentation/devicetree/bindings/spi/sh-msiof.txt | 19 | ||||
| -rw-r--r-- | drivers/spi/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/spi/spi-armada-3700.c | 25 | ||||
| -rw-r--r-- | drivers/spi/spi-ath79.c | 23 | ||||
| -rw-r--r-- | drivers/spi/spi-axi-spi-engine.c | 3 | ||||
| -rw-r--r-- | drivers/spi/spi-bcm-qspi.c | 194 | ||||
| -rw-r--r-- | drivers/spi/spi-bcm53xx.c | 18 | ||||
| -rw-r--r-- | drivers/spi/spi-davinci.c | 4 | ||||
| -rw-r--r-- | drivers/spi/spi-dw-mid.c | 4 | ||||
| -rw-r--r-- | drivers/spi/spi-dw.c | 9 | ||||
| -rw-r--r-- | drivers/spi/spi-dw.h | 1 | ||||
| -rw-r--r-- | drivers/spi/spi-fsl-lpspi.c | 8 | ||||
| -rw-r--r-- | drivers/spi/spi-fsl-spi.c | 17 | ||||
| -rw-r--r-- | drivers/spi/spi-mt65xx.c | 37 | ||||
| -rw-r--r-- | drivers/spi/spi-pxa2xx.c | 5 | ||||
| -rw-r--r-- | drivers/spi/spi-rspi.c | 5 | ||||
| -rw-r--r-- | drivers/spi/spi-s3c64xx.c | 2 | ||||
| -rw-r--r-- | drivers/spi/spi-sh-msiof.c | 4 | ||||
| -rw-r--r-- | drivers/spi/spi.c | 18 |
19 files changed, 259 insertions, 143 deletions
diff --git a/Documentation/devicetree/bindings/spi/sh-msiof.txt b/Documentation/devicetree/bindings/spi/sh-msiof.txt index da6614c63796..dc975064fa27 100644 --- a/Documentation/devicetree/bindings/spi/sh-msiof.txt +++ b/Documentation/devicetree/bindings/spi/sh-msiof.txt | |||
| @@ -1,17 +1,23 @@ | |||
| 1 | Renesas MSIOF spi controller | 1 | Renesas MSIOF spi controller |
| 2 | 2 | ||
| 3 | Required properties: | 3 | Required properties: |
| 4 | - compatible : "renesas,msiof-<soctype>" for SoCs, | 4 | - compatible : "renesas,msiof-r8a7790" (R-Car H2) |
| 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-W) | 5 | "renesas,msiof-r8a7791" (R-Car M2-W) |
| 10 | "renesas,msiof-r8a7792" (R-Car V2H) | 6 | "renesas,msiof-r8a7792" (R-Car V2H) |
| 11 | "renesas,msiof-r8a7793" (R-Car M2-N) | 7 | "renesas,msiof-r8a7793" (R-Car M2-N) |
| 12 | "renesas,msiof-r8a7794" (R-Car E2) | 8 | "renesas,msiof-r8a7794" (R-Car E2) |
| 13 | "renesas,msiof-r8a7796" (R-Car M3-W) | 9 | "renesas,msiof-r8a7796" (R-Car M3-W) |
| 14 | "renesas,msiof-sh73a0" (SH-Mobile AG5) | 10 | "renesas,msiof-sh73a0" (SH-Mobile AG5) |
| 11 | "renesas,sh-mobile-msiof" (generic SH-Mobile compatibile device) | ||
| 12 | "renesas,rcar-gen2-msiof" (generic R-Car Gen2 compatible device) | ||
| 13 | "renesas,rcar-gen3-msiof" (generic R-Car Gen3 compatible device) | ||
| 14 | "renesas,sh-msiof" (deprecated) | ||
| 15 | |||
| 16 | When compatible with the generic version, nodes | ||
| 17 | must list the SoC-specific version corresponding | ||
| 18 | to the platform first followed by the generic | ||
| 19 | version. | ||
| 20 | |||
| 15 | - reg : A list of offsets and lengths of the register sets for | 21 | - reg : A list of offsets and lengths of the register sets for |
| 16 | the device. | 22 | the device. |
| 17 | If only one register set is present, it is to be used | 23 | If only one register set is present, it is to be used |
| @@ -61,7 +67,8 @@ Documentation/devicetree/bindings/pinctrl/renesas,*. | |||
| 61 | Example: | 67 | Example: |
| 62 | 68 | ||
| 63 | msiof0: spi@e6e20000 { | 69 | msiof0: spi@e6e20000 { |
| 64 | compatible = "renesas,msiof-r8a7791"; | 70 | compatible = "renesas,msiof-r8a7791", |
| 71 | "renesas,rcar-gen2-msiof"; | ||
| 65 | reg = <0 0xe6e20000 0 0x0064>; | 72 | reg = <0 0xe6e20000 0 0x0064>; |
| 66 | interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>; | 73 | interrupts = <0 156 IRQ_TYPE_LEVEL_HIGH>; |
| 67 | clocks = <&mstp0_clks R8A7791_CLK_MSIOF0>; | 74 | clocks = <&mstp0_clks R8A7791_CLK_MSIOF0>; |
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index ec4aa252d6e8..7415022fa0d7 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig | |||
| @@ -162,7 +162,8 @@ config SPI_BCM63XX_HSSPI | |||
| 162 | 162 | ||
| 163 | config SPI_BCM_QSPI | 163 | config SPI_BCM_QSPI |
| 164 | tristate "Broadcom BSPI and MSPI controller support" | 164 | tristate "Broadcom BSPI and MSPI controller support" |
| 165 | depends on ARCH_BRCMSTB || ARCH_BCM || ARCH_BCM_IPROC || COMPILE_TEST | 165 | depends on ARCH_BRCMSTB || ARCH_BCM || ARCH_BCM_IPROC || \ |
| 166 | BMIPS_GENERIC || COMPILE_TEST | ||
| 166 | default ARCH_BCM_IPROC | 167 | default ARCH_BCM_IPROC |
| 167 | help | 168 | help |
| 168 | Enables support for the Broadcom SPI flash and MSPI controller. | 169 | Enables support for the Broadcom SPI flash and MSPI controller. |
| @@ -263,7 +264,7 @@ config SPI_EP93XX | |||
| 263 | mode. | 264 | mode. |
| 264 | 265 | ||
| 265 | config SPI_FALCON | 266 | config SPI_FALCON |
| 266 | tristate "Falcon SPI controller support" | 267 | bool "Falcon SPI controller support" |
| 267 | depends on SOC_FALCON | 268 | depends on SOC_FALCON |
| 268 | help | 269 | help |
| 269 | The external bus unit (EBU) found on the FALC-ON SoC has SPI | 270 | The external bus unit (EBU) found on the FALC-ON SoC has SPI |
| @@ -378,6 +379,7 @@ config SPI_FSL_SPI | |||
| 378 | config SPI_FSL_DSPI | 379 | config SPI_FSL_DSPI |
| 379 | tristate "Freescale DSPI controller" | 380 | tristate "Freescale DSPI controller" |
| 380 | select REGMAP_MMIO | 381 | select REGMAP_MMIO |
| 382 | depends on HAS_DMA | ||
| 381 | depends on SOC_VF610 || SOC_LS1021A || ARCH_LAYERSCAPE || COMPILE_TEST | 383 | depends on SOC_VF610 || SOC_LS1021A || ARCH_LAYERSCAPE || COMPILE_TEST |
| 382 | help | 384 | help |
| 383 | This enables support for the Freescale DSPI controller in master | 385 | This enables support for the Freescale DSPI controller in master |
diff --git a/drivers/spi/spi-armada-3700.c b/drivers/spi/spi-armada-3700.c index e89da0af45d2..6c7d7a460689 100644 --- a/drivers/spi/spi-armada-3700.c +++ b/drivers/spi/spi-armada-3700.c | |||
| @@ -170,12 +170,12 @@ static int a3700_spi_pin_mode_set(struct a3700_spi *a3700_spi, | |||
| 170 | val &= ~(A3700_SPI_DATA_PIN0 | A3700_SPI_DATA_PIN1); | 170 | val &= ~(A3700_SPI_DATA_PIN0 | A3700_SPI_DATA_PIN1); |
| 171 | 171 | ||
| 172 | switch (pin_mode) { | 172 | switch (pin_mode) { |
| 173 | case 1: | 173 | case SPI_NBITS_SINGLE: |
| 174 | break; | 174 | break; |
| 175 | case 2: | 175 | case SPI_NBITS_DUAL: |
| 176 | val |= A3700_SPI_DATA_PIN0; | 176 | val |= A3700_SPI_DATA_PIN0; |
| 177 | break; | 177 | break; |
| 178 | case 4: | 178 | case SPI_NBITS_QUAD: |
| 179 | val |= A3700_SPI_DATA_PIN1; | 179 | val |= A3700_SPI_DATA_PIN1; |
| 180 | break; | 180 | break; |
| 181 | default: | 181 | default: |
| @@ -340,8 +340,7 @@ static irqreturn_t a3700_spi_interrupt(int irq, void *dev_id) | |||
| 340 | spireg_write(a3700_spi, A3700_SPI_INT_STAT_REG, cause); | 340 | spireg_write(a3700_spi, A3700_SPI_INT_STAT_REG, cause); |
| 341 | 341 | ||
| 342 | /* Wake up the transfer */ | 342 | /* Wake up the transfer */ |
| 343 | if (a3700_spi->wait_mask & cause) | 343 | complete(&a3700_spi->done); |
| 344 | complete(&a3700_spi->done); | ||
| 345 | 344 | ||
| 346 | return IRQ_HANDLED; | 345 | return IRQ_HANDLED; |
| 347 | } | 346 | } |
| @@ -421,7 +420,7 @@ static void a3700_spi_fifo_thres_set(struct a3700_spi *a3700_spi, | |||
| 421 | } | 420 | } |
| 422 | 421 | ||
| 423 | static void a3700_spi_transfer_setup(struct spi_device *spi, | 422 | static void a3700_spi_transfer_setup(struct spi_device *spi, |
| 424 | struct spi_transfer *xfer) | 423 | struct spi_transfer *xfer) |
| 425 | { | 424 | { |
| 426 | struct a3700_spi *a3700_spi; | 425 | struct a3700_spi *a3700_spi; |
| 427 | unsigned int byte_len; | 426 | unsigned int byte_len; |
| @@ -562,6 +561,7 @@ static int a3700_spi_fifo_read(struct a3700_spi *a3700_spi) | |||
| 562 | val = spireg_read(a3700_spi, A3700_SPI_DATA_IN_REG); | 561 | val = spireg_read(a3700_spi, A3700_SPI_DATA_IN_REG); |
| 563 | if (a3700_spi->buf_len >= 4) { | 562 | if (a3700_spi->buf_len >= 4) { |
| 564 | u32 data = le32_to_cpu(val); | 563 | u32 data = le32_to_cpu(val); |
| 564 | |||
| 565 | memcpy(a3700_spi->rx_buf, &data, 4); | 565 | memcpy(a3700_spi->rx_buf, &data, 4); |
| 566 | 566 | ||
| 567 | a3700_spi->buf_len -= 4; | 567 | a3700_spi->buf_len -= 4; |
| @@ -800,7 +800,7 @@ static int a3700_spi_probe(struct platform_device *pdev) | |||
| 800 | struct spi_master *master; | 800 | struct spi_master *master; |
| 801 | struct a3700_spi *spi; | 801 | struct a3700_spi *spi; |
| 802 | u32 num_cs = 0; | 802 | u32 num_cs = 0; |
| 803 | int ret = 0; | 803 | int irq, ret = 0; |
| 804 | 804 | ||
| 805 | master = spi_alloc_master(dev, sizeof(*spi)); | 805 | master = spi_alloc_master(dev, sizeof(*spi)); |
| 806 | if (!master) { | 806 | if (!master) { |
| @@ -825,7 +825,7 @@ static int a3700_spi_probe(struct platform_device *pdev) | |||
| 825 | master->unprepare_message = a3700_spi_unprepare_message; | 825 | master->unprepare_message = a3700_spi_unprepare_message; |
| 826 | master->set_cs = a3700_spi_set_cs; | 826 | master->set_cs = a3700_spi_set_cs; |
| 827 | master->flags = SPI_MASTER_HALF_DUPLEX; | 827 | master->flags = SPI_MASTER_HALF_DUPLEX; |
| 828 | master->mode_bits |= (SPI_RX_DUAL | SPI_RX_DUAL | | 828 | master->mode_bits |= (SPI_RX_DUAL | SPI_TX_DUAL | |
| 829 | SPI_RX_QUAD | SPI_TX_QUAD); | 829 | SPI_RX_QUAD | SPI_TX_QUAD); |
| 830 | 830 | ||
| 831 | platform_set_drvdata(pdev, master); | 831 | platform_set_drvdata(pdev, master); |
| @@ -846,12 +846,13 @@ static int a3700_spi_probe(struct platform_device *pdev) | |||
| 846 | goto error; | 846 | goto error; |
| 847 | } | 847 | } |
| 848 | 848 | ||
| 849 | spi->irq = platform_get_irq(pdev, 0); | 849 | irq = platform_get_irq(pdev, 0); |
| 850 | if (spi->irq < 0) { | 850 | if (irq < 0) { |
| 851 | dev_err(dev, "could not get irq: %d\n", spi->irq); | 851 | dev_err(dev, "could not get irq: %d\n", irq); |
| 852 | ret = -ENXIO; | 852 | ret = -ENXIO; |
| 853 | goto error; | 853 | goto error; |
| 854 | } | 854 | } |
| 855 | spi->irq = irq; | ||
| 855 | 856 | ||
| 856 | init_completion(&spi->done); | 857 | init_completion(&spi->done); |
| 857 | 858 | ||
| @@ -900,7 +901,6 @@ static int a3700_spi_remove(struct platform_device *pdev) | |||
| 900 | struct a3700_spi *spi = spi_master_get_devdata(master); | 901 | struct a3700_spi *spi = spi_master_get_devdata(master); |
| 901 | 902 | ||
| 902 | clk_unprepare(spi->clk); | 903 | clk_unprepare(spi->clk); |
| 903 | spi_master_put(master); | ||
| 904 | 904 | ||
| 905 | return 0; | 905 | return 0; |
| 906 | } | 906 | } |
| @@ -908,7 +908,6 @@ static int a3700_spi_remove(struct platform_device *pdev) | |||
| 908 | static struct platform_driver a3700_spi_driver = { | 908 | static struct platform_driver a3700_spi_driver = { |
| 909 | .driver = { | 909 | .driver = { |
| 910 | .name = DRIVER_NAME, | 910 | .name = DRIVER_NAME, |
| 911 | .owner = THIS_MODULE, | ||
| 912 | .of_match_table = of_match_ptr(a3700_spi_dt_ids), | 911 | .of_match_table = of_match_ptr(a3700_spi_dt_ids), |
| 913 | }, | 912 | }, |
| 914 | .probe = a3700_spi_probe, | 913 | .probe = a3700_spi_probe, |
diff --git a/drivers/spi/spi-ath79.c b/drivers/spi/spi-ath79.c index f369174fbd88..b89cee11f418 100644 --- a/drivers/spi/spi-ath79.c +++ b/drivers/spi/spi-ath79.c | |||
| @@ -78,14 +78,16 @@ static void ath79_spi_chipselect(struct spi_device *spi, int is_active) | |||
| 78 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); | 78 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | if (spi->chip_select) { | 81 | if (gpio_is_valid(spi->cs_gpio)) { |
| 82 | /* SPI is normally active-low */ | 82 | /* SPI is normally active-low */ |
| 83 | gpio_set_value(spi->cs_gpio, cs_high); | 83 | gpio_set_value_cansleep(spi->cs_gpio, cs_high); |
| 84 | } else { | 84 | } else { |
| 85 | u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select); | ||
| 86 | |||
| 85 | if (cs_high) | 87 | if (cs_high) |
| 86 | sp->ioc_base |= AR71XX_SPI_IOC_CS0; | 88 | sp->ioc_base |= cs_bit; |
| 87 | else | 89 | else |
| 88 | sp->ioc_base &= ~AR71XX_SPI_IOC_CS0; | 90 | sp->ioc_base &= ~cs_bit; |
| 89 | 91 | ||
| 90 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); | 92 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); |
| 91 | } | 93 | } |
| @@ -118,11 +120,8 @@ static int ath79_spi_setup_cs(struct spi_device *spi) | |||
| 118 | struct ath79_spi *sp = ath79_spidev_to_sp(spi); | 120 | struct ath79_spi *sp = ath79_spidev_to_sp(spi); |
| 119 | int status; | 121 | int status; |
| 120 | 122 | ||
| 121 | if (spi->chip_select && !gpio_is_valid(spi->cs_gpio)) | ||
| 122 | return -EINVAL; | ||
| 123 | |||
| 124 | status = 0; | 123 | status = 0; |
| 125 | if (spi->chip_select) { | 124 | if (gpio_is_valid(spi->cs_gpio)) { |
| 126 | unsigned long flags; | 125 | unsigned long flags; |
| 127 | 126 | ||
| 128 | flags = GPIOF_DIR_OUT; | 127 | flags = GPIOF_DIR_OUT; |
| @@ -134,10 +133,12 @@ static int ath79_spi_setup_cs(struct spi_device *spi) | |||
| 134 | status = gpio_request_one(spi->cs_gpio, flags, | 133 | status = gpio_request_one(spi->cs_gpio, flags, |
| 135 | dev_name(&spi->dev)); | 134 | dev_name(&spi->dev)); |
| 136 | } else { | 135 | } else { |
| 136 | u32 cs_bit = AR71XX_SPI_IOC_CS(spi->chip_select); | ||
| 137 | |||
| 137 | if (spi->mode & SPI_CS_HIGH) | 138 | if (spi->mode & SPI_CS_HIGH) |
| 138 | sp->ioc_base &= ~AR71XX_SPI_IOC_CS0; | 139 | sp->ioc_base &= ~cs_bit; |
| 139 | else | 140 | else |
| 140 | sp->ioc_base |= AR71XX_SPI_IOC_CS0; | 141 | sp->ioc_base |= cs_bit; |
| 141 | 142 | ||
| 142 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); | 143 | ath79_spi_wr(sp, AR71XX_SPI_REG_IOC, sp->ioc_base); |
| 143 | } | 144 | } |
| @@ -147,7 +148,7 @@ static int ath79_spi_setup_cs(struct spi_device *spi) | |||
| 147 | 148 | ||
| 148 | static void ath79_spi_cleanup_cs(struct spi_device *spi) | 149 | static void ath79_spi_cleanup_cs(struct spi_device *spi) |
| 149 | { | 150 | { |
| 150 | if (spi->chip_select) { | 151 | if (gpio_is_valid(spi->cs_gpio)) { |
| 151 | gpio_free(spi->cs_gpio); | 152 | gpio_free(spi->cs_gpio); |
| 152 | } | 153 | } |
| 153 | } | 154 | } |
diff --git a/drivers/spi/spi-axi-spi-engine.c b/drivers/spi/spi-axi-spi-engine.c index 319225d7e761..6ab4c7700228 100644 --- a/drivers/spi/spi-axi-spi-engine.c +++ b/drivers/spi/spi-axi-spi-engine.c | |||
| @@ -494,7 +494,8 @@ static int spi_engine_probe(struct platform_device *pdev) | |||
| 494 | SPI_ENGINE_VERSION_MAJOR(version), | 494 | SPI_ENGINE_VERSION_MAJOR(version), |
| 495 | SPI_ENGINE_VERSION_MINOR(version), | 495 | SPI_ENGINE_VERSION_MINOR(version), |
| 496 | SPI_ENGINE_VERSION_PATCH(version)); | 496 | SPI_ENGINE_VERSION_PATCH(version)); |
| 497 | return -ENODEV; | 497 | ret = -ENODEV; |
| 498 | goto err_put_master; | ||
| 498 | } | 499 | } |
| 499 | 500 | ||
| 500 | spi_engine->clk = devm_clk_get(&pdev->dev, "s_axi_aclk"); | 501 | spi_engine->clk = devm_clk_get(&pdev->dev, "s_axi_aclk"); |
diff --git a/drivers/spi/spi-bcm-qspi.c b/drivers/spi/spi-bcm-qspi.c index 14f9dea3173f..958fb4ee972d 100644 --- a/drivers/spi/spi-bcm-qspi.c +++ b/drivers/spi/spi-bcm-qspi.c | |||
| @@ -89,7 +89,7 @@ | |||
| 89 | #define BSPI_BPP_MODE_SELECT_MASK BIT(8) | 89 | #define BSPI_BPP_MODE_SELECT_MASK BIT(8) |
| 90 | #define BSPI_BPP_ADDR_SELECT_MASK BIT(16) | 90 | #define BSPI_BPP_ADDR_SELECT_MASK BIT(16) |
| 91 | 91 | ||
| 92 | #define BSPI_READ_LENGTH 256 | 92 | #define BSPI_READ_LENGTH 512 |
| 93 | 93 | ||
| 94 | /* MSPI register offsets */ | 94 | /* MSPI register offsets */ |
| 95 | #define MSPI_SPCR0_LSB 0x000 | 95 | #define MSPI_SPCR0_LSB 0x000 |
| @@ -192,9 +192,11 @@ struct bcm_qspi_dev_id { | |||
| 192 | void *dev; | 192 | void *dev; |
| 193 | }; | 193 | }; |
| 194 | 194 | ||
| 195 | |||
| 195 | struct qspi_trans { | 196 | struct qspi_trans { |
| 196 | struct spi_transfer *trans; | 197 | struct spi_transfer *trans; |
| 197 | int byte; | 198 | int byte; |
| 199 | bool mspi_last_trans; | ||
| 198 | }; | 200 | }; |
| 199 | 201 | ||
| 200 | struct bcm_qspi { | 202 | struct bcm_qspi { |
| @@ -616,6 +618,16 @@ static int bcm_qspi_setup(struct spi_device *spi) | |||
| 616 | return 0; | 618 | return 0; |
| 617 | } | 619 | } |
| 618 | 620 | ||
| 621 | static bool bcm_qspi_mspi_transfer_is_last(struct bcm_qspi *qspi, | ||
| 622 | struct qspi_trans *qt) | ||
| 623 | { | ||
| 624 | if (qt->mspi_last_trans && | ||
| 625 | spi_transfer_is_last(qspi->master, qt->trans)) | ||
| 626 | return true; | ||
| 627 | else | ||
| 628 | return false; | ||
| 629 | } | ||
| 630 | |||
| 619 | static int update_qspi_trans_byte_count(struct bcm_qspi *qspi, | 631 | static int update_qspi_trans_byte_count(struct bcm_qspi *qspi, |
| 620 | struct qspi_trans *qt, int flags) | 632 | struct qspi_trans *qt, int flags) |
| 621 | { | 633 | { |
| @@ -629,7 +641,6 @@ static int update_qspi_trans_byte_count(struct bcm_qspi *qspi, | |||
| 629 | 641 | ||
| 630 | if (qt->byte >= qt->trans->len) { | 642 | if (qt->byte >= qt->trans->len) { |
| 631 | /* we're at the end of the spi_transfer */ | 643 | /* we're at the end of the spi_transfer */ |
| 632 | |||
| 633 | /* in TX mode, need to pause for a delay or CS change */ | 644 | /* in TX mode, need to pause for a delay or CS change */ |
| 634 | if (qt->trans->delay_usecs && | 645 | if (qt->trans->delay_usecs && |
| 635 | (flags & TRANS_STATUS_BREAK_DELAY)) | 646 | (flags & TRANS_STATUS_BREAK_DELAY)) |
| @@ -641,7 +652,7 @@ static int update_qspi_trans_byte_count(struct bcm_qspi *qspi, | |||
| 641 | goto done; | 652 | goto done; |
| 642 | 653 | ||
| 643 | dev_dbg(&qspi->pdev->dev, "advance msg exit\n"); | 654 | dev_dbg(&qspi->pdev->dev, "advance msg exit\n"); |
| 644 | if (spi_transfer_is_last(qspi->master, qt->trans)) | 655 | if (bcm_qspi_mspi_transfer_is_last(qspi, qt)) |
| 645 | ret = TRANS_STATUS_BREAK_EOM; | 656 | ret = TRANS_STATUS_BREAK_EOM; |
| 646 | else | 657 | else |
| 647 | ret = TRANS_STATUS_BREAK_NO_BYTES; | 658 | ret = TRANS_STATUS_BREAK_NO_BYTES; |
| @@ -813,7 +824,7 @@ static int bcm_qspi_bspi_flash_read(struct spi_device *spi, | |||
| 813 | struct spi_flash_read_message *msg) | 824 | struct spi_flash_read_message *msg) |
| 814 | { | 825 | { |
| 815 | struct bcm_qspi *qspi = spi_master_get_devdata(spi->master); | 826 | struct bcm_qspi *qspi = spi_master_get_devdata(spi->master); |
| 816 | u32 addr = 0, len, len_words; | 827 | u32 addr = 0, len, rdlen, len_words; |
| 817 | int ret = 0; | 828 | int ret = 0; |
| 818 | unsigned long timeo = msecs_to_jiffies(100); | 829 | unsigned long timeo = msecs_to_jiffies(100); |
| 819 | struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; | 830 | struct bcm_qspi_soc_intc *soc_intc = qspi->soc_intc; |
| @@ -826,7 +837,7 @@ static int bcm_qspi_bspi_flash_read(struct spi_device *spi, | |||
| 826 | bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0); | 837 | bcm_qspi_write(qspi, MSPI, MSPI_WRITE_LOCK, 0); |
| 827 | 838 | ||
| 828 | /* | 839 | /* |
| 829 | * when using flex mode mode we need to send | 840 | * when using flex mode we need to send |
| 830 | * the upper address byte to bspi | 841 | * the upper address byte to bspi |
| 831 | */ | 842 | */ |
| 832 | if (bcm_qspi_bspi_ver_three(qspi) == false) { | 843 | if (bcm_qspi_bspi_ver_three(qspi) == false) { |
| @@ -840,48 +851,127 @@ static int bcm_qspi_bspi_flash_read(struct spi_device *spi, | |||
| 840 | else | 851 | else |
| 841 | addr = msg->from & 0x00ffffff; | 852 | addr = msg->from & 0x00ffffff; |
| 842 | 853 | ||
| 843 | /* set BSPI RAF buffer max read length */ | ||
| 844 | len = msg->len; | ||
| 845 | if (len > BSPI_READ_LENGTH) | ||
| 846 | len = BSPI_READ_LENGTH; | ||
| 847 | |||
| 848 | if (bcm_qspi_bspi_ver_three(qspi) == true) | 854 | if (bcm_qspi_bspi_ver_three(qspi) == true) |
| 849 | addr = (addr + 0xc00000) & 0xffffff; | 855 | addr = (addr + 0xc00000) & 0xffffff; |
| 850 | 856 | ||
| 851 | reinit_completion(&qspi->bspi_done); | 857 | /* |
| 852 | bcm_qspi_enable_bspi(qspi); | 858 | * read into the entire buffer by breaking the reads |
| 853 | len_words = (len + 3) >> 2; | 859 | * into RAF buffer read lengths |
| 854 | qspi->bspi_rf_msg = msg; | 860 | */ |
| 855 | qspi->bspi_rf_msg_status = 0; | 861 | len = msg->len; |
| 856 | qspi->bspi_rf_msg_idx = 0; | 862 | qspi->bspi_rf_msg_idx = 0; |
| 857 | qspi->bspi_rf_msg_len = len; | ||
| 858 | dev_dbg(&qspi->pdev->dev, "bspi xfr addr 0x%x len 0x%x", addr, len); | ||
| 859 | 863 | ||
| 860 | bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr); | 864 | do { |
| 861 | bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words); | 865 | if (len > BSPI_READ_LENGTH) |
| 862 | bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0); | 866 | rdlen = BSPI_READ_LENGTH; |
| 867 | else | ||
| 868 | rdlen = len; | ||
| 869 | |||
| 870 | reinit_completion(&qspi->bspi_done); | ||
| 871 | bcm_qspi_enable_bspi(qspi); | ||
| 872 | len_words = (rdlen + 3) >> 2; | ||
| 873 | qspi->bspi_rf_msg = msg; | ||
| 874 | qspi->bspi_rf_msg_status = 0; | ||
| 875 | qspi->bspi_rf_msg_len = rdlen; | ||
| 876 | dev_dbg(&qspi->pdev->dev, | ||
| 877 | "bspi xfr addr 0x%x len 0x%x", addr, rdlen); | ||
| 878 | bcm_qspi_write(qspi, BSPI, BSPI_RAF_START_ADDR, addr); | ||
| 879 | bcm_qspi_write(qspi, BSPI, BSPI_RAF_NUM_WORDS, len_words); | ||
| 880 | bcm_qspi_write(qspi, BSPI, BSPI_RAF_WATERMARK, 0); | ||
| 881 | if (qspi->soc_intc) { | ||
| 882 | /* | ||
| 883 | * clear soc MSPI and BSPI interrupts and enable | ||
| 884 | * BSPI interrupts. | ||
| 885 | */ | ||
| 886 | soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_BSPI_DONE); | ||
| 887 | soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE, true); | ||
| 888 | } | ||
| 863 | 889 | ||
| 864 | if (qspi->soc_intc) { | 890 | /* Must flush previous writes before starting BSPI operation */ |
| 865 | /* | 891 | mb(); |
| 866 | * clear soc MSPI and BSPI interrupts and enable | 892 | bcm_qspi_bspi_lr_start(qspi); |
| 867 | * BSPI interrupts. | 893 | if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) { |
| 868 | */ | 894 | dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n"); |
| 869 | soc_intc->bcm_qspi_int_ack(soc_intc, MSPI_BSPI_DONE); | 895 | ret = -ETIMEDOUT; |
| 870 | soc_intc->bcm_qspi_int_set(soc_intc, BSPI_DONE, true); | 896 | break; |
| 897 | } | ||
| 898 | |||
| 899 | /* set msg return length */ | ||
| 900 | msg->retlen += rdlen; | ||
| 901 | addr += rdlen; | ||
| 902 | len -= rdlen; | ||
| 903 | } while (len); | ||
| 904 | |||
| 905 | return ret; | ||
| 906 | } | ||
| 907 | |||
| 908 | static int bcm_qspi_transfer_one(struct spi_master *master, | ||
| 909 | struct spi_device *spi, | ||
| 910 | struct spi_transfer *trans) | ||
| 911 | { | ||
| 912 | struct bcm_qspi *qspi = spi_master_get_devdata(master); | ||
| 913 | int slots; | ||
| 914 | unsigned long timeo = msecs_to_jiffies(100); | ||
| 915 | |||
| 916 | bcm_qspi_chip_select(qspi, spi->chip_select); | ||
| 917 | qspi->trans_pos.trans = trans; | ||
| 918 | qspi->trans_pos.byte = 0; | ||
| 919 | |||
| 920 | while (qspi->trans_pos.byte < trans->len) { | ||
| 921 | reinit_completion(&qspi->mspi_done); | ||
| 922 | |||
| 923 | slots = write_to_hw(qspi, spi); | ||
| 924 | if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) { | ||
| 925 | dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n"); | ||
| 926 | return -ETIMEDOUT; | ||
| 927 | } | ||
| 928 | |||
| 929 | read_from_hw(qspi, slots); | ||
| 871 | } | 930 | } |
| 872 | 931 | ||
| 873 | /* Must flush previous writes before starting BSPI operation */ | 932 | return 0; |
| 874 | mb(); | 933 | } |
| 875 | 934 | ||
| 876 | bcm_qspi_bspi_lr_start(qspi); | 935 | static int bcm_qspi_mspi_flash_read(struct spi_device *spi, |
| 877 | if (!wait_for_completion_timeout(&qspi->bspi_done, timeo)) { | 936 | struct spi_flash_read_message *msg) |
| 878 | dev_err(&qspi->pdev->dev, "timeout waiting for BSPI\n"); | 937 | { |
| 879 | ret = -ETIMEDOUT; | 938 | struct bcm_qspi *qspi = spi_master_get_devdata(spi->master); |
| 880 | } else { | 939 | struct spi_transfer t[2]; |
| 881 | /* set the return length for the caller */ | 940 | u8 cmd[6]; |
| 882 | msg->retlen = len; | 941 | int ret; |
| 942 | |||
| 943 | memset(cmd, 0, sizeof(cmd)); | ||
| 944 | memset(t, 0, sizeof(t)); | ||
| 945 | |||
| 946 | /* tx */ | ||
| 947 | /* opcode is in cmd[0] */ | ||
| 948 | cmd[0] = msg->read_opcode; | ||
| 949 | cmd[1] = msg->from >> (msg->addr_width * 8 - 8); | ||
| 950 | cmd[2] = msg->from >> (msg->addr_width * 8 - 16); | ||
| 951 | cmd[3] = msg->from >> (msg->addr_width * 8 - 24); | ||
| 952 | cmd[4] = msg->from >> (msg->addr_width * 8 - 32); | ||
| 953 | t[0].tx_buf = cmd; | ||
| 954 | t[0].len = msg->addr_width + msg->dummy_bytes + 1; | ||
| 955 | t[0].bits_per_word = spi->bits_per_word; | ||
| 956 | t[0].tx_nbits = msg->opcode_nbits; | ||
| 957 | /* lets mspi know that this is not last transfer */ | ||
| 958 | qspi->trans_pos.mspi_last_trans = false; | ||
| 959 | ret = bcm_qspi_transfer_one(spi->master, spi, &t[0]); | ||
| 960 | |||
| 961 | /* rx */ | ||
| 962 | qspi->trans_pos.mspi_last_trans = true; | ||
| 963 | if (!ret) { | ||
| 964 | /* rx */ | ||
| 965 | t[1].rx_buf = msg->buf; | ||
| 966 | t[1].len = msg->len; | ||
| 967 | t[1].rx_nbits = msg->data_nbits; | ||
| 968 | t[1].bits_per_word = spi->bits_per_word; | ||
| 969 | ret = bcm_qspi_transfer_one(spi->master, spi, &t[1]); | ||
| 883 | } | 970 | } |
| 884 | 971 | ||
| 972 | if (!ret) | ||
| 973 | msg->retlen = msg->len; | ||
| 974 | |||
| 885 | return ret; | 975 | return ret; |
| 886 | } | 976 | } |
| 887 | 977 | ||
| @@ -918,8 +1008,7 @@ static int bcm_qspi_flash_read(struct spi_device *spi, | |||
| 918 | mspi_read = true; | 1008 | mspi_read = true; |
| 919 | 1009 | ||
| 920 | if (mspi_read) | 1010 | if (mspi_read) |
| 921 | /* this will make the m25p80 read to fallback to mspi read */ | 1011 | return bcm_qspi_mspi_flash_read(spi, msg); |
| 922 | return -EAGAIN; | ||
| 923 | 1012 | ||
| 924 | io_width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE; | 1013 | io_width = msg->data_nbits ? msg->data_nbits : SPI_NBITS_SINGLE; |
| 925 | addrlen = msg->addr_width; | 1014 | addrlen = msg->addr_width; |
| @@ -931,33 +1020,6 @@ static int bcm_qspi_flash_read(struct spi_device *spi, | |||
| 931 | return ret; | 1020 | return ret; |
| 932 | } | 1021 | } |
| 933 | 1022 | ||
| 934 | static int bcm_qspi_transfer_one(struct spi_master *master, | ||
| 935 | struct spi_device *spi, | ||
| 936 | struct spi_transfer *trans) | ||
| 937 | { | ||
| 938 | struct bcm_qspi *qspi = spi_master_get_devdata(master); | ||
| 939 | int slots; | ||
| 940 | unsigned long timeo = msecs_to_jiffies(100); | ||
| 941 | |||
| 942 | bcm_qspi_chip_select(qspi, spi->chip_select); | ||
| 943 | qspi->trans_pos.trans = trans; | ||
| 944 | qspi->trans_pos.byte = 0; | ||
| 945 | |||
| 946 | while (qspi->trans_pos.byte < trans->len) { | ||
| 947 | reinit_completion(&qspi->mspi_done); | ||
| 948 | |||
| 949 | slots = write_to_hw(qspi, spi); | ||
| 950 | if (!wait_for_completion_timeout(&qspi->mspi_done, timeo)) { | ||
| 951 | dev_err(&qspi->pdev->dev, "timeout waiting for MSPI\n"); | ||
| 952 | return -ETIMEDOUT; | ||
| 953 | } | ||
| 954 | |||
| 955 | read_from_hw(qspi, slots); | ||
| 956 | } | ||
| 957 | |||
| 958 | return 0; | ||
| 959 | } | ||
| 960 | |||
| 961 | static void bcm_qspi_cleanup(struct spi_device *spi) | 1023 | static void bcm_qspi_cleanup(struct spi_device *spi) |
| 962 | { | 1024 | { |
| 963 | struct bcm_qspi_parms *xp = spi_get_ctldata(spi); | 1025 | struct bcm_qspi_parms *xp = spi_get_ctldata(spi); |
| @@ -1187,6 +1249,7 @@ int bcm_qspi_probe(struct platform_device *pdev, | |||
| 1187 | qspi->pdev = pdev; | 1249 | qspi->pdev = pdev; |
| 1188 | qspi->trans_pos.trans = NULL; | 1250 | qspi->trans_pos.trans = NULL; |
| 1189 | qspi->trans_pos.byte = 0; | 1251 | qspi->trans_pos.byte = 0; |
| 1252 | qspi->trans_pos.mspi_last_trans = true; | ||
| 1190 | qspi->master = master; | 1253 | qspi->master = master; |
| 1191 | 1254 | ||
| 1192 | master->bus_num = -1; | 1255 | master->bus_num = -1; |
| @@ -1345,7 +1408,6 @@ int bcm_qspi_remove(struct platform_device *pdev) | |||
| 1345 | { | 1408 | { |
| 1346 | struct bcm_qspi *qspi = platform_get_drvdata(pdev); | 1409 | struct bcm_qspi *qspi = platform_get_drvdata(pdev); |
| 1347 | 1410 | ||
| 1348 | platform_set_drvdata(pdev, NULL); | ||
| 1349 | bcm_qspi_hw_uninit(qspi); | 1411 | bcm_qspi_hw_uninit(qspi); |
| 1350 | clk_disable_unprepare(qspi->clk); | 1412 | clk_disable_unprepare(qspi->clk); |
| 1351 | kfree(qspi->dev_ids); | 1413 | kfree(qspi->dev_ids); |
diff --git a/drivers/spi/spi-bcm53xx.c b/drivers/spi/spi-bcm53xx.c index afb51699dbb5..6e409eabe1c9 100644 --- a/drivers/spi/spi-bcm53xx.c +++ b/drivers/spi/spi-bcm53xx.c | |||
| @@ -1,3 +1,11 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2014-2016 Rafał Miłecki <rafal@milecki.pl> | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | |||
| 1 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 9 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| 2 | 10 | ||
| 3 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
| @@ -275,10 +283,6 @@ static int bcm53xxspi_flash_read(struct spi_device *spi, | |||
| 275 | * BCMA | 283 | * BCMA |
| 276 | **************************************************/ | 284 | **************************************************/ |
| 277 | 285 | ||
| 278 | static struct spi_board_info bcm53xx_info = { | ||
| 279 | .modalias = "bcm53xxspiflash", | ||
| 280 | }; | ||
| 281 | |||
| 282 | static const struct bcma_device_id bcm53xxspi_bcma_tbl[] = { | 286 | static const struct bcma_device_id bcm53xxspi_bcma_tbl[] = { |
| 283 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_QSPI, BCMA_ANY_REV, BCMA_ANY_CLASS), | 287 | BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_NS_QSPI, BCMA_ANY_REV, BCMA_ANY_CLASS), |
| 284 | {}, | 288 | {}, |
| @@ -311,6 +315,7 @@ static int bcm53xxspi_bcma_probe(struct bcma_device *core) | |||
| 311 | b53spi->bspi = true; | 315 | b53spi->bspi = true; |
| 312 | bcm53xxspi_disable_bspi(b53spi); | 316 | bcm53xxspi_disable_bspi(b53spi); |
| 313 | 317 | ||
| 318 | master->dev.of_node = dev->of_node; | ||
| 314 | master->transfer_one = bcm53xxspi_transfer_one; | 319 | master->transfer_one = bcm53xxspi_transfer_one; |
| 315 | if (b53spi->mmio_base) | 320 | if (b53spi->mmio_base) |
| 316 | master->spi_flash_read = bcm53xxspi_flash_read; | 321 | master->spi_flash_read = bcm53xxspi_flash_read; |
| @@ -324,9 +329,6 @@ static int bcm53xxspi_bcma_probe(struct bcma_device *core) | |||
| 324 | return err; | 329 | return err; |
| 325 | } | 330 | } |
| 326 | 331 | ||
| 327 | /* Broadcom SoCs (at least with the CC rev 42) use SPI for flash only */ | ||
| 328 | spi_new_device(master, &bcm53xx_info); | ||
| 329 | |||
| 330 | return 0; | 332 | return 0; |
| 331 | } | 333 | } |
| 332 | 334 | ||
| @@ -361,4 +363,4 @@ module_exit(bcm53xxspi_module_exit); | |||
| 361 | 363 | ||
| 362 | MODULE_DESCRIPTION("Broadcom BCM53xx SPI Controller driver"); | 364 | MODULE_DESCRIPTION("Broadcom BCM53xx SPI Controller driver"); |
| 363 | MODULE_AUTHOR("Rafał Miłecki <zajec5@gmail.com>"); | 365 | MODULE_AUTHOR("Rafał Miłecki <zajec5@gmail.com>"); |
| 364 | MODULE_LICENSE("GPL"); | 366 | MODULE_LICENSE("GPL v2"); |
diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c index d36c11b73a35..02fb96797ac8 100644 --- a/drivers/spi/spi-davinci.c +++ b/drivers/spi/spi-davinci.c | |||
| @@ -646,7 +646,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) | |||
| 646 | buf = t->rx_buf; | 646 | buf = t->rx_buf; |
| 647 | t->rx_dma = dma_map_single(&spi->dev, buf, | 647 | t->rx_dma = dma_map_single(&spi->dev, buf, |
| 648 | t->len, DMA_FROM_DEVICE); | 648 | t->len, DMA_FROM_DEVICE); |
| 649 | if (!t->rx_dma) { | 649 | if (dma_mapping_error(&spi->dev, !t->rx_dma)) { |
| 650 | ret = -EFAULT; | 650 | ret = -EFAULT; |
| 651 | goto err_rx_map; | 651 | goto err_rx_map; |
| 652 | } | 652 | } |
| @@ -660,7 +660,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct spi_transfer *t) | |||
| 660 | buf = (void *)t->tx_buf; | 660 | buf = (void *)t->tx_buf; |
| 661 | t->tx_dma = dma_map_single(&spi->dev, buf, | 661 | t->tx_dma = dma_map_single(&spi->dev, buf, |
| 662 | t->len, DMA_TO_DEVICE); | 662 | t->len, DMA_TO_DEVICE); |
| 663 | if (!t->tx_dma) { | 663 | if (dma_mapping_error(&spi->dev, t->tx_dma)) { |
| 664 | ret = -EFAULT; | 664 | ret = -EFAULT; |
| 665 | goto err_tx_map; | 665 | goto err_tx_map; |
| 666 | } | 666 | } |
diff --git a/drivers/spi/spi-dw-mid.c b/drivers/spi/spi-dw-mid.c index e31971f91475..837cb8d0bac6 100644 --- a/drivers/spi/spi-dw-mid.c +++ b/drivers/spi/spi-dw-mid.c | |||
| @@ -274,11 +274,11 @@ static int mid_spi_dma_transfer(struct dw_spi *dws, struct spi_transfer *xfer) | |||
| 274 | static void mid_spi_dma_stop(struct dw_spi *dws) | 274 | static void mid_spi_dma_stop(struct dw_spi *dws) |
| 275 | { | 275 | { |
| 276 | if (test_bit(TX_BUSY, &dws->dma_chan_busy)) { | 276 | if (test_bit(TX_BUSY, &dws->dma_chan_busy)) { |
| 277 | dmaengine_terminate_all(dws->txchan); | 277 | dmaengine_terminate_sync(dws->txchan); |
| 278 | clear_bit(TX_BUSY, &dws->dma_chan_busy); | 278 | clear_bit(TX_BUSY, &dws->dma_chan_busy); |
| 279 | } | 279 | } |
| 280 | if (test_bit(RX_BUSY, &dws->dma_chan_busy)) { | 280 | if (test_bit(RX_BUSY, &dws->dma_chan_busy)) { |
| 281 | dmaengine_terminate_all(dws->rxchan); | 281 | dmaengine_terminate_sync(dws->rxchan); |
| 282 | clear_bit(RX_BUSY, &dws->dma_chan_busy); | 282 | clear_bit(RX_BUSY, &dws->dma_chan_busy); |
| 283 | } | 283 | } |
| 284 | } | 284 | } |
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index b715a26a9148..b217c22ff72f 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c | |||
| @@ -107,7 +107,10 @@ static const struct file_operations dw_spi_regs_ops = { | |||
| 107 | 107 | ||
| 108 | static int dw_spi_debugfs_init(struct dw_spi *dws) | 108 | static int dw_spi_debugfs_init(struct dw_spi *dws) |
| 109 | { | 109 | { |
| 110 | dws->debugfs = debugfs_create_dir("dw_spi", NULL); | 110 | char name[32]; |
| 111 | |||
| 112 | snprintf(name, 32, "dw_spi%d", dws->master->bus_num); | ||
| 113 | dws->debugfs = debugfs_create_dir(name, NULL); | ||
| 111 | if (!dws->debugfs) | 114 | if (!dws->debugfs) |
| 112 | return -ENOMEM; | 115 | return -ENOMEM; |
| 113 | 116 | ||
| @@ -483,9 +486,9 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) | |||
| 483 | dws->type = SSI_MOTO_SPI; | 486 | dws->type = SSI_MOTO_SPI; |
| 484 | dws->dma_inited = 0; | 487 | dws->dma_inited = 0; |
| 485 | dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR); | 488 | dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR); |
| 486 | snprintf(dws->name, sizeof(dws->name), "dw_spi%d", dws->bus_num); | ||
| 487 | 489 | ||
| 488 | ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, dws->name, master); | 490 | ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, dev_name(dev), |
| 491 | master); | ||
| 489 | if (ret < 0) { | 492 | if (ret < 0) { |
| 490 | dev_err(dev, "can not get IRQ\n"); | 493 | dev_err(dev, "can not get IRQ\n"); |
| 491 | goto err_free_master; | 494 | goto err_free_master; |
diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h index c21ca02f8ec5..da5eab62df34 100644 --- a/drivers/spi/spi-dw.h +++ b/drivers/spi/spi-dw.h | |||
| @@ -101,7 +101,6 @@ struct dw_spi_dma_ops { | |||
| 101 | struct dw_spi { | 101 | struct dw_spi { |
| 102 | struct spi_master *master; | 102 | struct spi_master *master; |
| 103 | enum dw_ssi_type type; | 103 | enum dw_ssi_type type; |
| 104 | char name[16]; | ||
| 105 | 104 | ||
| 106 | void __iomem *regs; | 105 | void __iomem *regs; |
| 107 | unsigned long paddr; | 106 | unsigned long paddr; |
diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c index 52551f6d0c7d..cb3c73007ca1 100644 --- a/drivers/spi/spi-fsl-lpspi.c +++ b/drivers/spi/spi-fsl-lpspi.c | |||
| @@ -366,7 +366,7 @@ static int fsl_lpspi_transfer_one_msg(struct spi_master *master, | |||
| 366 | struct spi_transfer *xfer; | 366 | struct spi_transfer *xfer; |
| 367 | bool is_first_xfer = true; | 367 | bool is_first_xfer = true; |
| 368 | u32 temp; | 368 | u32 temp; |
| 369 | int ret; | 369 | int ret = 0; |
| 370 | 370 | ||
| 371 | msg->status = 0; | 371 | msg->status = 0; |
| 372 | msg->actual_length = 0; | 372 | msg->actual_length = 0; |
| @@ -512,9 +512,9 @@ static int fsl_lpspi_remove(struct platform_device *pdev) | |||
| 512 | 512 | ||
| 513 | static struct platform_driver fsl_lpspi_driver = { | 513 | static struct platform_driver fsl_lpspi_driver = { |
| 514 | .driver = { | 514 | .driver = { |
| 515 | .name = DRIVER_NAME, | 515 | .name = DRIVER_NAME, |
| 516 | .of_match_table = fsl_lpspi_dt_ids, | 516 | .of_match_table = fsl_lpspi_dt_ids, |
| 517 | }, | 517 | }, |
| 518 | .probe = fsl_lpspi_probe, | 518 | .probe = fsl_lpspi_probe, |
| 519 | .remove = fsl_lpspi_remove, | 519 | .remove = fsl_lpspi_remove, |
| 520 | }; | 520 | }; |
diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c index 8b290d9d7935..0fc3452652ae 100644 --- a/drivers/spi/spi-fsl-spi.c +++ b/drivers/spi/spi-fsl-spi.c | |||
| @@ -267,10 +267,9 @@ static int fsl_spi_setup_transfer(struct spi_device *spi, | |||
| 267 | if ((mpc8xxx_spi->spibrg / hz) > 64) { | 267 | if ((mpc8xxx_spi->spibrg / hz) > 64) { |
| 268 | cs->hw_mode |= SPMODE_DIV16; | 268 | cs->hw_mode |= SPMODE_DIV16; |
| 269 | pm = (mpc8xxx_spi->spibrg - 1) / (hz * 64) + 1; | 269 | pm = (mpc8xxx_spi->spibrg - 1) / (hz * 64) + 1; |
| 270 | 270 | WARN_ONCE(pm > 16, | |
| 271 | WARN_ONCE(pm > 16, "%s: Requested speed is too low: %d Hz. " | 271 | "%s: Requested speed is too low: %d Hz. Will use %d Hz instead.\n", |
| 272 | "Will use %d Hz instead.\n", dev_name(&spi->dev), | 272 | dev_name(&spi->dev), hz, mpc8xxx_spi->spibrg / 1024); |
| 273 | hz, mpc8xxx_spi->spibrg / 1024); | ||
| 274 | if (pm > 16) | 273 | if (pm > 16) |
| 275 | pm = 16; | 274 | pm = 16; |
| 276 | } else { | 275 | } else { |
| @@ -727,12 +726,13 @@ static int of_fsl_spi_get_chipselects(struct device *dev) | |||
| 727 | return 0; | 726 | return 0; |
| 728 | } | 727 | } |
| 729 | 728 | ||
| 730 | pinfo->gpios = kmalloc(ngpios * sizeof(*pinfo->gpios), GFP_KERNEL); | 729 | pinfo->gpios = kmalloc_array(ngpios, sizeof(*pinfo->gpios), |
| 730 | GFP_KERNEL); | ||
| 731 | if (!pinfo->gpios) | 731 | if (!pinfo->gpios) |
| 732 | return -ENOMEM; | 732 | return -ENOMEM; |
| 733 | memset(pinfo->gpios, -1, ngpios * sizeof(*pinfo->gpios)); | 733 | memset(pinfo->gpios, -1, ngpios * sizeof(*pinfo->gpios)); |
| 734 | 734 | ||
| 735 | pinfo->alow_flags = kzalloc(ngpios * sizeof(*pinfo->alow_flags), | 735 | pinfo->alow_flags = kcalloc(ngpios, sizeof(*pinfo->alow_flags), |
| 736 | GFP_KERNEL); | 736 | GFP_KERNEL); |
| 737 | if (!pinfo->alow_flags) { | 737 | if (!pinfo->alow_flags) { |
| 738 | ret = -ENOMEM; | 738 | ret = -ENOMEM; |
| @@ -762,8 +762,9 @@ static int of_fsl_spi_get_chipselects(struct device *dev) | |||
| 762 | ret = gpio_direction_output(pinfo->gpios[i], | 762 | ret = gpio_direction_output(pinfo->gpios[i], |
| 763 | pinfo->alow_flags[i]); | 763 | pinfo->alow_flags[i]); |
| 764 | if (ret) { | 764 | if (ret) { |
| 765 | dev_err(dev, "can't set output direction for gpio " | 765 | dev_err(dev, |
| 766 | "#%d: %d\n", i, ret); | 766 | "can't set output direction for gpio #%d: %d\n", |
| 767 | i, ret); | ||
| 767 | goto err_loop; | 768 | goto err_loop; |
| 768 | } | 769 | } |
| 769 | } | 770 | } |
diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c index 899d7a8f0889..278867a31950 100644 --- a/drivers/spi/spi-mt65xx.c +++ b/drivers/spi/spi-mt65xx.c | |||
| @@ -73,7 +73,7 @@ | |||
| 73 | #define MTK_SPI_IDLE 0 | 73 | #define MTK_SPI_IDLE 0 |
| 74 | #define MTK_SPI_PAUSED 1 | 74 | #define MTK_SPI_PAUSED 1 |
| 75 | 75 | ||
| 76 | #define MTK_SPI_MAX_FIFO_SIZE 32 | 76 | #define MTK_SPI_MAX_FIFO_SIZE 32U |
| 77 | #define MTK_SPI_PACKET_SIZE 1024 | 77 | #define MTK_SPI_PACKET_SIZE 1024 |
| 78 | 78 | ||
| 79 | struct mtk_spi_compatible { | 79 | struct mtk_spi_compatible { |
| @@ -333,7 +333,7 @@ static int mtk_spi_fifo_transfer(struct spi_master *master, | |||
| 333 | struct mtk_spi *mdata = spi_master_get_devdata(master); | 333 | struct mtk_spi *mdata = spi_master_get_devdata(master); |
| 334 | 334 | ||
| 335 | mdata->cur_transfer = xfer; | 335 | mdata->cur_transfer = xfer; |
| 336 | mdata->xfer_len = xfer->len; | 336 | mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, xfer->len); |
| 337 | mtk_spi_prepare_transfer(master, xfer); | 337 | mtk_spi_prepare_transfer(master, xfer); |
| 338 | mtk_spi_setup_packet(master); | 338 | mtk_spi_setup_packet(master); |
| 339 | 339 | ||
| @@ -410,7 +410,10 @@ static bool mtk_spi_can_dma(struct spi_master *master, | |||
| 410 | struct spi_device *spi, | 410 | struct spi_device *spi, |
| 411 | struct spi_transfer *xfer) | 411 | struct spi_transfer *xfer) |
| 412 | { | 412 | { |
| 413 | return xfer->len > MTK_SPI_MAX_FIFO_SIZE; | 413 | /* Buffers for DMA transactions must be 4-byte aligned */ |
| 414 | return (xfer->len > MTK_SPI_MAX_FIFO_SIZE && | ||
| 415 | (unsigned long)xfer->tx_buf % 4 == 0 && | ||
| 416 | (unsigned long)xfer->rx_buf % 4 == 0); | ||
| 414 | } | 417 | } |
| 415 | 418 | ||
| 416 | static int mtk_spi_setup(struct spi_device *spi) | 419 | static int mtk_spi_setup(struct spi_device *spi) |
| @@ -451,7 +454,33 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id) | |||
| 451 | ®_val, remainder); | 454 | ®_val, remainder); |
| 452 | } | 455 | } |
| 453 | } | 456 | } |
| 454 | spi_finalize_current_transfer(master); | 457 | |
| 458 | trans->len -= mdata->xfer_len; | ||
| 459 | if (!trans->len) { | ||
| 460 | spi_finalize_current_transfer(master); | ||
| 461 | return IRQ_HANDLED; | ||
| 462 | } | ||
| 463 | |||
| 464 | if (trans->tx_buf) | ||
| 465 | trans->tx_buf += mdata->xfer_len; | ||
| 466 | if (trans->rx_buf) | ||
| 467 | trans->rx_buf += mdata->xfer_len; | ||
| 468 | |||
| 469 | mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, trans->len); | ||
| 470 | mtk_spi_setup_packet(master); | ||
| 471 | |||
| 472 | cnt = trans->len / 4; | ||
| 473 | iowrite32_rep(mdata->base + SPI_TX_DATA_REG, trans->tx_buf, cnt); | ||
| 474 | |||
| 475 | remainder = trans->len % 4; | ||
| 476 | if (remainder > 0) { | ||
| 477 | reg_val = 0; | ||
| 478 | memcpy(®_val, trans->tx_buf + (cnt * 4), remainder); | ||
| 479 | writel(reg_val, mdata->base + SPI_TX_DATA_REG); | ||
| 480 | } | ||
| 481 | |||
| 482 | mtk_spi_enable_transfer(master); | ||
| 483 | |||
| 455 | return IRQ_HANDLED; | 484 | return IRQ_HANDLED; |
| 456 | } | 485 | } |
| 457 | 486 | ||
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c index dd7b5b47291d..3f3751e2b521 100644 --- a/drivers/spi/spi-pxa2xx.c +++ b/drivers/spi/spi-pxa2xx.c | |||
| @@ -1458,6 +1458,10 @@ static const struct pci_device_id pxa2xx_spi_pci_compound_match[] = { | |||
| 1458 | { PCI_VDEVICE(INTEL, 0x1ac2), LPSS_BXT_SSP }, | 1458 | { PCI_VDEVICE(INTEL, 0x1ac2), LPSS_BXT_SSP }, |
| 1459 | { PCI_VDEVICE(INTEL, 0x1ac4), LPSS_BXT_SSP }, | 1459 | { PCI_VDEVICE(INTEL, 0x1ac4), LPSS_BXT_SSP }, |
| 1460 | { PCI_VDEVICE(INTEL, 0x1ac6), LPSS_BXT_SSP }, | 1460 | { PCI_VDEVICE(INTEL, 0x1ac6), LPSS_BXT_SSP }, |
| 1461 | /* GLK */ | ||
| 1462 | { PCI_VDEVICE(INTEL, 0x31c2), LPSS_BXT_SSP }, | ||
| 1463 | { PCI_VDEVICE(INTEL, 0x31c4), LPSS_BXT_SSP }, | ||
| 1464 | { PCI_VDEVICE(INTEL, 0x31c6), LPSS_BXT_SSP }, | ||
| 1461 | /* APL */ | 1465 | /* APL */ |
| 1462 | { PCI_VDEVICE(INTEL, 0x5ac2), LPSS_BXT_SSP }, | 1466 | { PCI_VDEVICE(INTEL, 0x5ac2), LPSS_BXT_SSP }, |
| 1463 | { PCI_VDEVICE(INTEL, 0x5ac4), LPSS_BXT_SSP }, | 1467 | { PCI_VDEVICE(INTEL, 0x5ac4), LPSS_BXT_SSP }, |
| @@ -1690,6 +1694,7 @@ static int pxa2xx_spi_probe(struct platform_device *pdev) | |||
| 1690 | pxa2xx_spi_write(drv_data, SSCR1, tmp); | 1694 | pxa2xx_spi_write(drv_data, SSCR1, tmp); |
| 1691 | tmp = SSCR0_SCR(2) | SSCR0_Motorola | SSCR0_DataSize(8); | 1695 | tmp = SSCR0_SCR(2) | SSCR0_Motorola | SSCR0_DataSize(8); |
| 1692 | pxa2xx_spi_write(drv_data, SSCR0, tmp); | 1696 | pxa2xx_spi_write(drv_data, SSCR0, tmp); |
| 1697 | break; | ||
| 1693 | default: | 1698 | default: |
| 1694 | tmp = SSCR1_RxTresh(RX_THRESH_DFLT) | | 1699 | tmp = SSCR1_RxTresh(RX_THRESH_DFLT) | |
| 1695 | SSCR1_TxTresh(TX_THRESH_DFLT); | 1700 | SSCR1_TxTresh(TX_THRESH_DFLT); |
diff --git a/drivers/spi/spi-rspi.c b/drivers/spi/spi-rspi.c index 9daf50031737..bc3c8686f4d9 100644 --- a/drivers/spi/spi-rspi.c +++ b/drivers/spi/spi-rspi.c | |||
| @@ -808,7 +808,7 @@ static int qspi_transfer_out(struct rspi_data *rspi, struct spi_transfer *xfer) | |||
| 808 | for (i = 0; i < len; i++) | 808 | for (i = 0; i < len; i++) |
| 809 | rspi_write_data(rspi, *tx++); | 809 | rspi_write_data(rspi, *tx++); |
| 810 | } else { | 810 | } else { |
| 811 | ret = rspi_pio_transfer(rspi, tx, NULL, n); | 811 | ret = rspi_pio_transfer(rspi, tx, NULL, len); |
| 812 | if (ret < 0) | 812 | if (ret < 0) |
| 813 | return ret; | 813 | return ret; |
| 814 | } | 814 | } |
| @@ -845,10 +845,9 @@ static int qspi_transfer_in(struct rspi_data *rspi, struct spi_transfer *xfer) | |||
| 845 | for (i = 0; i < len; i++) | 845 | for (i = 0; i < len; i++) |
| 846 | *rx++ = rspi_read_data(rspi); | 846 | *rx++ = rspi_read_data(rspi); |
| 847 | } else { | 847 | } else { |
| 848 | ret = rspi_pio_transfer(rspi, NULL, rx, n); | 848 | ret = rspi_pio_transfer(rspi, NULL, rx, len); |
| 849 | if (ret < 0) | 849 | if (ret < 0) |
| 850 | return ret; | 850 | return ret; |
| 851 | *rx++ = ret; | ||
| 852 | } | 851 | } |
| 853 | n -= len; | 852 | n -= len; |
| 854 | } | 853 | } |
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c index 3c09e94cf827..186342b74141 100644 --- a/drivers/spi/spi-s3c64xx.c +++ b/drivers/spi/spi-s3c64xx.c | |||
| @@ -1003,7 +1003,7 @@ static struct s3c64xx_spi_info *s3c64xx_spi_parse_dt(struct device *dev) | |||
| 1003 | sci->num_cs = temp; | 1003 | sci->num_cs = temp; |
| 1004 | } | 1004 | } |
| 1005 | 1005 | ||
| 1006 | sci->no_cs = of_property_read_bool(dev->of_node, "broken-cs"); | 1006 | sci->no_cs = of_property_read_bool(dev->of_node, "no-cs-readback"); |
| 1007 | 1007 | ||
| 1008 | return sci; | 1008 | return sci; |
| 1009 | } | 1009 | } |
diff --git a/drivers/spi/spi-sh-msiof.c b/drivers/spi/spi-sh-msiof.c index 0012ad02e569..1f00eeb0b5a3 100644 --- a/drivers/spi/spi-sh-msiof.c +++ b/drivers/spi/spi-sh-msiof.c | |||
| @@ -973,14 +973,16 @@ static const struct sh_msiof_chipdata r8a779x_data = { | |||
| 973 | }; | 973 | }; |
| 974 | 974 | ||
| 975 | static const struct of_device_id sh_msiof_match[] = { | 975 | static const struct of_device_id sh_msiof_match[] = { |
| 976 | { .compatible = "renesas,sh-msiof", .data = &sh_data }, | ||
| 977 | { .compatible = "renesas,sh-mobile-msiof", .data = &sh_data }, | 976 | { .compatible = "renesas,sh-mobile-msiof", .data = &sh_data }, |
| 978 | { .compatible = "renesas,msiof-r8a7790", .data = &r8a779x_data }, | 977 | { .compatible = "renesas,msiof-r8a7790", .data = &r8a779x_data }, |
| 979 | { .compatible = "renesas,msiof-r8a7791", .data = &r8a779x_data }, | 978 | { .compatible = "renesas,msiof-r8a7791", .data = &r8a779x_data }, |
| 980 | { .compatible = "renesas,msiof-r8a7792", .data = &r8a779x_data }, | 979 | { .compatible = "renesas,msiof-r8a7792", .data = &r8a779x_data }, |
| 981 | { .compatible = "renesas,msiof-r8a7793", .data = &r8a779x_data }, | 980 | { .compatible = "renesas,msiof-r8a7793", .data = &r8a779x_data }, |
| 982 | { .compatible = "renesas,msiof-r8a7794", .data = &r8a779x_data }, | 981 | { .compatible = "renesas,msiof-r8a7794", .data = &r8a779x_data }, |
| 982 | { .compatible = "renesas,rcar-gen2-msiof", .data = &r8a779x_data }, | ||
| 983 | { .compatible = "renesas,msiof-r8a7796", .data = &r8a779x_data }, | 983 | { .compatible = "renesas,msiof-r8a7796", .data = &r8a779x_data }, |
| 984 | { .compatible = "renesas,rcar-gen3-msiof", .data = &r8a779x_data }, | ||
| 985 | { .compatible = "renesas,sh-msiof", .data = &sh_data }, /* Deprecated */ | ||
| 984 | {}, | 986 | {}, |
| 985 | }; | 987 | }; |
| 986 | MODULE_DEVICE_TABLE(of, sh_msiof_match); | 988 | MODULE_DEVICE_TABLE(of, sh_msiof_match); |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 656dd3e3220c..e70955339d33 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
| @@ -621,8 +621,10 @@ void spi_unregister_device(struct spi_device *spi) | |||
| 621 | if (!spi) | 621 | if (!spi) |
| 622 | return; | 622 | return; |
| 623 | 623 | ||
| 624 | if (spi->dev.of_node) | 624 | if (spi->dev.of_node) { |
| 625 | of_node_clear_flag(spi->dev.of_node, OF_POPULATED); | 625 | of_node_clear_flag(spi->dev.of_node, OF_POPULATED); |
| 626 | of_node_put(spi->dev.of_node); | ||
| 627 | } | ||
| 626 | if (ACPI_COMPANION(&spi->dev)) | 628 | if (ACPI_COMPANION(&spi->dev)) |
| 627 | acpi_device_clear_enumerated(ACPI_COMPANION(&spi->dev)); | 629 | acpi_device_clear_enumerated(ACPI_COMPANION(&spi->dev)); |
| 628 | device_unregister(&spi->dev); | 630 | device_unregister(&spi->dev); |
| @@ -672,7 +674,7 @@ int spi_register_board_info(struct spi_board_info const *info, unsigned n) | |||
| 672 | if (!n) | 674 | if (!n) |
| 673 | return -EINVAL; | 675 | return -EINVAL; |
| 674 | 676 | ||
| 675 | bi = kzalloc(n * sizeof(*bi), GFP_KERNEL); | 677 | bi = kcalloc(n, sizeof(*bi), GFP_KERNEL); |
| 676 | if (!bi) | 678 | if (!bi) |
| 677 | return -ENOMEM; | 679 | return -ENOMEM; |
| 678 | 680 | ||
| @@ -805,12 +807,12 @@ static int __spi_map_msg(struct spi_master *master, struct spi_message *msg) | |||
| 805 | if (master->dma_tx) | 807 | if (master->dma_tx) |
| 806 | tx_dev = master->dma_tx->device->dev; | 808 | tx_dev = master->dma_tx->device->dev; |
| 807 | else | 809 | else |
| 808 | tx_dev = &master->dev; | 810 | tx_dev = master->dev.parent; |
| 809 | 811 | ||
| 810 | if (master->dma_rx) | 812 | if (master->dma_rx) |
| 811 | rx_dev = master->dma_rx->device->dev; | 813 | rx_dev = master->dma_rx->device->dev; |
| 812 | else | 814 | else |
| 813 | rx_dev = &master->dev; | 815 | rx_dev = master->dev.parent; |
| 814 | 816 | ||
| 815 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | 817 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
| 816 | if (!master->can_dma(master, msg->spi, xfer)) | 818 | if (!master->can_dma(master, msg->spi, xfer)) |
| @@ -852,12 +854,12 @@ static int __spi_unmap_msg(struct spi_master *master, struct spi_message *msg) | |||
| 852 | if (master->dma_tx) | 854 | if (master->dma_tx) |
| 853 | tx_dev = master->dma_tx->device->dev; | 855 | tx_dev = master->dma_tx->device->dev; |
| 854 | else | 856 | else |
| 855 | tx_dev = &master->dev; | 857 | tx_dev = master->dev.parent; |
| 856 | 858 | ||
| 857 | if (master->dma_rx) | 859 | if (master->dma_rx) |
| 858 | rx_dev = master->dma_rx->device->dev; | 860 | rx_dev = master->dma_rx->device->dev; |
| 859 | else | 861 | else |
| 860 | rx_dev = &master->dev; | 862 | rx_dev = master->dev.parent; |
| 861 | 863 | ||
| 862 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { | 864 | list_for_each_entry(xfer, &msg->transfers, transfer_list) { |
| 863 | if (!master->can_dma(master, msg->spi, xfer)) | 865 | if (!master->can_dma(master, msg->spi, xfer)) |
| @@ -1603,11 +1605,13 @@ of_register_spi_device(struct spi_master *master, struct device_node *nc) | |||
| 1603 | if (rc) { | 1605 | if (rc) { |
| 1604 | dev_err(&master->dev, "spi_device register error %s\n", | 1606 | dev_err(&master->dev, "spi_device register error %s\n", |
| 1605 | nc->full_name); | 1607 | nc->full_name); |
| 1606 | goto err_out; | 1608 | goto err_of_node_put; |
| 1607 | } | 1609 | } |
| 1608 | 1610 | ||
| 1609 | return spi; | 1611 | return spi; |
| 1610 | 1612 | ||
| 1613 | err_of_node_put: | ||
| 1614 | of_node_put(nc); | ||
| 1611 | err_out: | 1615 | err_out: |
| 1612 | spi_dev_put(spi); | 1616 | spi_dev_put(spi); |
| 1613 | return ERR_PTR(rc); | 1617 | return ERR_PTR(rc); |
