mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
dmaengine updates for v6.13
New support: - Qualcomm SAR2130P GPI dma support - Sifive PIC64GX pdma support - Rcar r7s72100 support and associated updates Updates: - STM32 DMA3 updates for packing/unpacking mode and prevention of additional xfers - Simplification of devm_acpi_dma_controller_register() and associate cleanup including headers - loongson prefix renames - Switch back to platform_driver::remove() subsystem update -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEE+vs47OPLdNbVcHzyfBQHDyUjg0cFAmdG1GoACgkQfBQHDyUj g0ecmQ//Tbq/OTj0at9Eu6DthII9GKfbE8Xw9rUheJIxYQ7dlsKmwtHpShQYGQVn l/qDphOZFaGcQd1DK1CiNtzfm4dXYae0CRAbs+5ggboN9PUG+8dYW7YZZ4Zb9neZ Ol5Gxs6tVzApPwGRL6Qo6K+CfbxhvjnveGiRnHaZnp1aaGdwz+s79cE4MPZP/2fs VedqnuG8F+ZdbgYwcC5PyBde5qAADQa1kmhRzbhQwWn9kVf6FUGCe6ZNH/aFAsoc PL8lrqkt76CMDFPyU3U/YoYYl2fzi00MPjUuajbzxM/2fHe6yNTNltVBELVj4Sy9 h3pXhSOEpzpnT4ojHxIRgDDXpTSFeak8Wz7vkkCuJHXoFoeGkNQGgbBUO8qqrgqq EYBAcO1eH88wuMMV2MGt+Y2k/h7hCNaKcRApx5iwMUSa77PZMATORcA6F8msYIWB pvkaTSzSYhzXEwv+9Wt1ln8CgzkvTCh+rqlgmswerDMvcIlKJga3PPMwci12uMfy BrK+jNIWE9jxfZF2IThxlSYk5YnixjFWvuPz8aELpp7dbpFWPXrFwMLhf/oVCioY V0rfRG3EzkyCP8XfTgO400QvH+AX5IFn+iWEZ5kXa6A5KhR9RIB+qGHPhGpIxmRQ Fy1zaJPFN7mmpPzNxH2hcN9buqqCrpr8RjnUM4UAuArOiHZ7oug= =LVro -----END PGP SIGNATURE----- Merge tag 'dmaengine-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine Pull dmaengine updates from Vinod Koul: "New hardware support: - Qualcomm SAR2130P GPI dma support - Sifive PIC64GX pdma support - Rcar r7s72100 support and associated updates Updates: - STM32 DMA3 updates for packing/unpacking mode and prevention of additional xfers - Simplification of devm_acpi_dma_controller_register() and associate cleanup including headers - loongson prefix renames - Switch back to platform_driver::remove() subsystem update" * tag 'dmaengine-6.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine: dmaengine: loongson2-apb: Rename the prefix ls2x to loongson2 dt-bindings: dma: sifive pdma: Add PIC64GX to compatibles dmaengine: fix typo in the comment dmaengine: stm32-dma3: clamp AXI burst using match data dmaengine: stm32-dma3: prevent LL refactoring thanks to DT configuration dt-bindings: dma: stm32-dma3: prevent additional transfers dmaengine: stm32-dma3: refactor HW linked-list to optimize memory accesses dmaengine: stm32-dma3: prevent pack/unpack thanks to DT configuration dt-bindings: dma: stm32-dma3: prevent packing/unpacking mode dmaengine: idxd: Move DSA/IAA device IDs to IDXD driver dt-bindings: dma: qcom,gpi: Add SAR2130P compatible dmaengine: Switch back to struct platform_driver::remove() dmaengine: ep93xx: Fix unsigned compared against 0 dmaengine: acpi: Clean up headers dmaengine: acpi: Simplify devm_acpi_dma_controller_register() dmaengine: acpi: Drop unused devm_acpi_dma_controller_free() dmaengine: sh: rz-dmac: add r7s72100 support dt-bindings: dma: rz-dmac: Document RZ/A1H SoC
This commit is contained in:
commit
7536c1a50e
@ -26,6 +26,7 @@ properties:
|
||||
- enum:
|
||||
- qcom,qcm2290-gpi-dma
|
||||
- qcom,qdu1000-gpi-dma
|
||||
- qcom,sar2130p-gpi-dma
|
||||
- qcom,sc7280-gpi-dma
|
||||
- qcom,sdx75-gpi-dma
|
||||
- qcom,sm6115-gpi-dma
|
||||
|
@ -4,18 +4,16 @@
|
||||
$id: http://devicetree.org/schemas/dma/renesas,rz-dmac.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas RZ/{G2L,G2UL,V2L} DMA Controller
|
||||
title: Renesas RZ DMA Controller
|
||||
|
||||
maintainers:
|
||||
- Biju Das <biju.das.jz@bp.renesas.com>
|
||||
|
||||
allOf:
|
||||
- $ref: dma-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- renesas,r7s72100-dmac # RZ/A1H
|
||||
- renesas,r9a07g043-dmac # RZ/G2UL and RZ/Five
|
||||
- renesas,r9a07g044-dmac # RZ/G2{L,LC}
|
||||
- renesas,r9a07g054-dmac # RZ/V2L
|
||||
@ -93,13 +91,26 @@ required:
|
||||
- reg
|
||||
- interrupts
|
||||
- interrupt-names
|
||||
- clocks
|
||||
- clock-names
|
||||
- '#dma-cells'
|
||||
- dma-channels
|
||||
- power-domains
|
||||
- resets
|
||||
- reset-names
|
||||
|
||||
allOf:
|
||||
- $ref: dma-controller.yaml#
|
||||
|
||||
- if:
|
||||
not:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,r7s72100-dmac
|
||||
then:
|
||||
required:
|
||||
- clocks
|
||||
- clock-names
|
||||
- power-domains
|
||||
- resets
|
||||
- reset-names
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
|
@ -27,11 +27,16 @@ allOf:
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- microchip,mpfs-pdma
|
||||
- sifive,fu540-c000-pdma
|
||||
- const: sifive,pdma0
|
||||
oneOf:
|
||||
- items:
|
||||
- const: microchip,pic64gx-pdma
|
||||
- const: microchip,mpfs-pdma
|
||||
- const: sifive,pdma0
|
||||
- items:
|
||||
- enum:
|
||||
- microchip,mpfs-pdma
|
||||
- sifive,fu540-c000-pdma
|
||||
- const: sifive,pdma0
|
||||
description:
|
||||
Should be "sifive,<chip>-pdma" and "sifive,pdma<version>".
|
||||
Supported compatible strings are -
|
||||
|
@ -96,6 +96,12 @@ properties:
|
||||
including the update of the LLI if any
|
||||
0x3: at channel level, the transfer complete event is generated at the
|
||||
end of the last LLI
|
||||
-bit 16: Prevent packing/unpacking mode
|
||||
0x0: pack/unpack enabled when source data width/burst != destination data width/burst
|
||||
0x1: memory data width/burst forced to peripheral data width/burst to prevent pack/unpack
|
||||
-bit 17: Prevent additional transfers due to linked-list refactoring
|
||||
0x0: don't prevent additional transfers for optimal performance
|
||||
0x1: prevent additional transfer to accommodate user constraints such as single transfer
|
||||
|
||||
required:
|
||||
- compatible
|
||||
|
@ -458,7 +458,6 @@ SERDEV
|
||||
|
||||
SLAVE DMA ENGINE
|
||||
devm_acpi_dma_controller_register()
|
||||
devm_acpi_dma_controller_free()
|
||||
|
||||
SPI
|
||||
devm_spi_alloc_host()
|
||||
|
@ -13408,12 +13408,12 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml
|
||||
F: drivers/gpio/gpio-loongson-64bit.c
|
||||
|
||||
LOONGSON LS2X APB DMA DRIVER
|
||||
LOONGSON-2 APB DMA DRIVER
|
||||
M: Binbin Zhou <zhoubinbin@loongson.cn>
|
||||
L: dmaengine@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/dma/loongson,ls2x-apbdma.yaml
|
||||
F: drivers/dma/ls2x-apb-dma.c
|
||||
F: drivers/dma/loongson2-apb-dma.c
|
||||
|
||||
LOONGSON LS2X I2C DRIVER
|
||||
M: Binbin Zhou <zhoubinbin@loongson.cn>
|
||||
|
@ -845,7 +845,7 @@ CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_EFI=y
|
||||
CONFIG_RTC_DRV_LOONGSON=y
|
||||
CONFIG_DMADEVICES=y
|
||||
CONFIG_LS2X_APB_DMA=y
|
||||
CONFIG_LOONGSON2_APB_DMA=y
|
||||
CONFIG_UDMABUF=y
|
||||
CONFIG_DMABUF_HEAPS=y
|
||||
CONFIG_DMABUF_HEAPS_SYSTEM=y
|
||||
|
@ -378,6 +378,20 @@ config LOONGSON1_APB_DMA
|
||||
This selects support for the APB DMA controller in Loongson1 SoCs,
|
||||
which is required by Loongson1 NAND and audio support.
|
||||
|
||||
config LOONGSON2_APB_DMA
|
||||
tristate "Loongson2 APB DMA support"
|
||||
depends on LOONGARCH || COMPILE_TEST
|
||||
select DMA_ENGINE
|
||||
select DMA_VIRTUAL_CHANNELS
|
||||
help
|
||||
Support for the Loongson2 APB DMA controller driver. The
|
||||
DMA controller is having single DMA channel which can be
|
||||
configured for different peripherals like audio, nand, sdio
|
||||
etc which is in APB bus.
|
||||
|
||||
This DMA controller transfers data from memory to peripheral fifo.
|
||||
It does not support memory to memory data transfer.
|
||||
|
||||
config LPC18XX_DMAMUX
|
||||
bool "NXP LPC18xx/43xx DMA MUX for PL080"
|
||||
depends on ARCH_LPC18XX || COMPILE_TEST
|
||||
@ -396,20 +410,6 @@ config LPC32XX_DMAMUX
|
||||
Support for PL080 multiplexed DMA request lines on
|
||||
LPC32XX platrofm.
|
||||
|
||||
config LS2X_APB_DMA
|
||||
tristate "Loongson LS2X APB DMA support"
|
||||
depends on LOONGARCH || COMPILE_TEST
|
||||
select DMA_ENGINE
|
||||
select DMA_VIRTUAL_CHANNELS
|
||||
help
|
||||
Support for the Loongson LS2X APB DMA controller driver. The
|
||||
DMA controller is having single DMA channel which can be
|
||||
configured for different peripherals like audio, nand, sdio
|
||||
etc which is in APB bus.
|
||||
|
||||
This DMA controller transfers data from memory to peripheral fifo.
|
||||
It does not support memory to memory data transfer.
|
||||
|
||||
config MCF_EDMA
|
||||
tristate "Freescale eDMA engine support, ColdFire mcf5441x SoCs"
|
||||
depends on M5441x || (COMPILE_TEST && FSL_EDMA=n)
|
||||
|
@ -50,9 +50,9 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioat/
|
||||
obj-y += idxd/
|
||||
obj-$(CONFIG_K3_DMA) += k3dma.o
|
||||
obj-$(CONFIG_LOONGSON1_APB_DMA) += loongson1-apb-dma.o
|
||||
obj-$(CONFIG_LOONGSON2_APB_DMA) += loongson2-apb-dma.o
|
||||
obj-$(CONFIG_LPC18XX_DMAMUX) += lpc18xx-dmamux.o
|
||||
obj-$(CONFIG_LPC32XX_DMAMUX) += lpc32xx-dmamux.o
|
||||
obj-$(CONFIG_LS2X_APB_DMA) += ls2x-apb-dma.o
|
||||
obj-$(CONFIG_MILBEAUT_HDMAC) += milbeaut-hdmac.o
|
||||
obj-$(CONFIG_MILBEAUT_XDMAC) += milbeaut-xdmac.o
|
||||
obj-$(CONFIG_MMP_PDMA) += mmp_pdma.o
|
||||
|
@ -9,18 +9,21 @@
|
||||
* Mika Westerberg <mika.westerberg@linux.intel.com>
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/acpi_dma.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/acpi_dma.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
static LIST_HEAD(acpi_dma_list);
|
||||
static DEFINE_MUTEX(acpi_dma_lock);
|
||||
@ -236,7 +239,7 @@ int acpi_dma_controller_free(struct device *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_dma_controller_free);
|
||||
|
||||
static void devm_acpi_dma_release(struct device *dev, void *res)
|
||||
static void devm_acpi_dma_free(void *dev)
|
||||
{
|
||||
acpi_dma_controller_free(dev);
|
||||
}
|
||||
@ -259,38 +262,16 @@ int devm_acpi_dma_controller_register(struct device *dev,
|
||||
(struct acpi_dma_spec *, struct acpi_dma *),
|
||||
void *data)
|
||||
{
|
||||
void *res;
|
||||
int ret;
|
||||
|
||||
res = devres_alloc(devm_acpi_dma_release, 0, GFP_KERNEL);
|
||||
if (!res)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = acpi_dma_controller_register(dev, acpi_dma_xlate, data);
|
||||
if (ret) {
|
||||
devres_free(res);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
devres_add(dev, res);
|
||||
return 0;
|
||||
|
||||
return devm_add_action_or_reset(dev, devm_acpi_dma_free, dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_acpi_dma_controller_register);
|
||||
|
||||
/**
|
||||
* devm_acpi_dma_controller_free - resource managed acpi_dma_controller_free()
|
||||
* @dev: device that is unregistering as DMA controller
|
||||
*
|
||||
* Unregister a DMA controller registered with
|
||||
* devm_acpi_dma_controller_register(). Normally this function will not need to
|
||||
* be called and the resource management code will ensure that the resource is
|
||||
* freed.
|
||||
*/
|
||||
void devm_acpi_dma_controller_free(struct device *dev)
|
||||
{
|
||||
WARN_ON(devres_release(dev, devm_acpi_dma_release, NULL, NULL));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_acpi_dma_controller_free);
|
||||
|
||||
/**
|
||||
* acpi_dma_update_dma_spec - prepare dma specifier to pass to translation function
|
||||
* @adma: struct acpi_dma of DMA controller
|
||||
|
@ -954,7 +954,7 @@ static struct platform_driver msgdma_driver = {
|
||||
.of_match_table = of_match_ptr(msgdma_match),
|
||||
},
|
||||
.probe = msgdma_probe,
|
||||
.remove_new = msgdma_remove,
|
||||
.remove = msgdma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(msgdma_driver);
|
||||
|
@ -1133,7 +1133,7 @@ static struct platform_driver amd_qdma_driver = {
|
||||
.name = "amd-qdma",
|
||||
},
|
||||
.probe = amd_qdma_probe,
|
||||
.remove_new = amd_qdma_remove,
|
||||
.remove = amd_qdma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(amd_qdma_driver);
|
||||
|
@ -950,7 +950,7 @@ static struct platform_driver apple_admac_driver = {
|
||||
.of_match_table = admac_of_match,
|
||||
},
|
||||
.probe = admac_probe,
|
||||
.remove_new = admac_remove,
|
||||
.remove = admac_remove,
|
||||
};
|
||||
module_platform_driver(apple_admac_driver);
|
||||
|
||||
|
@ -2250,7 +2250,7 @@ static const struct dev_pm_ops __maybe_unused at_dma_dev_pm_ops = {
|
||||
};
|
||||
|
||||
static struct platform_driver at_dma_driver = {
|
||||
.remove_new = at_dma_remove,
|
||||
.remove = at_dma_remove,
|
||||
.shutdown = at_dma_shutdown,
|
||||
.id_table = atdma_devtypes,
|
||||
.driver = {
|
||||
|
@ -2476,7 +2476,7 @@ MODULE_DEVICE_TABLE(of, atmel_xdmac_dt_ids);
|
||||
|
||||
static struct platform_driver at_xdmac_driver = {
|
||||
.probe = at_xdmac_probe,
|
||||
.remove_new = at_xdmac_remove,
|
||||
.remove = at_xdmac_remove,
|
||||
.driver = {
|
||||
.name = "at_xdmac",
|
||||
.of_match_table = of_match_ptr(atmel_xdmac_dt_ids),
|
||||
|
@ -1756,7 +1756,7 @@ MODULE_DEVICE_TABLE(of, sba_of_match);
|
||||
|
||||
static struct platform_driver sba_driver = {
|
||||
.probe = sba_probe,
|
||||
.remove_new = sba_remove,
|
||||
.remove = sba_remove,
|
||||
.driver = {
|
||||
.name = "bcm-sba-raid",
|
||||
.of_match_table = sba_of_match,
|
||||
|
@ -1029,7 +1029,7 @@ static void bcm2835_dma_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver bcm2835_dma_driver = {
|
||||
.probe = bcm2835_dma_probe,
|
||||
.remove_new = bcm2835_dma_remove,
|
||||
.remove = bcm2835_dma_remove,
|
||||
.driver = {
|
||||
.name = "bcm2835-dma",
|
||||
.of_match_table = of_match_ptr(bcm2835_dma_of_match),
|
||||
|
@ -486,7 +486,7 @@ MODULE_DEVICE_TABLE(of, mpc52xx_bcom_of_match);
|
||||
|
||||
static struct platform_driver mpc52xx_bcom_of_platform_driver = {
|
||||
.probe = mpc52xx_bcom_probe,
|
||||
.remove_new = mpc52xx_bcom_remove,
|
||||
.remove = mpc52xx_bcom_remove,
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.of_match_table = mpc52xx_bcom_of_match,
|
||||
|
@ -1122,7 +1122,7 @@ MODULE_DEVICE_TABLE(of, jz4780_dma_dt_match);
|
||||
|
||||
static struct platform_driver jz4780_dma_driver = {
|
||||
.probe = jz4780_dma_probe,
|
||||
.remove_new = jz4780_dma_remove,
|
||||
.remove = jz4780_dma_remove,
|
||||
.driver = {
|
||||
.name = "jz4780-dma",
|
||||
.of_match_table = jz4780_dma_dt_match,
|
||||
|
@ -1676,7 +1676,7 @@ MODULE_DEVICE_TABLE(of, dw_dma_of_id_table);
|
||||
|
||||
static struct platform_driver dw_driver = {
|
||||
.probe = dw_probe,
|
||||
.remove_new = dw_remove,
|
||||
.remove = dw_remove,
|
||||
.driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.of_match_table = dw_dma_of_id_table,
|
||||
|
@ -191,7 +191,7 @@ static const struct dev_pm_ops dw_dev_pm_ops = {
|
||||
|
||||
static struct platform_driver dw_driver = {
|
||||
.probe = dw_probe,
|
||||
.remove_new = dw_remove,
|
||||
.remove = dw_remove,
|
||||
.shutdown = dw_shutdown,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
|
@ -929,8 +929,7 @@ static int ep93xx_dma_alloc_chan_resources(struct dma_chan *chan)
|
||||
|
||||
/* Sanity check the channel parameters */
|
||||
if (!edmac->edma->m2m) {
|
||||
if (edmac->dma_cfg.port < EP93XX_DMA_I2S1 ||
|
||||
edmac->dma_cfg.port > EP93XX_DMA_IRDA)
|
||||
if (edmac->dma_cfg.port > EP93XX_DMA_IRDA)
|
||||
return -EINVAL;
|
||||
if (edmac->dma_cfg.dir != ep93xx_dma_chan_direction(chan))
|
||||
return -EINVAL;
|
||||
|
@ -740,7 +740,7 @@ static struct platform_driver fsl_edma_driver = {
|
||||
.pm = &fsl_edma_pm_ops,
|
||||
},
|
||||
.probe = fsl_edma_probe,
|
||||
.remove_new = fsl_edma_remove,
|
||||
.remove = fsl_edma_remove,
|
||||
};
|
||||
|
||||
static int __init fsl_edma_init(void)
|
||||
|
@ -1288,7 +1288,7 @@ static struct platform_driver fsl_qdma_driver = {
|
||||
.of_match_table = fsl_qdma_dt_ids,
|
||||
},
|
||||
.probe = fsl_qdma_probe,
|
||||
.remove_new = fsl_qdma_remove,
|
||||
.remove = fsl_qdma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(fsl_qdma_driver);
|
||||
|
@ -886,7 +886,7 @@ static struct platform_driver fsl_re_driver = {
|
||||
.of_match_table = fsl_re_ids,
|
||||
},
|
||||
.probe = fsl_re_probe,
|
||||
.remove_new = fsl_re_remove,
|
||||
.remove = fsl_re_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(fsl_re_driver);
|
||||
|
@ -1404,7 +1404,7 @@ static struct platform_driver fsldma_of_driver = {
|
||||
#endif
|
||||
},
|
||||
.probe = fsldma_of_probe,
|
||||
.remove_new = fsldma_of_remove,
|
||||
.remove = fsldma_of_remove,
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
@ -693,7 +693,7 @@ static const struct dev_pm_ops idma64_dev_pm_ops = {
|
||||
|
||||
static struct platform_driver idma64_platform_driver = {
|
||||
.probe = idma64_platform_probe,
|
||||
.remove_new = idma64_platform_remove,
|
||||
.remove = idma64_platform_remove,
|
||||
.driver = {
|
||||
.name = LPSS_IDMA64_DRIVER_NAME,
|
||||
.pm = &idma64_dev_pm_ops,
|
||||
|
@ -6,6 +6,10 @@
|
||||
#include <uapi/linux/idxd.h>
|
||||
|
||||
/* PCI Config */
|
||||
#define PCI_DEVICE_ID_INTEL_DSA_GNRD 0x11fb
|
||||
#define PCI_DEVICE_ID_INTEL_DSA_DMR 0x1212
|
||||
#define PCI_DEVICE_ID_INTEL_IAA_DMR 0x1216
|
||||
|
||||
#define DEVICE_VERSION_1 0x100
|
||||
#define DEVICE_VERSION_2 0x200
|
||||
|
||||
|
@ -1076,7 +1076,7 @@ static struct platform_driver mdc_dma_driver = {
|
||||
.of_match_table = of_match_ptr(mdc_dma_of_match),
|
||||
},
|
||||
.probe = mdc_dma_probe,
|
||||
.remove_new = mdc_dma_remove,
|
||||
.remove = mdc_dma_remove,
|
||||
};
|
||||
module_platform_driver(mdc_dma_driver);
|
||||
|
||||
|
@ -1233,7 +1233,7 @@ static struct platform_driver imxdma_driver = {
|
||||
.name = "imx-dma",
|
||||
.of_match_table = imx_dma_of_dev_id,
|
||||
},
|
||||
.remove_new = imxdma_remove,
|
||||
.remove = imxdma_remove,
|
||||
};
|
||||
|
||||
static int __init imxdma_module_init(void)
|
||||
|
@ -2440,7 +2440,7 @@ static struct platform_driver sdma_driver = {
|
||||
.name = "imx-sdma",
|
||||
.of_match_table = sdma_dt_ids,
|
||||
},
|
||||
.remove_new = sdma_remove,
|
||||
.remove = sdma_remove,
|
||||
.probe = sdma_probe,
|
||||
};
|
||||
|
||||
|
@ -1028,7 +1028,7 @@ static struct platform_driver k3_pdma_driver = {
|
||||
.of_match_table = k3_pdma_dt_ids,
|
||||
},
|
||||
.probe = k3_dma_probe,
|
||||
.remove_new = k3_dma_remove,
|
||||
.remove = k3_dma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(k3_pdma_driver);
|
||||
|
@ -1,6 +1,6 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* Driver for the Loongson LS2X APB DMA Controller
|
||||
* Driver for the Loongson-2 APB DMA Controller
|
||||
*
|
||||
* Copyright (C) 2017-2023 Loongson Corporation
|
||||
*/
|
||||
@ -692,7 +692,7 @@ MODULE_DEVICE_TABLE(of, ls2x_dma_of_match_table);
|
||||
|
||||
static struct platform_driver ls2x_dmac_driver = {
|
||||
.probe = ls2x_dma_probe,
|
||||
.remove_new = ls2x_dma_remove,
|
||||
.remove = ls2x_dma_remove,
|
||||
.driver = {
|
||||
.name = "ls2x-apbdma",
|
||||
.of_match_table = ls2x_dma_of_match_table,
|
||||
@ -700,6 +700,6 @@ static struct platform_driver ls2x_dmac_driver = {
|
||||
};
|
||||
module_platform_driver(ls2x_dmac_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Loongson LS2X APB DMA Controller driver");
|
||||
MODULE_DESCRIPTION("Loongson-2 APB DMA Controller driver");
|
||||
MODULE_AUTHOR("Loongson Technology Corporation Limited");
|
||||
MODULE_LICENSE("GPL");
|
@ -267,7 +267,7 @@ static struct platform_driver mcf_edma_driver = {
|
||||
.name = "mcf-edma",
|
||||
},
|
||||
.probe = mcf_edma_probe,
|
||||
.remove_new = mcf_edma_remove,
|
||||
.remove = mcf_edma_remove,
|
||||
};
|
||||
|
||||
bool mcf_edma_filter_fn(struct dma_chan *chan, void *param)
|
||||
|
@ -922,7 +922,7 @@ static void mtk_cqdma_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver mtk_cqdma_driver = {
|
||||
.probe = mtk_cqdma_probe,
|
||||
.remove_new = mtk_cqdma_remove,
|
||||
.remove = mtk_cqdma_remove,
|
||||
.driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.of_match_table = mtk_cqdma_match,
|
||||
|
@ -1038,7 +1038,7 @@ static void mtk_hsdma_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver mtk_hsdma_driver = {
|
||||
.probe = mtk_hsdma_probe,
|
||||
.remove_new = mtk_hsdma_remove,
|
||||
.remove = mtk_hsdma_remove,
|
||||
.driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.of_match_table = mtk_hsdma_match,
|
||||
|
@ -637,7 +637,7 @@ static const struct dev_pm_ops mtk_uart_apdma_pm_ops = {
|
||||
|
||||
static struct platform_driver mtk_uart_apdma_driver = {
|
||||
.probe = mtk_uart_apdma_probe,
|
||||
.remove_new = mtk_uart_apdma_remove,
|
||||
.remove = mtk_uart_apdma_remove,
|
||||
.driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.pm = &mtk_uart_apdma_pm_ops,
|
||||
|
@ -571,7 +571,7 @@ MODULE_DEVICE_TABLE(of, milbeaut_hdmac_match);
|
||||
|
||||
static struct platform_driver milbeaut_hdmac_driver = {
|
||||
.probe = milbeaut_hdmac_probe,
|
||||
.remove_new = milbeaut_hdmac_remove,
|
||||
.remove = milbeaut_hdmac_remove,
|
||||
.driver = {
|
||||
.name = "milbeaut-m10v-hdmac",
|
||||
.of_match_table = milbeaut_hdmac_match,
|
||||
|
@ -409,7 +409,7 @@ MODULE_DEVICE_TABLE(of, milbeaut_xdmac_match);
|
||||
|
||||
static struct platform_driver milbeaut_xdmac_driver = {
|
||||
.probe = milbeaut_xdmac_probe,
|
||||
.remove_new = milbeaut_xdmac_remove,
|
||||
.remove = milbeaut_xdmac_remove,
|
||||
.driver = {
|
||||
.name = "milbeaut-m10v-xdmac",
|
||||
.of_match_table = milbeaut_xdmac_match,
|
||||
|
@ -1137,7 +1137,7 @@ static struct platform_driver mmp_pdma_driver = {
|
||||
},
|
||||
.id_table = mmp_pdma_id_table,
|
||||
.probe = mmp_pdma_probe,
|
||||
.remove_new = mmp_pdma_remove,
|
||||
.remove = mmp_pdma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(mmp_pdma_driver);
|
||||
|
@ -736,7 +736,7 @@ static struct platform_driver mmp_tdma_driver = {
|
||||
.of_match_table = mmp_tdma_dt_ids,
|
||||
},
|
||||
.probe = mmp_tdma_probe,
|
||||
.remove_new = mmp_tdma_remove,
|
||||
.remove = mmp_tdma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(mmp_tdma_driver);
|
||||
|
@ -644,7 +644,7 @@ MODULE_DEVICE_TABLE(of, moxart_dma_match);
|
||||
|
||||
static struct platform_driver moxart_driver = {
|
||||
.probe = moxart_probe,
|
||||
.remove_new = moxart_remove,
|
||||
.remove = moxart_remove,
|
||||
.driver = {
|
||||
.name = "moxart-dma-engine",
|
||||
.of_match_table = moxart_dma_match,
|
||||
|
@ -1110,7 +1110,7 @@ MODULE_DEVICE_TABLE(of, mpc_dma_match);
|
||||
|
||||
static struct platform_driver mpc_dma_driver = {
|
||||
.probe = mpc_dma_probe,
|
||||
.remove_new = mpc_dma_remove,
|
||||
.remove = mpc_dma_remove,
|
||||
.driver = {
|
||||
.name = DRV_NAME,
|
||||
.of_match_table = mpc_dma_match,
|
||||
|
@ -635,7 +635,7 @@ static int mv_xor_v2_descq_init(struct mv_xor_v2_device *xor_dev)
|
||||
writel(MV_XOR_V2_DESC_NUM,
|
||||
xor_dev->dma_base + MV_XOR_V2_DMA_DESQ_SIZE_OFF);
|
||||
|
||||
/* write the DESQ address to the DMA enngine*/
|
||||
/* write the DESQ address to the DMA engine*/
|
||||
writel(lower_32_bits(xor_dev->hw_desq),
|
||||
xor_dev->dma_base + MV_XOR_V2_DMA_DESQ_BALR_OFF);
|
||||
writel(upper_32_bits(xor_dev->hw_desq),
|
||||
@ -884,7 +884,7 @@ static struct platform_driver mv_xor_v2_driver = {
|
||||
.probe = mv_xor_v2_probe,
|
||||
.suspend = mv_xor_v2_suspend,
|
||||
.resume = mv_xor_v2_resume,
|
||||
.remove_new = mv_xor_v2_remove,
|
||||
.remove = mv_xor_v2_remove,
|
||||
.driver = {
|
||||
.name = "mv_xor_v2",
|
||||
.of_match_table = of_match_ptr(mv_xor_v2_dt_ids),
|
||||
|
@ -1515,7 +1515,7 @@ static struct platform_driver nbpf_driver = {
|
||||
},
|
||||
.id_table = nbpf_ids,
|
||||
.probe = nbpf_probe,
|
||||
.remove_new = nbpf_remove,
|
||||
.remove = nbpf_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(nbpf_driver);
|
||||
|
@ -1252,7 +1252,7 @@ static void owl_dma_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver owl_dma_driver = {
|
||||
.probe = owl_dma_probe,
|
||||
.remove_new = owl_dma_remove,
|
||||
.remove = owl_dma_remove,
|
||||
.driver = {
|
||||
.name = "dma-owl",
|
||||
.of_match_table = of_match_ptr(owl_dma_match),
|
||||
|
@ -4549,7 +4549,7 @@ MODULE_DEVICE_TABLE(of, ppc440spe_adma_of_match);
|
||||
|
||||
static struct platform_driver ppc440spe_adma_driver = {
|
||||
.probe = ppc440spe_adma_probe,
|
||||
.remove_new = ppc440spe_adma_remove,
|
||||
.remove = ppc440spe_adma_remove,
|
||||
.driver = {
|
||||
.name = "PPC440SP(E)-ADMA",
|
||||
.of_match_table = ppc440spe_adma_of_match,
|
||||
|
@ -1442,7 +1442,7 @@ static struct platform_driver pxad_driver = {
|
||||
},
|
||||
.id_table = pxad_id_table,
|
||||
.probe = pxad_probe,
|
||||
.remove_new = pxad_remove,
|
||||
.remove = pxad_remove,
|
||||
};
|
||||
|
||||
static bool pxad_filter_fn(struct dma_chan *chan, void *param)
|
||||
|
@ -1469,7 +1469,7 @@ static const struct dev_pm_ops bam_dma_pm_ops = {
|
||||
|
||||
static struct platform_driver bam_dma_driver = {
|
||||
.probe = bam_dma_probe,
|
||||
.remove_new = bam_dma_remove,
|
||||
.remove = bam_dma_remove,
|
||||
.driver = {
|
||||
.name = "bam-dma-engine",
|
||||
.pm = &bam_dma_pm_ops,
|
||||
|
@ -948,7 +948,7 @@ MODULE_DEVICE_TABLE(acpi, hidma_acpi_ids);
|
||||
|
||||
static struct platform_driver hidma_driver = {
|
||||
.probe = hidma_probe,
|
||||
.remove_new = hidma_remove,
|
||||
.remove = hidma_remove,
|
||||
.shutdown = hidma_shutdown,
|
||||
.driver = {
|
||||
.name = "hidma",
|
||||
|
@ -937,7 +937,7 @@ MODULE_DEVICE_TABLE(of, adm_of_match);
|
||||
|
||||
static struct platform_driver adm_dma_driver = {
|
||||
.probe = adm_dma_probe,
|
||||
.remove_new = adm_dma_remove,
|
||||
.remove = adm_dma_remove,
|
||||
.driver = {
|
||||
.name = "adm-dma-engine",
|
||||
.of_match_table = adm_of_match,
|
||||
|
@ -1079,7 +1079,7 @@ static struct platform_driver sa11x0_dma_driver = {
|
||||
.pm = &sa11x0_dma_pm_ops,
|
||||
},
|
||||
.probe = sa11x0_dma_probe,
|
||||
.remove_new = sa11x0_dma_remove,
|
||||
.remove = sa11x0_dma_remove,
|
||||
};
|
||||
|
||||
static int __init sa11x0_dma_init(void)
|
||||
|
@ -354,7 +354,7 @@ static irqreturn_t sf_pdma_done_isr(int irq, void *dev_id)
|
||||
if (!residue) {
|
||||
tasklet_hi_schedule(&chan->done_tasklet);
|
||||
} else {
|
||||
/* submit next trascatioin if possible */
|
||||
/* submit next transaction if possible */
|
||||
struct sf_pdma_desc *desc = chan->desc;
|
||||
|
||||
desc->src_addr += desc->xfer_size - residue;
|
||||
@ -633,7 +633,7 @@ MODULE_DEVICE_TABLE(of, sf_pdma_dt_ids);
|
||||
|
||||
static struct platform_driver sf_pdma_driver = {
|
||||
.probe = sf_pdma_probe,
|
||||
.remove_new = sf_pdma_remove,
|
||||
.remove = sf_pdma_remove,
|
||||
.driver = {
|
||||
.name = "sf-pdma",
|
||||
.of_match_table = sf_pdma_dt_ids,
|
||||
|
@ -49,10 +49,10 @@ config RENESAS_USB_DMAC
|
||||
SoCs.
|
||||
|
||||
config RZ_DMAC
|
||||
tristate "Renesas RZ/{G2L,V2L} DMA Controller"
|
||||
depends on ARCH_RZG2L || COMPILE_TEST
|
||||
tristate "Renesas RZ DMA Controller"
|
||||
depends on ARCH_R7S72100 || ARCH_RZG2L || COMPILE_TEST
|
||||
select RENESAS_DMA
|
||||
select DMA_VIRTUAL_CHANNELS
|
||||
help
|
||||
This driver supports the general purpose DMA controller found in the
|
||||
Renesas RZ/{G2L,V2L} SoC variants.
|
||||
This driver supports the general purpose DMA controller typically
|
||||
found in the Renesas RZ SoC variants.
|
||||
|
@ -2037,7 +2037,7 @@ static struct platform_driver rcar_dmac_driver = {
|
||||
.of_match_table = rcar_dmac_of_ids,
|
||||
},
|
||||
.probe = rcar_dmac_probe,
|
||||
.remove_new = rcar_dmac_remove,
|
||||
.remove = rcar_dmac_remove,
|
||||
.shutdown = rcar_dmac_shutdown,
|
||||
};
|
||||
|
||||
|
@ -893,7 +893,7 @@ static int rz_dmac_probe(struct platform_device *pdev)
|
||||
/* Initialize the channels. */
|
||||
INIT_LIST_HEAD(&dmac->engine.channels);
|
||||
|
||||
dmac->rstc = devm_reset_control_array_get_exclusive(&pdev->dev);
|
||||
dmac->rstc = devm_reset_control_array_get_optional_exclusive(&pdev->dev);
|
||||
if (IS_ERR(dmac->rstc))
|
||||
return dev_err_probe(&pdev->dev, PTR_ERR(dmac->rstc),
|
||||
"failed to get resets\n");
|
||||
@ -1004,7 +1004,7 @@ static struct platform_driver rz_dmac_driver = {
|
||||
.of_match_table = of_rz_dmac_match,
|
||||
},
|
||||
.probe = rz_dmac_probe,
|
||||
.remove_new = rz_dmac_remove,
|
||||
.remove = rz_dmac_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(rz_dmac_driver);
|
||||
|
@ -961,7 +961,7 @@ void shdma_chan_probe(struct shdma_dev *sdev,
|
||||
|
||||
spin_lock_init(&schan->chan_lock);
|
||||
|
||||
/* Init descripter manage list */
|
||||
/* Init descriptor manage list */
|
||||
INIT_LIST_HEAD(&schan->ld_queue);
|
||||
INIT_LIST_HEAD(&schan->ld_free);
|
||||
|
||||
|
@ -906,7 +906,7 @@ static struct platform_driver sh_dmae_driver = {
|
||||
.pm = &sh_dmae_pm,
|
||||
.name = SH_DMAE_DRV_NAME,
|
||||
},
|
||||
.remove_new = sh_dmae_remove,
|
||||
.remove = sh_dmae_remove,
|
||||
};
|
||||
|
||||
static int __init sh_dmae_init(void)
|
||||
|
@ -301,7 +301,7 @@ static struct usb_dmac_desc *usb_dmac_desc_get(struct usb_dmac_chan *chan,
|
||||
struct usb_dmac_desc *desc = NULL;
|
||||
unsigned long flags;
|
||||
|
||||
/* Get a freed descritpor */
|
||||
/* Get a freed descriptor */
|
||||
spin_lock_irqsave(&chan->vc.lock, flags);
|
||||
list_for_each_entry(desc, &chan->desc_freed, node) {
|
||||
if (sg_len <= desc->sg_allocated_len) {
|
||||
@ -899,7 +899,7 @@ static struct platform_driver usb_dmac_driver = {
|
||||
.of_match_table = usb_dmac_of_ids,
|
||||
},
|
||||
.probe = usb_dmac_probe,
|
||||
.remove_new = usb_dmac_remove,
|
||||
.remove = usb_dmac_remove,
|
||||
.shutdown = usb_dmac_shutdown,
|
||||
};
|
||||
|
||||
|
@ -1298,7 +1298,7 @@ static const struct dev_pm_ops sprd_dma_pm_ops = {
|
||||
|
||||
static struct platform_driver sprd_dma_driver = {
|
||||
.probe = sprd_dma_probe,
|
||||
.remove_new = sprd_dma_remove,
|
||||
.remove = sprd_dma_remove,
|
||||
.driver = {
|
||||
.name = "sprd-dma",
|
||||
.of_match_table = sprd_dma_match,
|
||||
|
@ -858,7 +858,7 @@ static struct platform_driver st_fdma_platform_driver = {
|
||||
.of_match_table = st_fdma_match,
|
||||
},
|
||||
.probe = st_fdma_probe,
|
||||
.remove_new = st_fdma_remove,
|
||||
.remove = st_fdma_remove,
|
||||
};
|
||||
module_platform_driver(st_fdma_platform_driver);
|
||||
|
||||
|
@ -221,6 +221,8 @@ enum stm32_dma3_port_data_width {
|
||||
#define STM32_DMA3_DT_BREQ BIT(8) /* CTR2_BREQ */
|
||||
#define STM32_DMA3_DT_PFREQ BIT(9) /* CTR2_PFREQ */
|
||||
#define STM32_DMA3_DT_TCEM GENMASK(13, 12) /* CTR2_TCEM */
|
||||
#define STM32_DMA3_DT_NOPACK BIT(16) /* CTR1_PAM */
|
||||
#define STM32_DMA3_DT_NOREFACT BIT(17)
|
||||
|
||||
/* struct stm32_dma3_chan .config_set bitfield */
|
||||
#define STM32_DMA3_CFG_SET_DT BIT(0)
|
||||
@ -228,6 +230,8 @@ enum stm32_dma3_port_data_width {
|
||||
#define STM32_DMA3_CFG_SET_BOTH (STM32_DMA3_CFG_SET_DT | STM32_DMA3_CFG_SET_DMA)
|
||||
|
||||
#define STM32_DMA3_MAX_BLOCK_SIZE ALIGN_DOWN(CBR1_BNDT, 64)
|
||||
#define STM32_DMA3_MAX_BURST_LEN (1 + min_t(u32, FIELD_MAX(CTR1_SBL_1), \
|
||||
FIELD_MAX(CTR1_DBL_1)))
|
||||
#define port_is_ahb(maxdw) ({ typeof(maxdw) (_maxdw) = (maxdw); \
|
||||
((_maxdw) != DW_INVALID) && ((_maxdw) == DW_32); })
|
||||
#define port_is_axi(maxdw) ({ typeof(maxdw) (_maxdw) = (maxdw); \
|
||||
@ -293,6 +297,10 @@ struct stm32_dma3_chan {
|
||||
u32 dma_status;
|
||||
};
|
||||
|
||||
struct stm32_dma3_pdata {
|
||||
u32 axi_max_burst_len;
|
||||
};
|
||||
|
||||
struct stm32_dma3_ddata {
|
||||
struct dma_device dma_dev;
|
||||
void __iomem *base;
|
||||
@ -301,6 +309,7 @@ struct stm32_dma3_ddata {
|
||||
u32 dma_channels;
|
||||
u32 dma_requests;
|
||||
enum stm32_dma3_port_data_width ports_max_dw[2];
|
||||
u32 axi_max_burst_len;
|
||||
};
|
||||
|
||||
static inline struct stm32_dma3_ddata *to_stm32_dma3_ddata(struct stm32_dma3_chan *chan)
|
||||
@ -533,7 +542,8 @@ static enum dma_slave_buswidth stm32_dma3_get_max_dw(u32 chan_max_burst,
|
||||
return 1 << __ffs(len | addr | max_dw);
|
||||
}
|
||||
|
||||
static u32 stm32_dma3_get_max_burst(u32 len, enum dma_slave_buswidth dw, u32 chan_max_burst)
|
||||
static u32 stm32_dma3_get_max_burst(u32 len, enum dma_slave_buswidth dw,
|
||||
u32 chan_max_burst, u32 bus_max_burst)
|
||||
{
|
||||
u32 max_burst = chan_max_burst ? chan_max_burst / dw : 1;
|
||||
|
||||
@ -544,8 +554,9 @@ static u32 stm32_dma3_get_max_burst(u32 len, enum dma_slave_buswidth dw, u32 cha
|
||||
/*
|
||||
* HW doesn't modify the burst if burst size <= half of the fifo size.
|
||||
* If len is not a multiple of burst size, last burst is shortened by HW.
|
||||
* Take care of maximum burst supported on interconnect bus.
|
||||
*/
|
||||
return max_burst;
|
||||
return min_t(u32, max_burst, bus_max_burst);
|
||||
}
|
||||
|
||||
static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transfer_direction dir,
|
||||
@ -554,6 +565,7 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
|
||||
{
|
||||
struct stm32_dma3_ddata *ddata = to_stm32_dma3_ddata(chan);
|
||||
struct dma_device dma_device = ddata->dma_dev;
|
||||
u32 src_max_burst = STM32_DMA3_MAX_BURST_LEN, dst_max_burst = STM32_DMA3_MAX_BURST_LEN;
|
||||
u32 sdw, ddw, sbl_max, dbl_max, tcem, init_dw, init_bl_max;
|
||||
u32 _ctr1 = 0, _ctr2 = 0;
|
||||
u32 ch_conf = chan->dt_config.ch_conf;
|
||||
@ -594,10 +606,14 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
|
||||
_ctr1 |= CTR1_SINC;
|
||||
if (sap)
|
||||
_ctr1 |= CTR1_SAP;
|
||||
if (port_is_axi(sap_max_dw)) /* AXI - apply axi maximum burst limitation */
|
||||
src_max_burst = ddata->axi_max_burst_len;
|
||||
if (FIELD_GET(STM32_DMA3_DT_DINC, tr_conf))
|
||||
_ctr1 |= CTR1_DINC;
|
||||
if (dap)
|
||||
_ctr1 |= CTR1_DAP;
|
||||
if (port_is_axi(dap_max_dw)) /* AXI - apply axi maximum burst limitation */
|
||||
dst_max_burst = ddata->axi_max_burst_len;
|
||||
|
||||
_ctr2 |= FIELD_PREP(CTR2_REQSEL, chan->dt_config.req_line) & ~CTR2_SWREQ;
|
||||
if (FIELD_GET(STM32_DMA3_DT_BREQ, tr_conf))
|
||||
@ -617,11 +633,16 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
|
||||
/* Set destination (device) data width and burst */
|
||||
ddw = min_t(u32, ddw, stm32_dma3_get_max_dw(chan->max_burst, dap_max_dw,
|
||||
len, dst_addr));
|
||||
dbl_max = min_t(u32, dbl_max, stm32_dma3_get_max_burst(len, ddw, chan->max_burst));
|
||||
dbl_max = min_t(u32, dbl_max, stm32_dma3_get_max_burst(len, ddw, chan->max_burst,
|
||||
dst_max_burst));
|
||||
|
||||
/* Set source (memory) data width and burst */
|
||||
sdw = stm32_dma3_get_max_dw(chan->max_burst, sap_max_dw, len, src_addr);
|
||||
sbl_max = stm32_dma3_get_max_burst(len, sdw, chan->max_burst);
|
||||
sbl_max = stm32_dma3_get_max_burst(len, sdw, chan->max_burst, src_max_burst);
|
||||
if (!!FIELD_GET(STM32_DMA3_DT_NOPACK, tr_conf)) {
|
||||
sdw = ddw;
|
||||
sbl_max = dbl_max;
|
||||
}
|
||||
|
||||
_ctr1 |= FIELD_PREP(CTR1_SDW_LOG2, ilog2(sdw));
|
||||
_ctr1 |= FIELD_PREP(CTR1_SBL_1, sbl_max - 1);
|
||||
@ -647,11 +668,17 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
|
||||
/* Set source (device) data width and burst */
|
||||
sdw = min_t(u32, sdw, stm32_dma3_get_max_dw(chan->max_burst, sap_max_dw,
|
||||
len, src_addr));
|
||||
sbl_max = min_t(u32, sbl_max, stm32_dma3_get_max_burst(len, sdw, chan->max_burst));
|
||||
sbl_max = min_t(u32, sbl_max, stm32_dma3_get_max_burst(len, sdw, chan->max_burst,
|
||||
src_max_burst));
|
||||
|
||||
/* Set destination (memory) data width and burst */
|
||||
ddw = stm32_dma3_get_max_dw(chan->max_burst, dap_max_dw, len, dst_addr);
|
||||
dbl_max = stm32_dma3_get_max_burst(len, ddw, chan->max_burst);
|
||||
dbl_max = stm32_dma3_get_max_burst(len, ddw, chan->max_burst, dst_max_burst);
|
||||
if (!!FIELD_GET(STM32_DMA3_DT_NOPACK, tr_conf) ||
|
||||
((_ctr2 & CTR2_PFREQ) && ddw > sdw)) { /* Packing to wider ddw not supported */
|
||||
ddw = sdw;
|
||||
dbl_max = sbl_max;
|
||||
}
|
||||
|
||||
_ctr1 |= FIELD_PREP(CTR1_SDW_LOG2, ilog2(sdw));
|
||||
_ctr1 |= FIELD_PREP(CTR1_SBL_1, sbl_max - 1);
|
||||
@ -678,22 +705,24 @@ static int stm32_dma3_chan_prep_hw(struct stm32_dma3_chan *chan, enum dma_transf
|
||||
init_dw = sdw;
|
||||
init_bl_max = sbl_max;
|
||||
sdw = stm32_dma3_get_max_dw(chan->max_burst, sap_max_dw, len, src_addr);
|
||||
sbl_max = stm32_dma3_get_max_burst(len, sdw, chan->max_burst);
|
||||
sbl_max = stm32_dma3_get_max_burst(len, sdw, chan->max_burst, src_max_burst);
|
||||
if (chan->config_set & STM32_DMA3_CFG_SET_DMA) {
|
||||
sdw = min_t(u32, init_dw, sdw);
|
||||
sbl_max = min_t(u32, init_bl_max,
|
||||
stm32_dma3_get_max_burst(len, sdw, chan->max_burst));
|
||||
sbl_max = min_t(u32, init_bl_max, stm32_dma3_get_max_burst(len, sdw,
|
||||
chan->max_burst,
|
||||
src_max_burst));
|
||||
}
|
||||
|
||||
/* Set destination (memory) data width and burst */
|
||||
init_dw = ddw;
|
||||
init_bl_max = dbl_max;
|
||||
ddw = stm32_dma3_get_max_dw(chan->max_burst, dap_max_dw, len, dst_addr);
|
||||
dbl_max = stm32_dma3_get_max_burst(len, ddw, chan->max_burst);
|
||||
dbl_max = stm32_dma3_get_max_burst(len, ddw, chan->max_burst, dst_max_burst);
|
||||
if (chan->config_set & STM32_DMA3_CFG_SET_DMA) {
|
||||
ddw = min_t(u32, init_dw, ddw);
|
||||
dbl_max = min_t(u32, init_bl_max,
|
||||
stm32_dma3_get_max_burst(len, ddw, chan->max_burst));
|
||||
dbl_max = min_t(u32, init_bl_max, stm32_dma3_get_max_burst(len, ddw,
|
||||
chan->max_burst,
|
||||
dst_max_burst));
|
||||
}
|
||||
|
||||
_ctr1 |= FIELD_PREP(CTR1_SDW_LOG2, ilog2(sdw));
|
||||
@ -1116,6 +1145,28 @@ static void stm32_dma3_free_chan_resources(struct dma_chan *c)
|
||||
chan->config_set = 0;
|
||||
}
|
||||
|
||||
static u32 stm32_dma3_get_ll_count(struct stm32_dma3_chan *chan, size_t len, bool prevent_refactor)
|
||||
{
|
||||
u32 count;
|
||||
|
||||
if (prevent_refactor)
|
||||
return DIV_ROUND_UP(len, STM32_DMA3_MAX_BLOCK_SIZE);
|
||||
|
||||
count = len / STM32_DMA3_MAX_BLOCK_SIZE;
|
||||
len -= (len / STM32_DMA3_MAX_BLOCK_SIZE) * STM32_DMA3_MAX_BLOCK_SIZE;
|
||||
|
||||
if (len >= chan->max_burst) {
|
||||
count += 1; /* len < STM32_DMA3_MAX_BLOCK_SIZE here, so it fits in one item */
|
||||
len -= (len / chan->max_burst) * chan->max_burst;
|
||||
}
|
||||
|
||||
/* Unaligned remainder fits in one extra item */
|
||||
if (len > 0)
|
||||
count += 1;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static void stm32_dma3_init_chan_config_for_memcpy(struct stm32_dma3_chan *chan,
|
||||
dma_addr_t dst, dma_addr_t src)
|
||||
{
|
||||
@ -1150,8 +1201,10 @@ static struct dma_async_tx_descriptor *stm32_dma3_prep_dma_memcpy(struct dma_cha
|
||||
struct stm32_dma3_swdesc *swdesc;
|
||||
size_t next_size, offset;
|
||||
u32 count, i, ctr1, ctr2;
|
||||
bool prevent_refactor = !!FIELD_GET(STM32_DMA3_DT_NOPACK, chan->dt_config.tr_conf) ||
|
||||
!!FIELD_GET(STM32_DMA3_DT_NOREFACT, chan->dt_config.tr_conf);
|
||||
|
||||
count = DIV_ROUND_UP(len, STM32_DMA3_MAX_BLOCK_SIZE);
|
||||
count = stm32_dma3_get_ll_count(chan, len, prevent_refactor);
|
||||
|
||||
swdesc = stm32_dma3_chan_desc_alloc(chan, count);
|
||||
if (!swdesc)
|
||||
@ -1167,6 +1220,10 @@ static struct dma_async_tx_descriptor *stm32_dma3_prep_dma_memcpy(struct dma_cha
|
||||
remaining = len - offset;
|
||||
next_size = min_t(size_t, remaining, STM32_DMA3_MAX_BLOCK_SIZE);
|
||||
|
||||
if (!prevent_refactor &&
|
||||
(next_size < STM32_DMA3_MAX_BLOCK_SIZE && next_size >= chan->max_burst))
|
||||
next_size = chan->max_burst * (remaining / chan->max_burst);
|
||||
|
||||
ret = stm32_dma3_chan_prep_hw(chan, DMA_MEM_TO_MEM, &swdesc->ccr, &ctr1, &ctr2,
|
||||
src + offset, dst + offset, next_size);
|
||||
if (ret)
|
||||
@ -1203,14 +1260,13 @@ static struct dma_async_tx_descriptor *stm32_dma3_prep_slave_sg(struct dma_chan
|
||||
size_t len;
|
||||
dma_addr_t sg_addr, dev_addr, src, dst;
|
||||
u32 i, j, count, ctr1, ctr2;
|
||||
bool prevent_refactor = !!FIELD_GET(STM32_DMA3_DT_NOPACK, chan->dt_config.tr_conf) ||
|
||||
!!FIELD_GET(STM32_DMA3_DT_NOREFACT, chan->dt_config.tr_conf);
|
||||
int ret;
|
||||
|
||||
count = sg_len;
|
||||
for_each_sg(sgl, sg, sg_len, i) {
|
||||
len = sg_dma_len(sg);
|
||||
if (len > STM32_DMA3_MAX_BLOCK_SIZE)
|
||||
count += DIV_ROUND_UP(len, STM32_DMA3_MAX_BLOCK_SIZE) - 1;
|
||||
}
|
||||
count = 0;
|
||||
for_each_sg(sgl, sg, sg_len, i)
|
||||
count += stm32_dma3_get_ll_count(chan, sg_dma_len(sg), prevent_refactor);
|
||||
|
||||
swdesc = stm32_dma3_chan_desc_alloc(chan, count);
|
||||
if (!swdesc)
|
||||
@ -1227,6 +1283,10 @@ static struct dma_async_tx_descriptor *stm32_dma3_prep_slave_sg(struct dma_chan
|
||||
do {
|
||||
size_t chunk = min_t(size_t, len, STM32_DMA3_MAX_BLOCK_SIZE);
|
||||
|
||||
if (!prevent_refactor &&
|
||||
(chunk < STM32_DMA3_MAX_BLOCK_SIZE && chunk >= chan->max_burst))
|
||||
chunk = chan->max_burst * (len / chan->max_burst);
|
||||
|
||||
if (dir == DMA_MEM_TO_DEV) {
|
||||
src = sg_addr;
|
||||
dst = dev_addr;
|
||||
@ -1259,6 +1319,10 @@ static struct dma_async_tx_descriptor *stm32_dma3_prep_slave_sg(struct dma_chan
|
||||
} while (len);
|
||||
}
|
||||
|
||||
if (count != sg_len && chan->tcem != CTR2_TCEM_CHANNEL)
|
||||
dev_warn(chan2dev(chan), "Linked-list refactored, %d items instead of %d\n",
|
||||
count, sg_len);
|
||||
|
||||
/* Enable Error interrupts */
|
||||
swdesc->ccr |= CCR_USEIE | CCR_ULEIE | CCR_DTEIE;
|
||||
/* Enable Transfer state interrupts */
|
||||
@ -1601,8 +1665,12 @@ static u32 stm32_dma3_check_rif(struct stm32_dma3_ddata *ddata)
|
||||
return chan_reserved;
|
||||
}
|
||||
|
||||
static struct stm32_dma3_pdata stm32mp25_pdata = {
|
||||
.axi_max_burst_len = 16,
|
||||
};
|
||||
|
||||
static const struct of_device_id stm32_dma3_of_match[] = {
|
||||
{ .compatible = "st,stm32mp25-dma3", },
|
||||
{ .compatible = "st,stm32mp25-dma3", .data = &stm32mp25_pdata, },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, stm32_dma3_of_match);
|
||||
@ -1610,6 +1678,7 @@ MODULE_DEVICE_TABLE(of, stm32_dma3_of_match);
|
||||
static int stm32_dma3_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
const struct stm32_dma3_pdata *pdata;
|
||||
struct stm32_dma3_ddata *ddata;
|
||||
struct reset_control *reset;
|
||||
struct stm32_dma3_chan *chan;
|
||||
@ -1704,6 +1773,16 @@ static int stm32_dma3_probe(struct platform_device *pdev)
|
||||
else /* Dual master ports */
|
||||
ddata->ports_max_dw[1] = FIELD_GET(G_M1_DATA_WIDTH_ENC, hwcfgr);
|
||||
|
||||
/* axi_max_burst_len is optional, if not defined, use STM32_DMA3_MAX_BURST_LEN */
|
||||
ddata->axi_max_burst_len = STM32_DMA3_MAX_BURST_LEN;
|
||||
pdata = device_get_match_data(&pdev->dev);
|
||||
if (pdata && pdata->axi_max_burst_len) {
|
||||
ddata->axi_max_burst_len = min_t(u32, pdata->axi_max_burst_len,
|
||||
STM32_DMA3_MAX_BURST_LEN);
|
||||
dev_dbg(&pdev->dev, "Burst is limited to %u beats through AXI port\n",
|
||||
ddata->axi_max_burst_len);
|
||||
}
|
||||
|
||||
ddata->chans = devm_kcalloc(&pdev->dev, ddata->dma_channels, sizeof(*ddata->chans),
|
||||
GFP_KERNEL);
|
||||
if (!ddata->chans) {
|
||||
@ -1827,7 +1906,7 @@ static const struct dev_pm_ops stm32_dma3_pm_ops = {
|
||||
|
||||
static struct platform_driver stm32_dma3_driver = {
|
||||
.probe = stm32_dma3_probe,
|
||||
.remove_new = stm32_dma3_remove,
|
||||
.remove = stm32_dma3_remove,
|
||||
.driver = {
|
||||
.name = "stm32-dma3",
|
||||
.of_match_table = stm32_dma3_of_match,
|
||||
|
@ -1292,7 +1292,7 @@ MODULE_DEVICE_TABLE(of, sun4i_dma_match);
|
||||
|
||||
static struct platform_driver sun4i_dma_driver = {
|
||||
.probe = sun4i_dma_probe,
|
||||
.remove_new = sun4i_dma_remove,
|
||||
.remove = sun4i_dma_remove,
|
||||
.driver = {
|
||||
.name = "sun4i-dma",
|
||||
.of_match_table = sun4i_dma_match,
|
||||
|
@ -1488,7 +1488,7 @@ static void sun6i_dma_remove(struct platform_device *pdev)
|
||||
|
||||
static struct platform_driver sun6i_dma_driver = {
|
||||
.probe = sun6i_dma_probe,
|
||||
.remove_new = sun6i_dma_remove,
|
||||
.remove = sun6i_dma_remove,
|
||||
.driver = {
|
||||
.name = "sun6i-dma",
|
||||
.of_match_table = sun6i_dma_match,
|
||||
|
@ -1532,7 +1532,7 @@ static struct platform_driver tegra_dma_driver = {
|
||||
.of_match_table = tegra_dma_of_match,
|
||||
},
|
||||
.probe = tegra_dma_probe,
|
||||
.remove_new = tegra_dma_remove,
|
||||
.remove = tegra_dma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(tegra_dma_driver);
|
||||
|
@ -1675,7 +1675,7 @@ static struct platform_driver tegra_dmac_driver = {
|
||||
.of_match_table = tegra_dma_of_match,
|
||||
},
|
||||
.probe = tegra_dma_probe,
|
||||
.remove_new = tegra_dma_remove,
|
||||
.remove = tegra_dma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(tegra_dmac_driver);
|
||||
|
@ -1008,7 +1008,7 @@ static struct platform_driver tegra_admac_driver = {
|
||||
.of_match_table = tegra_adma_of_match,
|
||||
},
|
||||
.probe = tegra_adma_probe,
|
||||
.remove_new = tegra_adma_remove,
|
||||
.remove = tegra_adma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(tegra_admac_driver);
|
||||
|
@ -1243,7 +1243,7 @@ static const struct dev_pm_ops cppi41_pm_ops = {
|
||||
|
||||
static struct platform_driver cpp41_dma_driver = {
|
||||
.probe = cppi41_dma_probe,
|
||||
.remove_new = cppi41_dma_remove,
|
||||
.remove = cppi41_dma_remove,
|
||||
.driver = {
|
||||
.name = "cppi41-dma-engine",
|
||||
.pm = &cppi41_pm_ops,
|
||||
|
@ -2636,7 +2636,7 @@ static const struct dev_pm_ops edma_pm_ops = {
|
||||
|
||||
static struct platform_driver edma_driver = {
|
||||
.probe = edma_probe,
|
||||
.remove_new = edma_remove,
|
||||
.remove = edma_remove,
|
||||
.driver = {
|
||||
.name = "edma",
|
||||
.pm = &edma_pm_ops,
|
||||
|
@ -1915,7 +1915,7 @@ MODULE_DEVICE_TABLE(of, omap_dma_match);
|
||||
|
||||
static struct platform_driver omap_dma_driver = {
|
||||
.probe = omap_dma_probe,
|
||||
.remove_new = omap_dma_remove,
|
||||
.remove = omap_dma_remove,
|
||||
.driver = {
|
||||
.name = "omap-dma-engine",
|
||||
.of_match_table = omap_dma_match,
|
||||
|
@ -761,7 +761,7 @@ static struct platform_driver td_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
},
|
||||
.probe = td_probe,
|
||||
.remove_new = td_remove,
|
||||
.remove = td_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(td_driver);
|
||||
|
@ -1260,14 +1260,14 @@ static const struct dev_pm_ops txx9dmac_dev_pm_ops = {
|
||||
};
|
||||
|
||||
static struct platform_driver txx9dmac_chan_driver = {
|
||||
.remove_new = txx9dmac_chan_remove,
|
||||
.remove = txx9dmac_chan_remove,
|
||||
.driver = {
|
||||
.name = "txx9dmac-chan",
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_driver txx9dmac_driver = {
|
||||
.remove_new = txx9dmac_remove,
|
||||
.remove = txx9dmac_remove,
|
||||
.shutdown = txx9dmac_shutdown,
|
||||
.driver = {
|
||||
.name = "txx9dmac",
|
||||
|
@ -493,7 +493,7 @@ MODULE_DEVICE_TABLE(of, uniphier_mdmac_match);
|
||||
|
||||
static struct platform_driver uniphier_mdmac_driver = {
|
||||
.probe = uniphier_mdmac_probe,
|
||||
.remove_new = uniphier_mdmac_remove,
|
||||
.remove = uniphier_mdmac_remove,
|
||||
.driver = {
|
||||
.name = "uniphier-mio-dmac",
|
||||
.of_match_table = uniphier_mdmac_match,
|
||||
|
@ -603,7 +603,7 @@ MODULE_DEVICE_TABLE(of, uniphier_xdmac_match);
|
||||
|
||||
static struct platform_driver uniphier_xdmac_driver = {
|
||||
.probe = uniphier_xdmac_probe,
|
||||
.remove_new = uniphier_xdmac_remove,
|
||||
.remove = uniphier_xdmac_remove,
|
||||
.driver = {
|
||||
.name = "uniphier-xdmac",
|
||||
.of_match_table = uniphier_xdmac_match,
|
||||
|
@ -1815,7 +1815,7 @@ MODULE_DEVICE_TABLE(of, xgene_dma_of_match_ptr);
|
||||
|
||||
static struct platform_driver xgene_dma_driver = {
|
||||
.probe = xgene_dma_probe,
|
||||
.remove_new = xgene_dma_remove,
|
||||
.remove = xgene_dma_remove,
|
||||
.driver = {
|
||||
.name = "X-Gene-DMA",
|
||||
.of_match_table = xgene_dma_of_match_ptr,
|
||||
|
@ -1315,7 +1315,7 @@ static struct platform_driver xdma_driver = {
|
||||
},
|
||||
.id_table = xdma_id_table,
|
||||
.probe = xdma_probe,
|
||||
.remove_new = xdma_remove,
|
||||
.remove = xdma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(xdma_driver);
|
||||
|
@ -3271,7 +3271,7 @@ static struct platform_driver xilinx_vdma_driver = {
|
||||
.of_match_table = xilinx_dma_of_ids,
|
||||
},
|
||||
.probe = xilinx_dma_probe,
|
||||
.remove_new = xilinx_dma_remove,
|
||||
.remove = xilinx_dma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(xilinx_vdma_driver);
|
||||
|
@ -1863,7 +1863,7 @@ MODULE_DEVICE_TABLE(of, xilinx_dpdma_of_match);
|
||||
|
||||
static struct platform_driver xilinx_dpdma_driver = {
|
||||
.probe = xilinx_dpdma_probe,
|
||||
.remove_new = xilinx_dpdma_remove,
|
||||
.remove = xilinx_dpdma_remove,
|
||||
.driver = {
|
||||
.name = "xilinx-zynqmp-dpdma",
|
||||
.of_match_table = xilinx_dpdma_of_match,
|
||||
|
@ -366,7 +366,7 @@ static void zynqmp_dma_init(struct zynqmp_dma_chan *chan)
|
||||
}
|
||||
writel(val, chan->regs + ZYNQMP_DMA_DATA_ATTR);
|
||||
|
||||
/* Clearing the interrupt account rgisters */
|
||||
/* Clearing the interrupt account registers */
|
||||
val = readl(chan->regs + ZYNQMP_DMA_IRQ_SRC_ACCT);
|
||||
val = readl(chan->regs + ZYNQMP_DMA_IRQ_DST_ACCT);
|
||||
|
||||
@ -1192,7 +1192,7 @@ static struct platform_driver zynqmp_dma_driver = {
|
||||
.pm = &zynqmp_dma_dev_pm_ops,
|
||||
},
|
||||
.probe = zynqmp_dma_probe,
|
||||
.remove_new = zynqmp_dma_remove,
|
||||
.remove = zynqmp_dma_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(zynqmp_dma_driver);
|
||||
|
@ -11,10 +11,11 @@
|
||||
#ifndef __LINUX_ACPI_DMA_H
|
||||
#define __LINUX_ACPI_DMA_H
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/dmaengine.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
|
||||
/**
|
||||
* struct acpi_dma_spec - slave device DMA resources
|
||||
@ -65,7 +66,6 @@ int devm_acpi_dma_controller_register(struct device *dev,
|
||||
struct dma_chan *(*acpi_dma_xlate)
|
||||
(struct acpi_dma_spec *, struct acpi_dma *),
|
||||
void *data);
|
||||
void devm_acpi_dma_controller_free(struct device *dev);
|
||||
|
||||
struct dma_chan *acpi_dma_request_slave_chan_by_index(struct device *dev,
|
||||
size_t index);
|
||||
@ -94,9 +94,6 @@ static inline int devm_acpi_dma_controller_register(struct device *dev,
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline void devm_acpi_dma_controller_free(struct device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct dma_chan *acpi_dma_request_slave_chan_by_index(
|
||||
struct device *dev, size_t index)
|
||||
|
@ -2709,9 +2709,6 @@
|
||||
#define PCI_DEVICE_ID_INTEL_82815_MC 0x1130
|
||||
#define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132
|
||||
#define PCI_DEVICE_ID_INTEL_SST_TNG 0x119a
|
||||
#define PCI_DEVICE_ID_INTEL_DSA_GNRD 0x11fb
|
||||
#define PCI_DEVICE_ID_INTEL_DSA_DMR 0x1212
|
||||
#define PCI_DEVICE_ID_INTEL_IAA_DMR 0x1216
|
||||
#define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221
|
||||
#define PCI_DEVICE_ID_INTEL_82437 0x122d
|
||||
#define PCI_DEVICE_ID_INTEL_82371FB_0 0x122e
|
||||
|
Loading…
Reference in New Issue
Block a user