Loading Documentation/devicetree/bindings/spi/spi-rspi.txt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ Required properties: Optional properties: - clocks : Must contain a reference to the functional clock. - dmas : Must contain a list of two references to DMA specifiers, one for transmission, and one for reception. - dma-names : Must contain a list of two DMA names, "tx" and "rx". Pinctrl properties might be needed, too. See Documentation/devicetree/bindings/pinctrl/renesas,*. Loading Loading @@ -58,4 +61,6 @@ Examples: num-cs = <1>; #address-cells = <1>; #size-cells = <0>; dmas = <&dmac0 0x17>, <&dmac0 0x18>; dma-names = "tx", "rx"; }; drivers/spi/spi-rspi.c +23 −14 Original line number Diff line number Diff line Loading @@ -909,10 +909,11 @@ static struct dma_chan *rspi_request_dma_chan(struct device *dev, dma_cap_zero(mask); dma_cap_set(DMA_SLAVE, mask); chan = dma_request_channel(mask, shdma_chan_filter, (void *)(unsigned long)id); chan = dma_request_slave_channel_compat(mask, shdma_chan_filter, (void *)(unsigned long)id, dev, dir == DMA_MEM_TO_DEV ? "tx" : "rx"); if (!chan) { dev_warn(dev, "dma_request_channel failed\n"); dev_warn(dev, "dma_request_slave_channel_compat failed\n"); return NULL; } Loading Loading @@ -941,22 +942,30 @@ static int rspi_request_dma(struct device *dev, struct spi_master *master, const struct resource *res) { const struct rspi_plat_data *rspi_pd = dev_get_platdata(dev); unsigned int dma_tx_id, dma_rx_id; if (dev->of_node) { /* In the OF case we will get the slave IDs from the DT */ dma_tx_id = 0; dma_rx_id = 0; } else if (rspi_pd && rspi_pd->dma_tx_id && rspi_pd->dma_rx_id) { dma_tx_id = rspi_pd->dma_tx_id; dma_rx_id = rspi_pd->dma_rx_id; } else { /* The driver assumes no error. */ return 0; } if (!rspi_pd || !rspi_pd->dma_rx_id || !rspi_pd->dma_tx_id) return 0; /* The driver assumes no error. */ master->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, rspi_pd->dma_rx_id, master->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, dma_tx_id, res->start + RSPI_SPDR); if (!master->dma_rx) if (!master->dma_tx) return -ENODEV; master->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, rspi_pd->dma_tx_id, master->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, dma_rx_id, res->start + RSPI_SPDR); if (!master->dma_tx) { dma_release_channel(master->dma_rx); master->dma_rx = NULL; if (!master->dma_rx) { dma_release_channel(master->dma_tx); master->dma_tx = NULL; return -ENODEV; } Loading Loading
Documentation/devicetree/bindings/spi/spi-rspi.txt +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,9 @@ Required properties: Optional properties: - clocks : Must contain a reference to the functional clock. - dmas : Must contain a list of two references to DMA specifiers, one for transmission, and one for reception. - dma-names : Must contain a list of two DMA names, "tx" and "rx". Pinctrl properties might be needed, too. See Documentation/devicetree/bindings/pinctrl/renesas,*. Loading Loading @@ -58,4 +61,6 @@ Examples: num-cs = <1>; #address-cells = <1>; #size-cells = <0>; dmas = <&dmac0 0x17>, <&dmac0 0x18>; dma-names = "tx", "rx"; };
drivers/spi/spi-rspi.c +23 −14 Original line number Diff line number Diff line Loading @@ -909,10 +909,11 @@ static struct dma_chan *rspi_request_dma_chan(struct device *dev, dma_cap_zero(mask); dma_cap_set(DMA_SLAVE, mask); chan = dma_request_channel(mask, shdma_chan_filter, (void *)(unsigned long)id); chan = dma_request_slave_channel_compat(mask, shdma_chan_filter, (void *)(unsigned long)id, dev, dir == DMA_MEM_TO_DEV ? "tx" : "rx"); if (!chan) { dev_warn(dev, "dma_request_channel failed\n"); dev_warn(dev, "dma_request_slave_channel_compat failed\n"); return NULL; } Loading Loading @@ -941,22 +942,30 @@ static int rspi_request_dma(struct device *dev, struct spi_master *master, const struct resource *res) { const struct rspi_plat_data *rspi_pd = dev_get_platdata(dev); unsigned int dma_tx_id, dma_rx_id; if (dev->of_node) { /* In the OF case we will get the slave IDs from the DT */ dma_tx_id = 0; dma_rx_id = 0; } else if (rspi_pd && rspi_pd->dma_tx_id && rspi_pd->dma_rx_id) { dma_tx_id = rspi_pd->dma_tx_id; dma_rx_id = rspi_pd->dma_rx_id; } else { /* The driver assumes no error. */ return 0; } if (!rspi_pd || !rspi_pd->dma_rx_id || !rspi_pd->dma_tx_id) return 0; /* The driver assumes no error. */ master->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, rspi_pd->dma_rx_id, master->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, dma_tx_id, res->start + RSPI_SPDR); if (!master->dma_rx) if (!master->dma_tx) return -ENODEV; master->dma_tx = rspi_request_dma_chan(dev, DMA_MEM_TO_DEV, rspi_pd->dma_tx_id, master->dma_rx = rspi_request_dma_chan(dev, DMA_DEV_TO_MEM, dma_rx_id, res->start + RSPI_SPDR); if (!master->dma_tx) { dma_release_channel(master->dma_rx); master->dma_rx = NULL; if (!master->dma_rx) { dma_release_channel(master->dma_tx); master->dma_tx = NULL; return -ENODEV; } Loading