Loading Documentation/devicetree/bindings/spi/sh-msiof.txt +4 −2 Original line number Diff line number Diff line Renesas MSIOF spi controller Required properties: - compatible : "renesas,msiof-r8a7790" (R-Car H2) - compatible : "renesas,msiof-r8a7743" (RZ/G1M) "renesas,msiof-r8a7745" (RZ/G1E) "renesas,msiof-r8a7790" (R-Car H2) "renesas,msiof-r8a7791" (R-Car M2-W) "renesas,msiof-r8a7792" (R-Car V2H) "renesas,msiof-r8a7793" (R-Car M2-N) Loading @@ -10,7 +12,7 @@ Required properties: "renesas,msiof-r8a7796" (R-Car M3-W) "renesas,msiof-sh73a0" (SH-Mobile AG5) "renesas,sh-mobile-msiof" (generic SH-Mobile compatibile device) "renesas,rcar-gen2-msiof" (generic R-Car Gen2 compatible device) "renesas,rcar-gen2-msiof" (generic R-Car Gen2 and RZ/G1 compatible device) "renesas,rcar-gen3-msiof" (generic R-Car Gen3 compatible device) "renesas,sh-msiof" (deprecated) Loading Documentation/devicetree/bindings/spi/spi-sprd-adi.txt 0 → 100644 +58 −0 Original line number Diff line number Diff line Spreadtrum ADI controller ADI is the abbreviation of Anolog-Digital interface, which is used to access analog chip (such as PMIC) from digital chip. ADI controller follows the SPI framework for its hardware implementation is alike to SPI bus and its timing is compatile to SPI timing. ADI controller has 50 channels including 2 software read/write channels and 48 hardware channels to access analog chip. For 2 software read/write channels, users should set ADI registers to access analog chip. For hardware channels, we can configure them to allow other hardware components to use it independently, which means we can just link one analog chip address to one hardware channel, then users can access the mapped analog chip address by this hardware channel triggered by hardware components instead of ADI software channels. Thus we introduce one property named "sprd,hw-channels" to configure hardware channels, the first value specifies the hardware channel id which is used to transfer data triggered by hardware automatically, and the second value specifies the analog chip address where user want to access by hardware components. Since we have multi-subsystems will use unique ADI to access analog chip, when one system is reading/writing data by ADI software channels, that should be under one hardware spinlock protection to prevent other systems from reading/writing data by ADI software channels at the same time, or two parallel routine of setting ADI registers will make ADI controller registers chaos to lead incorrect results. Then we need one hardware spinlock to synchronize between the multiple subsystems. Required properties: - compatible: Should be "sprd,sc9860-adi". - reg: Offset and length of ADI-SPI controller register space. - hwlocks: Reference to a phandle of a hwlock provider node. - hwlock-names: Reference to hwlock name strings defined in the same order as the hwlocks, should be "adi". - #address-cells: Number of cells required to define a chip select address on the ADI-SPI bus. Should be set to 1. - #size-cells: Size of cells required to define a chip select address size on the ADI-SPI bus. Should be set to 0. Optional properties: - sprd,hw-channels: This is an array of channel values up to 49 channels. The first value specifies the hardware channel id which is used to transfer data triggered by hardware automatically, and the second value specifies the analog chip address where user want to access by hardware components. SPI slave nodes must be children of the SPI controller node and can contain properties described in Documentation/devicetree/bindings/spi/spi-bus.txt. Example: adi_bus: spi@40030000 { compatible = "sprd,sc9860-adi"; reg = <0 0x40030000 0 0x10000>; hwlocks = <&hwlock1 0>; hwlock-names = "adi"; #address-cells = <1>; #size-cells = <0>; sprd,hw-channels = <30 0x8c20>; }; drivers/spi/Kconfig +7 −4 Original line number Diff line number Diff line # # SPI driver configuration # # NOTE: the reason this doesn't show SPI slave support is mostly that # nobody's needed a slave side API yet. The master-role API is not # fully appropriate there, so it'd need some thought to do well. # menuconfig SPI bool "SPI support" depends on HAS_IOMEM Loading Loading @@ -626,6 +622,13 @@ config SPI_SIRF help SPI driver for CSR SiRFprimaII SoCs config SPI_SPRD_ADI tristate "Spreadtrum ADI controller" depends on ARCH_SPRD || COMPILE_TEST depends on HWSPINLOCK || (COMPILE_TEST && !HWSPINLOCK) help ADI driver based on SPI for Spreadtrum SoCs. config SPI_STM32 tristate "STMicroelectronics STM32 SPI controller" depends on ARCH_STM32 || COMPILE_TEST Loading drivers/spi/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ obj-$(CONFIG_SPI_SH_HSPI) += spi-sh-hspi.o obj-$(CONFIG_SPI_SH_MSIOF) += spi-sh-msiof.o obj-$(CONFIG_SPI_SH_SCI) += spi-sh-sci.o obj-$(CONFIG_SPI_SIRF) += spi-sirf.o obj-$(CONFIG_SPI_SPRD_ADI) += spi-sprd-adi.o obj-$(CONFIG_SPI_STM32) += spi-stm32.o obj-$(CONFIG_SPI_ST_SSC4) += spi-st-ssc4.o obj-$(CONFIG_SPI_SUN4I) += spi-sun4i.o Loading drivers/spi/spi-sh-msiof.c +4 −6 Original line number Diff line number Diff line Loading @@ -1021,6 +1021,8 @@ static const struct sh_msiof_chipdata rcar_gen3_data = { static const struct of_device_id sh_msiof_match[] = { { .compatible = "renesas,sh-mobile-msiof", .data = &sh_data }, { .compatible = "renesas,msiof-r8a7743", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7745", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7790", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7791", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7792", .data = &rcar_gen2_data }, Loading Loading @@ -1188,12 +1190,10 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p) static void sh_msiof_release_dma(struct sh_msiof_spi_priv *p) { struct spi_master *master = p->master; struct device *dev; if (!master->dma_tx) return; dev = &p->pdev->dev; dma_unmap_single(master->dma_rx->device->dev, p->rx_dma_addr, PAGE_SIZE, DMA_FROM_DEVICE); dma_unmap_single(master->dma_tx->device->dev, p->tx_dma_addr, Loading @@ -1209,15 +1209,13 @@ static int sh_msiof_spi_probe(struct platform_device *pdev) struct resource *r; struct spi_master *master; const struct sh_msiof_chipdata *chipdata; const struct of_device_id *of_id; struct sh_msiof_spi_info *info; struct sh_msiof_spi_priv *p; int i; int ret; of_id = of_match_device(sh_msiof_match, &pdev->dev); if (of_id) { chipdata = of_id->data; chipdata = of_device_get_match_data(&pdev->dev); if (chipdata) { info = sh_msiof_spi_parse_dt(&pdev->dev); } else { chipdata = (const void *)pdev->id_entry->driver_data; Loading Loading
Documentation/devicetree/bindings/spi/sh-msiof.txt +4 −2 Original line number Diff line number Diff line Renesas MSIOF spi controller Required properties: - compatible : "renesas,msiof-r8a7790" (R-Car H2) - compatible : "renesas,msiof-r8a7743" (RZ/G1M) "renesas,msiof-r8a7745" (RZ/G1E) "renesas,msiof-r8a7790" (R-Car H2) "renesas,msiof-r8a7791" (R-Car M2-W) "renesas,msiof-r8a7792" (R-Car V2H) "renesas,msiof-r8a7793" (R-Car M2-N) Loading @@ -10,7 +12,7 @@ Required properties: "renesas,msiof-r8a7796" (R-Car M3-W) "renesas,msiof-sh73a0" (SH-Mobile AG5) "renesas,sh-mobile-msiof" (generic SH-Mobile compatibile device) "renesas,rcar-gen2-msiof" (generic R-Car Gen2 compatible device) "renesas,rcar-gen2-msiof" (generic R-Car Gen2 and RZ/G1 compatible device) "renesas,rcar-gen3-msiof" (generic R-Car Gen3 compatible device) "renesas,sh-msiof" (deprecated) Loading
Documentation/devicetree/bindings/spi/spi-sprd-adi.txt 0 → 100644 +58 −0 Original line number Diff line number Diff line Spreadtrum ADI controller ADI is the abbreviation of Anolog-Digital interface, which is used to access analog chip (such as PMIC) from digital chip. ADI controller follows the SPI framework for its hardware implementation is alike to SPI bus and its timing is compatile to SPI timing. ADI controller has 50 channels including 2 software read/write channels and 48 hardware channels to access analog chip. For 2 software read/write channels, users should set ADI registers to access analog chip. For hardware channels, we can configure them to allow other hardware components to use it independently, which means we can just link one analog chip address to one hardware channel, then users can access the mapped analog chip address by this hardware channel triggered by hardware components instead of ADI software channels. Thus we introduce one property named "sprd,hw-channels" to configure hardware channels, the first value specifies the hardware channel id which is used to transfer data triggered by hardware automatically, and the second value specifies the analog chip address where user want to access by hardware components. Since we have multi-subsystems will use unique ADI to access analog chip, when one system is reading/writing data by ADI software channels, that should be under one hardware spinlock protection to prevent other systems from reading/writing data by ADI software channels at the same time, or two parallel routine of setting ADI registers will make ADI controller registers chaos to lead incorrect results. Then we need one hardware spinlock to synchronize between the multiple subsystems. Required properties: - compatible: Should be "sprd,sc9860-adi". - reg: Offset and length of ADI-SPI controller register space. - hwlocks: Reference to a phandle of a hwlock provider node. - hwlock-names: Reference to hwlock name strings defined in the same order as the hwlocks, should be "adi". - #address-cells: Number of cells required to define a chip select address on the ADI-SPI bus. Should be set to 1. - #size-cells: Size of cells required to define a chip select address size on the ADI-SPI bus. Should be set to 0. Optional properties: - sprd,hw-channels: This is an array of channel values up to 49 channels. The first value specifies the hardware channel id which is used to transfer data triggered by hardware automatically, and the second value specifies the analog chip address where user want to access by hardware components. SPI slave nodes must be children of the SPI controller node and can contain properties described in Documentation/devicetree/bindings/spi/spi-bus.txt. Example: adi_bus: spi@40030000 { compatible = "sprd,sc9860-adi"; reg = <0 0x40030000 0 0x10000>; hwlocks = <&hwlock1 0>; hwlock-names = "adi"; #address-cells = <1>; #size-cells = <0>; sprd,hw-channels = <30 0x8c20>; };
drivers/spi/Kconfig +7 −4 Original line number Diff line number Diff line # # SPI driver configuration # # NOTE: the reason this doesn't show SPI slave support is mostly that # nobody's needed a slave side API yet. The master-role API is not # fully appropriate there, so it'd need some thought to do well. # menuconfig SPI bool "SPI support" depends on HAS_IOMEM Loading Loading @@ -626,6 +622,13 @@ config SPI_SIRF help SPI driver for CSR SiRFprimaII SoCs config SPI_SPRD_ADI tristate "Spreadtrum ADI controller" depends on ARCH_SPRD || COMPILE_TEST depends on HWSPINLOCK || (COMPILE_TEST && !HWSPINLOCK) help ADI driver based on SPI for Spreadtrum SoCs. config SPI_STM32 tristate "STMicroelectronics STM32 SPI controller" depends on ARCH_STM32 || COMPILE_TEST Loading
drivers/spi/Makefile +1 −0 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ obj-$(CONFIG_SPI_SH_HSPI) += spi-sh-hspi.o obj-$(CONFIG_SPI_SH_MSIOF) += spi-sh-msiof.o obj-$(CONFIG_SPI_SH_SCI) += spi-sh-sci.o obj-$(CONFIG_SPI_SIRF) += spi-sirf.o obj-$(CONFIG_SPI_SPRD_ADI) += spi-sprd-adi.o obj-$(CONFIG_SPI_STM32) += spi-stm32.o obj-$(CONFIG_SPI_ST_SSC4) += spi-st-ssc4.o obj-$(CONFIG_SPI_SUN4I) += spi-sun4i.o Loading
drivers/spi/spi-sh-msiof.c +4 −6 Original line number Diff line number Diff line Loading @@ -1021,6 +1021,8 @@ static const struct sh_msiof_chipdata rcar_gen3_data = { static const struct of_device_id sh_msiof_match[] = { { .compatible = "renesas,sh-mobile-msiof", .data = &sh_data }, { .compatible = "renesas,msiof-r8a7743", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7745", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7790", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7791", .data = &rcar_gen2_data }, { .compatible = "renesas,msiof-r8a7792", .data = &rcar_gen2_data }, Loading Loading @@ -1188,12 +1190,10 @@ static int sh_msiof_request_dma(struct sh_msiof_spi_priv *p) static void sh_msiof_release_dma(struct sh_msiof_spi_priv *p) { struct spi_master *master = p->master; struct device *dev; if (!master->dma_tx) return; dev = &p->pdev->dev; dma_unmap_single(master->dma_rx->device->dev, p->rx_dma_addr, PAGE_SIZE, DMA_FROM_DEVICE); dma_unmap_single(master->dma_tx->device->dev, p->tx_dma_addr, Loading @@ -1209,15 +1209,13 @@ static int sh_msiof_spi_probe(struct platform_device *pdev) struct resource *r; struct spi_master *master; const struct sh_msiof_chipdata *chipdata; const struct of_device_id *of_id; struct sh_msiof_spi_info *info; struct sh_msiof_spi_priv *p; int i; int ret; of_id = of_match_device(sh_msiof_match, &pdev->dev); if (of_id) { chipdata = of_id->data; chipdata = of_device_get_match_data(&pdev->dev); if (chipdata) { info = sh_msiof_spi_parse_dt(&pdev->dev); } else { chipdata = (const void *)pdev->id_entry->driver_data; Loading