Merge tag 'dmaengine-6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 4 Nov 2023 04:56:51 +0000 (18:56 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 4 Nov 2023 04:56:51 +0000 (18:56 -1000)
Pull dmaengine updates from Vinod Koul:

 - Big pile of __counted_by attribute annotations to several structures
   for bounds checking of flexible arrays at run-time

 - Another big pile platform remove callback returning void changes

 - Device tree device_get_match_data() usage and dropping
   of_match_device() calls

 - Minor driver updates to pxa, idxd fsl, hisi etc drivers

* tag 'dmaengine-6.7-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine: (106 commits)
  dmaengine: stm32-mdma: correct desc prep when channel running
  dmaengine: dw-axi-dmac: Add support DMAX_NUM_CHANNELS > 16
  dmaengine: xilinx: xilinx_dma: Fix kernel doc about xilinx_dma_remove()
  dmaengine: mmp_tdma: drop unused variable 'of_id'
  MAINTAINERS: Add entries for NXP(Freescale) eDMA drivers
  dmaengine: xilinx: xdma: Support cyclic transfers
  dmaengine: xilinx: xdma: Prepare the introduction of cyclic transfers
  dmaengine: Drop unnecessary of_match_device() calls
  dmaengine: Use device_get_match_data()
  dmaengine: pxa_dma: Annotate struct pxad_desc_sw with __counted_by
  dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc()
  dmaengine: xilinx: xdma: Use resource_size() in xdma_probe()
  dmaengine: fsl-dpaa2-qdma: Remove redundant initialization owner in dpaa2_qdma_driver
  dmaengine: Remove unused declaration dma_chan_cleanup()
  dmaengine: mmp: fix Wvoid-pointer-to-enum-cast warning
  dmaengine: qcom: fix Wvoid-pointer-to-enum-cast warning
  dmaengine: fsl-edma: Remove redundant dev_err() for platform_get_irq()
  dmaengine: ep93xx_dma: Annotate struct ep93xx_dma_engine with __counted_by
  dmaengine: idxd: add wq driver name support for accel-config user tool
  dmaengine: fsl-edma: Annotate struct struct fsl_edma_engine with __counted_by
  ...

83 files changed:
Documentation/ABI/stable/sysfs-driver-dma-idxd
Documentation/devicetree/bindings/dma/qcom,gpi.yaml
MAINTAINERS
drivers/dma/Kconfig
drivers/dma/altera-msgdma.c
drivers/dma/apple-admac.c
drivers/dma/at_hdmac.c
drivers/dma/at_xdmac.c
drivers/dma/bcm-sba-raid.c
drivers/dma/bcm2835-dma.c
drivers/dma/bestcomm/bestcomm.c
drivers/dma/dma-axi-dmac.c
drivers/dma/dma-jz4780.c
drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c
drivers/dma/dw-axi-dmac/dw-axi-dmac.h
drivers/dma/dw/platform.c
drivers/dma/ep93xx_dma.c
drivers/dma/fsl-dpaa2-qdma/dpaa2-qdma.c
drivers/dma/fsl-edma-common.h
drivers/dma/fsl-edma-main.c
drivers/dma/fsl-qdma.c
drivers/dma/fsl_raid.c
drivers/dma/fsldma.c
drivers/dma/hisi_dma.c
drivers/dma/idma64.c
drivers/dma/idxd/Makefile
drivers/dma/idxd/cdev.c
drivers/dma/idxd/dma.c
drivers/dma/idxd/idxd.h
drivers/dma/idxd/irq.c
drivers/dma/idxd/sysfs.c
drivers/dma/img-mdc-dma.c
drivers/dma/imx-dma.c
drivers/dma/imx-sdma.c
drivers/dma/k3dma.c
drivers/dma/mcf-edma-main.c
drivers/dma/mediatek/mtk-cqdma.c
drivers/dma/mediatek/mtk-hsdma.c
drivers/dma/mediatek/mtk-uart-apdma.c
drivers/dma/mmp_pdma.c
drivers/dma/mmp_tdma.c
drivers/dma/moxart-dma.c
drivers/dma/mpc512x_dma.c
drivers/dma/mv_xor.c
drivers/dma/mv_xor_v2.c
drivers/dma/nbpfaxi.c
drivers/dma/owl-dma.c
drivers/dma/ppc4xx/adma.c
drivers/dma/pxa_dma.c
drivers/dma/qcom/bam_dma.c
drivers/dma/qcom/hidma.c
drivers/dma/qcom/qcom_adm.c
drivers/dma/sa11x0-dma.c
drivers/dma/sf-pdma/sf-pdma.c
drivers/dma/sf-pdma/sf-pdma.h
drivers/dma/sh/rcar-dmac.c
drivers/dma/sh/rz-dmac.c
drivers/dma/sh/shdmac.c
drivers/dma/sh/usb-dmac.c
drivers/dma/sprd-dma.c
drivers/dma/st_fdma.c
drivers/dma/st_fdma.h
drivers/dma/stm32-dma.c
drivers/dma/stm32-mdma.c
drivers/dma/sun4i-dma.c
drivers/dma/sun6i-dma.c
drivers/dma/tegra186-gpc-dma.c
drivers/dma/tegra20-apb-dma.c
drivers/dma/tegra210-adma.c
drivers/dma/ti/cppi41.c
drivers/dma/ti/edma.c
drivers/dma/ti/omap-dma.c
drivers/dma/timb_dma.c
drivers/dma/txx9dmac.c
drivers/dma/uniphier-xdmac.c
drivers/dma/xgene-dma.c
drivers/dma/xilinx/xdma-regs.h
drivers/dma/xilinx/xdma.c
drivers/dma/xilinx/xilinx_dma.c
drivers/dma/xilinx/xilinx_dpdma.c
drivers/dma/xilinx/zynqmp_dma.c
include/linux/dmaengine.h
include/uapi/linux/idxd.h

index 825e619250bf2ebb77d6c2abc9843414c8b5efd5..f2ec42949a54d7b293541810fec83c7cfa8e26a3 100644 (file)
@@ -270,6 +270,12 @@ Description:       Shows the operation capability bits displayed in bitmap format
                correlates to the operations allowed. It's visible only
                on platforms that support the capability.
 
+What:          /sys/bus/dsa/devices/wq<m>.<n>/driver_name
+Date:          Sept 8, 2023
+KernelVersion: 6.7.0
+Contact:       dmaengine@vger.kernel.org
+Description:   Name of driver to be bounded to the wq.
+
 What:           /sys/bus/dsa/devices/engine<m>.<n>/group_id
 Date:           Oct 25, 2019
 KernelVersion:  5.6.0
index f61145c91b6d41c8aed4eef2fe097bd06ef251ea..88d0de3d1b46b8a9ff56613bd66dd3bf86034e0e 100644 (file)
@@ -69,6 +69,8 @@ properties:
   dma-channel-mask:
     maxItems: 1
 
+  dma-coherent: true
+
 required:
   - compatible
   - reg
index c29c727b33264789b784c413a3b777aad22b830e..62949f372f5db7931fc72cb39028b944c51e3d19 100644 (file)
@@ -8338,6 +8338,14 @@ F:       Documentation/devicetree/bindings/spi/spi-fsl-dspi.txt
 F:     drivers/spi/spi-fsl-dspi.c
 F:     include/linux/spi/spi-fsl-dspi.h
 
+FREESCALE eDMA DRIVER
+M:     Frank Li <Frank.Li@nxp.com>
+L:     imx@lists.linux.dev
+L:     dmaengine@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/dma/fsl,edma.yaml
+F:     drivers/dma/fsl-edma*.*
+
 FREESCALE ENETC ETHERNET DRIVERS
 M:     Claudiu Manoil <claudiu.manoil@nxp.com>
 M:     Vladimir Oltean <vladimir.oltean@nxp.com>
index 4ccae1a3b8842787fd144a79eede2396b00a7b83..70ba506dabab5f7aa9eb95741bd40636d1535c86 100644 (file)
@@ -362,7 +362,7 @@ config INTEL_IOATDMA
 
 config K3_DMA
        tristate "Hisilicon K3 DMA support"
-       depends on ARCH_HI3xxx || ARCH_HISI || COMPILE_TEST
+       depends on ARCH_HISI || COMPILE_TEST
        select DMA_ENGINE
        select DMA_VIRTUAL_CHANNELS
        help
index 4153c2edb04901ea1adbe8ccaedb9cb883db661c..a8e3615235b8edf6a63b19981579b2168ced0cab 100644 (file)
@@ -923,7 +923,7 @@ fail:
  *
  * Return: Always '0'
  */
-static int msgdma_remove(struct platform_device *pdev)
+static void msgdma_remove(struct platform_device *pdev)
 {
        struct msgdma_device *mdev = platform_get_drvdata(pdev);
 
@@ -933,8 +933,6 @@ static int msgdma_remove(struct platform_device *pdev)
        msgdma_dev_remove(mdev);
 
        dev_notice(&pdev->dev, "Altera mSGDMA driver removed\n");
-
-       return 0;
 }
 
 #ifdef CONFIG_OF
@@ -952,7 +950,7 @@ static struct platform_driver msgdma_driver = {
                .of_match_table = of_match_ptr(msgdma_match),
        },
        .probe = msgdma_probe,
-       .remove = msgdma_remove,
+       .remove_new = msgdma_remove,
 };
 
 module_platform_driver(msgdma_driver);
index 3af795635c5ce698e95d91e97b6e07d05afc6736..5b63996640d9d3a210f789a89b6e7ffa054d96e2 100644 (file)
@@ -128,7 +128,7 @@ struct admac_data {
        int irq;
        int irq_index;
        int nchannels;
-       struct admac_chan channels[];
+       struct admac_chan channels[] __counted_by(nchannels);
 };
 
 struct admac_tx {
@@ -925,7 +925,7 @@ free_reset:
        return err;
 }
 
-static int admac_remove(struct platform_device *pdev)
+static void admac_remove(struct platform_device *pdev)
 {
        struct admac_data *ad = platform_get_drvdata(pdev);
 
@@ -933,8 +933,6 @@ static int admac_remove(struct platform_device *pdev)
        dma_async_device_unregister(&ad->dma);
        free_irq(ad->irq, ad);
        reset_control_rearm(ad->rstc);
-
-       return 0;
 }
 
 static const struct of_device_id admac_of_match[] = {
@@ -949,7 +947,7 @@ static struct platform_driver apple_admac_driver = {
                .of_match_table = admac_of_match,
        },
        .probe = admac_probe,
-       .remove = admac_remove,
+       .remove_new = admac_remove,
 };
 module_platform_driver(apple_admac_driver);
 
index b2876f67471fe149b154104f07b38ef93651835a..fb89ecbf0cc5be8ca566eaac6e499f2e2336b625 100644 (file)
@@ -239,7 +239,7 @@ struct at_desc {
        bool                            memset_buffer;
        dma_addr_t                      memset_paddr;
        int                             *memset_vaddr;
-       struct atdma_sg                 sg[];
+       struct atdma_sg                 sg[] __counted_by(sglen);
 };
 
 /*--  Channels  --------------------------------------------------------*/
@@ -2100,7 +2100,7 @@ err_irq:
        return err;
 }
 
-static int at_dma_remove(struct platform_device *pdev)
+static void at_dma_remove(struct platform_device *pdev)
 {
        struct at_dma           *atdma = platform_get_drvdata(pdev);
        struct dma_chan         *chan, *_chan;
@@ -2122,8 +2122,6 @@ static int at_dma_remove(struct platform_device *pdev)
        }
 
        clk_disable_unprepare(atdma->clk);
-
-       return 0;
 }
 
 static void at_dma_shutdown(struct platform_device *pdev)
@@ -2242,7 +2240,7 @@ static const struct dev_pm_ops __maybe_unused at_dma_dev_pm_ops = {
 };
 
 static struct platform_driver at_dma_driver = {
-       .remove         = at_dma_remove,
+       .remove_new     = at_dma_remove,
        .shutdown       = at_dma_shutdown,
        .id_table       = atdma_devtypes,
        .driver = {
index c3b37168b21f166e9690076a1692d965392b37f5..299396121e6dc549e6a6915b681d303fc4fa932b 100644 (file)
@@ -2431,7 +2431,7 @@ err_free_irq:
        return ret;
 }
 
-static int at_xdmac_remove(struct platform_device *pdev)
+static void at_xdmac_remove(struct platform_device *pdev)
 {
        struct at_xdmac *atxdmac = (struct at_xdmac *)platform_get_drvdata(pdev);
        int             i;
@@ -2452,8 +2452,6 @@ static int at_xdmac_remove(struct platform_device *pdev)
                tasklet_kill(&atchan->tasklet);
                at_xdmac_free_chan_resources(&atchan->chan);
        }
-
-       return 0;
 }
 
 static const struct dev_pm_ops __maybe_unused atmel_xdmac_dev_pm_ops = {
@@ -2478,7 +2476,7 @@ MODULE_DEVICE_TABLE(of, atmel_xdmac_dt_ids);
 
 static struct platform_driver at_xdmac_driver = {
        .probe          = at_xdmac_probe,
-       .remove         = at_xdmac_remove,
+       .remove_new     = at_xdmac_remove,
        .driver = {
                .name           = "at_xdmac",
                .of_match_table = of_match_ptr(atmel_xdmac_dt_ids),
index 94ea35330eb5c182f049a06794bb8bd4c4a41185..fbaacb4c19b2bb803c177475a85ec3cbd78b1d89 100644 (file)
@@ -1734,7 +1734,7 @@ fail_free_mchan:
        return ret;
 }
 
-static int sba_remove(struct platform_device *pdev)
+static void sba_remove(struct platform_device *pdev)
 {
        struct sba_device *sba = platform_get_drvdata(pdev);
 
@@ -1745,8 +1745,6 @@ static int sba_remove(struct platform_device *pdev)
        sba_freeup_channel_resources(sba);
 
        mbox_free_channel(sba->mchan);
-
-       return 0;
 }
 
 static const struct of_device_id sba_of_match[] = {
@@ -1758,7 +1756,7 @@ MODULE_DEVICE_TABLE(of, sba_of_match);
 
 static struct platform_driver sba_driver = {
        .probe = sba_probe,
-       .remove = sba_remove,
+       .remove_new = sba_remove,
        .driver = {
                .name = "bcm-sba-raid",
                .of_match_table = sba_of_match,
index 0807fb9eb2626b8cfa358301ee344934ba393ba2..9d74fe97452e08d7f27f3b1b205dc72958ae15be 100644 (file)
@@ -1019,19 +1019,17 @@ err_no_dma:
        return rc;
 }
 
-static int bcm2835_dma_remove(struct platform_device *pdev)
+static void bcm2835_dma_remove(struct platform_device *pdev)
 {
        struct bcm2835_dmadev *od = platform_get_drvdata(pdev);
 
        dma_async_device_unregister(&od->ddev);
        bcm2835_dma_free(od);
-
-       return 0;
 }
 
 static struct platform_driver bcm2835_dma_driver = {
        .probe  = bcm2835_dma_probe,
-       .remove = bcm2835_dma_remove,
+       .remove_new = bcm2835_dma_remove,
        .driver = {
                .name = "bcm2835-dma",
                .of_match_table = of_match_ptr(bcm2835_dma_of_match),
index 80096f94032dc6e4c240f1b0793643b3fa5f4f65..0bbaa7620bdd4ba1f354ec2c69cf95346b12d821 100644 (file)
@@ -455,7 +455,7 @@ error_ofput:
 }
 
 
-static int mpc52xx_bcom_remove(struct platform_device *op)
+static void mpc52xx_bcom_remove(struct platform_device *op)
 {
        /* Clean up the engine */
        bcom_engine_cleanup();
@@ -473,8 +473,6 @@ static int mpc52xx_bcom_remove(struct platform_device *op)
        /* Release memory */
        kfree(bcom_eng);
        bcom_eng = NULL;
-
-       return 0;
 }
 
 static const struct of_device_id mpc52xx_bcom_of_match[] = {
@@ -488,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         = mpc52xx_bcom_remove,
+       .remove_new     = mpc52xx_bcom_remove,
        .driver = {
                .name = DRIVER_NAME,
                .of_match_table = mpc52xx_bcom_of_match,
index fc7cdad371616adfc8422dc382e7cb9c4b3728d0..2457a420c13d72cde2509f6a446269b166b06cdc 100644 (file)
@@ -117,7 +117,7 @@ struct axi_dmac_desc {
        unsigned int num_submitted;
        unsigned int num_completed;
        unsigned int num_sgs;
-       struct axi_dmac_sg sg[];
+       struct axi_dmac_sg sg[] __counted_by(num_sgs);
 };
 
 struct axi_dmac_chan {
@@ -484,12 +484,11 @@ static struct axi_dmac_desc *axi_dmac_alloc_desc(unsigned int num_sgs)
        desc = kzalloc(struct_size(desc, sg, num_sgs), GFP_NOWAIT);
        if (!desc)
                return NULL;
+       desc->num_sgs = num_sgs;
 
        for (i = 0; i < num_sgs; i++)
                desc->sg[i].id = AXI_DMAC_SG_UNUSED;
 
-       desc->num_sgs = num_sgs;
-
        return desc;
 }
 
@@ -1029,7 +1028,7 @@ err_clk_disable:
        return ret;
 }
 
-static int axi_dmac_remove(struct platform_device *pdev)
+static void axi_dmac_remove(struct platform_device *pdev)
 {
        struct axi_dmac *dmac = platform_get_drvdata(pdev);
 
@@ -1038,8 +1037,6 @@ static int axi_dmac_remove(struct platform_device *pdev)
        tasklet_kill(&dmac->chan.vchan.task);
        dma_async_device_unregister(&dmac->dma_dev);
        clk_disable_unprepare(dmac->clk);
-
-       return 0;
 }
 
 static const struct of_device_id axi_dmac_of_match_table[] = {
@@ -1054,7 +1051,7 @@ static struct platform_driver axi_dmac_driver = {
                .of_match_table = axi_dmac_of_match_table,
        },
        .probe = axi_dmac_probe,
-       .remove = axi_dmac_remove,
+       .remove_new = axi_dmac_remove,
 };
 module_platform_driver(axi_dmac_driver);
 
index adbd47bd6adfe4755e2c5a6571c546b9c83896dd..c9cfa341db510381e1b6761c18991ad8b8dc94f7 100644 (file)
@@ -1008,7 +1008,7 @@ err_disable_clk:
        return ret;
 }
 
-static int jz4780_dma_remove(struct platform_device *pdev)
+static void jz4780_dma_remove(struct platform_device *pdev)
 {
        struct jz4780_dma_dev *jzdma = platform_get_drvdata(pdev);
        int i;
@@ -1020,8 +1020,6 @@ static int jz4780_dma_remove(struct platform_device *pdev)
 
        for (i = 0; i < jzdma->soc_data->nb_channels; i++)
                tasklet_kill(&jzdma->chan[i].vchan.task);
-
-       return 0;
 }
 
 static const struct jz4780_dma_soc_data jz4740_dma_soc_data = {
@@ -1124,7 +1122,7 @@ MODULE_DEVICE_TABLE(of, jz4780_dma_dt_match);
 
 static struct platform_driver jz4780_dma_driver = {
        .probe          = jz4780_dma_probe,
-       .remove         = jz4780_dma_remove,
+       .remove_new     = jz4780_dma_remove,
        .driver = {
                .name   = "jz4780-dma",
                .of_match_table = jz4780_dma_dt_match,
index dd02f84e404d08fc3cce669455d79a3879b1fd42..a86a81ff0caa62e7467012a6a273325f5efad5dd 100644 (file)
@@ -62,6 +62,17 @@ static inline u32 axi_dma_ioread32(struct axi_dma_chip *chip, u32 reg)
        return ioread32(chip->regs + reg);
 }
 
+static inline void
+axi_dma_iowrite64(struct axi_dma_chip *chip, u32 reg, u64 val)
+{
+       iowrite64(val, chip->regs + reg);
+}
+
+static inline u64 axi_dma_ioread64(struct axi_dma_chip *chip, u32 reg)
+{
+       return ioread64(chip->regs + reg);
+}
+
 static inline void
 axi_chan_iowrite32(struct axi_dma_chan *chan, u32 reg, u32 val)
 {
@@ -182,38 +193,73 @@ static inline u32 axi_chan_irq_read(struct axi_dma_chan *chan)
 
 static inline void axi_chan_disable(struct axi_dma_chan *chan)
 {
-       u32 val;
-
-       val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
-       val &= ~(BIT(chan->id) << DMAC_CHAN_EN_SHIFT);
-       if (chan->chip->dw->hdata->reg_map_8_channels)
-               val |=   BIT(chan->id) << DMAC_CHAN_EN_WE_SHIFT;
-       else
-               val |=   BIT(chan->id) << DMAC_CHAN_EN2_WE_SHIFT;
-       axi_dma_iowrite32(chan->chip, DMAC_CHEN, val);
+       u64 val;
+
+       if (chan->chip->dw->hdata->nr_channels >= DMAC_CHAN_16) {
+               val = axi_dma_ioread64(chan->chip, DMAC_CHEN);
+               if (chan->id >= DMAC_CHAN_16) {
+                       val &= ~((u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_EN_SHIFT + DMAC_CHAN_BLOCK_SHIFT));
+                       val |=   (u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_EN2_WE_SHIFT + DMAC_CHAN_BLOCK_SHIFT);
+               } else {
+                       val &= ~(BIT(chan->id) << DMAC_CHAN_EN_SHIFT);
+                       val |=   BIT(chan->id) << DMAC_CHAN_EN2_WE_SHIFT;
+               }
+               axi_dma_iowrite64(chan->chip, DMAC_CHEN, val);
+       } else {
+               val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
+               val &= ~(BIT(chan->id) << DMAC_CHAN_EN_SHIFT);
+               if (chan->chip->dw->hdata->reg_map_8_channels)
+                       val |=   BIT(chan->id) << DMAC_CHAN_EN_WE_SHIFT;
+               else
+                       val |=   BIT(chan->id) << DMAC_CHAN_EN2_WE_SHIFT;
+               axi_dma_iowrite32(chan->chip, DMAC_CHEN, (u32)val);
+       }
 }
 
 static inline void axi_chan_enable(struct axi_dma_chan *chan)
 {
-       u32 val;
-
-       val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
-       if (chan->chip->dw->hdata->reg_map_8_channels)
-               val |= BIT(chan->id) << DMAC_CHAN_EN_SHIFT |
-                       BIT(chan->id) << DMAC_CHAN_EN_WE_SHIFT;
-       else
-               val |= BIT(chan->id) << DMAC_CHAN_EN_SHIFT |
+       u64 val;
+
+       if (chan->chip->dw->hdata->nr_channels >= DMAC_CHAN_16) {
+               val = axi_dma_ioread64(chan->chip, DMAC_CHEN);
+               if (chan->id >= DMAC_CHAN_16) {
+                       val |= (u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_EN_SHIFT + DMAC_CHAN_BLOCK_SHIFT) |
+                               (u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_EN2_WE_SHIFT + DMAC_CHAN_BLOCK_SHIFT);
+               } else {
+                       val |= BIT(chan->id) << DMAC_CHAN_EN_SHIFT |
                        BIT(chan->id) << DMAC_CHAN_EN2_WE_SHIFT;
-       axi_dma_iowrite32(chan->chip, DMAC_CHEN, val);
+               }
+               axi_dma_iowrite64(chan->chip, DMAC_CHEN, val);
+       } else {
+               val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
+               if (chan->chip->dw->hdata->reg_map_8_channels) {
+                       val |= BIT(chan->id) << DMAC_CHAN_EN_SHIFT |
+                       BIT(chan->id) << DMAC_CHAN_EN_WE_SHIFT;
+               } else {
+                       val |= BIT(chan->id) << DMAC_CHAN_EN_SHIFT |
+                               BIT(chan->id) << DMAC_CHAN_EN2_WE_SHIFT;
+               }
+               axi_dma_iowrite32(chan->chip, DMAC_CHEN, (u32)val);
+       }
 }
 
 static inline bool axi_chan_is_hw_enable(struct axi_dma_chan *chan)
 {
-       u32 val;
+       u64 val;
 
-       val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
+       if (chan->chip->dw->hdata->nr_channels >= DMAC_CHAN_16)
+               val = axi_dma_ioread64(chan->chip, DMAC_CHEN);
+       else
+               val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
 
-       return !!(val & (BIT(chan->id) << DMAC_CHAN_EN_SHIFT));
+       if (chan->id >= DMAC_CHAN_16)
+               return !!(val & ((u64)(BIT(chan->id) >> DMAC_CHAN_16) << DMAC_CHAN_BLOCK_SHIFT));
+       else
+               return !!(val & (BIT(chan->id) << DMAC_CHAN_EN_SHIFT));
 }
 
 static void axi_dma_hw_init(struct axi_dma_chip *chip)
@@ -1175,20 +1221,34 @@ static int dma_chan_pause(struct dma_chan *dchan)
        struct axi_dma_chan *chan = dchan_to_axi_dma_chan(dchan);
        unsigned long flags;
        unsigned int timeout = 20; /* timeout iterations */
-       u32 val;
+       u64 val;
 
        spin_lock_irqsave(&chan->vc.lock, flags);
 
-       if (chan->chip->dw->hdata->reg_map_8_channels) {
-               val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
-               val |= BIT(chan->id) << DMAC_CHAN_SUSP_SHIFT |
-                       BIT(chan->id) << DMAC_CHAN_SUSP_WE_SHIFT;
-               axi_dma_iowrite32(chan->chip, DMAC_CHEN, val);
+       if (chan->chip->dw->hdata->nr_channels >= DMAC_CHAN_16) {
+               val = axi_dma_ioread64(chan->chip, DMAC_CHSUSPREG);
+               if (chan->id >= DMAC_CHAN_16) {
+                       val |= (u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_SUSP2_SHIFT + DMAC_CHAN_BLOCK_SHIFT) |
+                               (u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_SUSP2_WE_SHIFT + DMAC_CHAN_BLOCK_SHIFT);
+               } else {
+                       val |= BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT |
+                              BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT;
+                       }
+                       axi_dma_iowrite64(chan->chip, DMAC_CHSUSPREG, val);
        } else {
-               val = axi_dma_ioread32(chan->chip, DMAC_CHSUSPREG);
-               val |= BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT |
+               if (chan->chip->dw->hdata->reg_map_8_channels) {
+                       val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
+                       val |= BIT(chan->id) << DMAC_CHAN_SUSP_SHIFT |
+                       BIT(chan->id) << DMAC_CHAN_SUSP_WE_SHIFT;
+                       axi_dma_iowrite32(chan->chip, DMAC_CHEN, (u32)val);
+               } else {
+                       val = axi_dma_ioread32(chan->chip, DMAC_CHSUSPREG);
+                       val |= BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT |
                        BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT;
-               axi_dma_iowrite32(chan->chip, DMAC_CHSUSPREG, val);
+                       axi_dma_iowrite32(chan->chip, DMAC_CHSUSPREG, (u32)val);
+               }
        }
 
        do  {
@@ -1210,18 +1270,32 @@ static int dma_chan_pause(struct dma_chan *dchan)
 /* Called in chan locked context */
 static inline void axi_chan_resume(struct axi_dma_chan *chan)
 {
-       u32 val;
-
-       if (chan->chip->dw->hdata->reg_map_8_channels) {
-               val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
-               val &= ~(BIT(chan->id) << DMAC_CHAN_SUSP_SHIFT);
-               val |=  (BIT(chan->id) << DMAC_CHAN_SUSP_WE_SHIFT);
-               axi_dma_iowrite32(chan->chip, DMAC_CHEN, val);
+       u64 val;
+
+       if (chan->chip->dw->hdata->nr_channels >= DMAC_CHAN_16) {
+               val = axi_dma_ioread64(chan->chip, DMAC_CHSUSPREG);
+               if (chan->id >= DMAC_CHAN_16) {
+                       val &= ~((u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_SUSP2_SHIFT + DMAC_CHAN_BLOCK_SHIFT));
+                       val |=  ((u64)(BIT(chan->id) >> DMAC_CHAN_16)
+                               << (DMAC_CHAN_SUSP2_WE_SHIFT + DMAC_CHAN_BLOCK_SHIFT));
+               } else {
+                       val &= ~(BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT);
+                       val |=  (BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT);
+               }
+                       axi_dma_iowrite64(chan->chip, DMAC_CHSUSPREG, val);
        } else {
-               val = axi_dma_ioread32(chan->chip, DMAC_CHSUSPREG);
-               val &= ~(BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT);
-               val |=  (BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT);
-               axi_dma_iowrite32(chan->chip, DMAC_CHSUSPREG, val);
+               if (chan->chip->dw->hdata->reg_map_8_channels) {
+                       val = axi_dma_ioread32(chan->chip, DMAC_CHEN);
+                       val &= ~(BIT(chan->id) << DMAC_CHAN_SUSP_SHIFT);
+                       val |=  (BIT(chan->id) << DMAC_CHAN_SUSP_WE_SHIFT);
+                       axi_dma_iowrite32(chan->chip, DMAC_CHEN, (u32)val);
+               } else {
+                       val = axi_dma_ioread32(chan->chip, DMAC_CHSUSPREG);
+                       val &= ~(BIT(chan->id) << DMAC_CHAN_SUSP2_SHIFT);
+                       val |=  (BIT(chan->id) << DMAC_CHAN_SUSP2_WE_SHIFT);
+                       axi_dma_iowrite32(chan->chip, DMAC_CHSUSPREG, (u32)val);
+               }
        }
 
        chan->is_paused = false;
@@ -1535,7 +1609,7 @@ err_pm_disable:
        return ret;
 }
 
-static int dw_remove(struct platform_device *pdev)
+static void dw_remove(struct platform_device *pdev)
 {
        struct axi_dma_chip *chip = platform_get_drvdata(pdev);
        struct dw_axi_dma *dw = chip->dw;
@@ -1564,8 +1638,6 @@ static int dw_remove(struct platform_device *pdev)
                list_del(&chan->vc.chan.device_node);
                tasklet_kill(&chan->vc.task);
        }
-
-       return 0;
 }
 
 static const struct dev_pm_ops dw_axi_dma_pm_ops = {
@@ -1588,7 +1660,7 @@ MODULE_DEVICE_TABLE(of, dw_dma_of_id_table);
 
 static struct platform_driver dw_driver = {
        .probe          = dw_probe,
-       .remove         = dw_remove,
+       .remove_new     = dw_remove,
        .driver = {
                .name   = KBUILD_MODNAME,
                .of_match_table = dw_dma_of_id_table,
index eb267cb24f6702808f812da0b1a06c9188b3889b..454904d996540c4725c19b93b67f5d0ef8fb6f7c 100644 (file)
@@ -18,7 +18,7 @@
 
 #include "../virt-dma.h"
 
-#define DMAC_MAX_CHANNELS      16
+#define DMAC_MAX_CHANNELS      32
 #define DMAC_MAX_MASTERS       2
 #define DMAC_MAX_BLK_SIZE      0x200000
 
@@ -222,6 +222,10 @@ static inline struct axi_dma_chan *dchan_to_axi_dma_chan(struct dma_chan *dchan)
 /* DMAC_CHEN2 */
 #define DMAC_CHAN_EN2_WE_SHIFT         16
 
+/* DMAC CHAN BLOCKS */
+#define DMAC_CHAN_BLOCK_SHIFT          32
+#define DMAC_CHAN_16                   16
+
 /* DMAC_CHSUSP */
 #define DMAC_CHAN_SUSP2_SHIFT          0
 #define DMAC_CHAN_SUSP2_WE_SHIFT       16
index 47f2292dba983e920f3f799d8c47ed7726eae470..7d9d4c951724b1d36bb991ac76ef98a4924dd127 100644 (file)
@@ -93,7 +93,7 @@ err_dw_dma_probe:
        return err;
 }
 
-static int dw_remove(struct platform_device *pdev)
+static void dw_remove(struct platform_device *pdev)
 {
        struct dw_dma_chip_pdata *data = platform_get_drvdata(pdev);
        struct dw_dma_chip *chip = data->chip;
@@ -109,8 +109,6 @@ static int dw_remove(struct platform_device *pdev)
 
        pm_runtime_disable(&pdev->dev);
        clk_disable_unprepare(chip->clk);
-
-       return 0;
 }
 
 static void dw_shutdown(struct platform_device *pdev)
@@ -193,7 +191,7 @@ static const struct dev_pm_ops dw_dev_pm_ops = {
 
 static struct platform_driver dw_driver = {
        .probe          = dw_probe,
-       .remove         = dw_remove,
+       .remove_new     = dw_remove,
        .shutdown       = dw_shutdown,
        .driver = {
                .name   = DRV_NAME,
index 5c4a448a12541ad2ceab2651f22cc2acec53b23f..d6c60635e90db9033386d01468d75e5c380900f3 100644 (file)
@@ -213,7 +213,7 @@ struct ep93xx_dma_engine {
 #define INTERRUPT_NEXT_BUFFER  2
 
        size_t                  num_channels;
-       struct ep93xx_dma_chan  channels[];
+       struct ep93xx_dma_chan  channels[] __counted_by(num_channels);
 };
 
 static inline struct device *chan2dev(struct ep93xx_dma_chan *edmac)
index a42a37634881b29f1184000d066edd404841188a..7958ac33e36ce3fab462d33161fea8dabe0ee215 100644 (file)
@@ -814,7 +814,6 @@ static const struct fsl_mc_device_id dpaa2_qdma_id_table[] = {
 static struct fsl_mc_driver dpaa2_qdma_driver = {
        .driver         = {
                .name   = "dpaa2-qdma",
-               .owner  = THIS_MODULE,
        },
        .probe          = dpaa2_qdma_probe,
        .remove         = dpaa2_qdma_remove,
index 40d50cc3d75a346100a58a64c510039dc9ee60a9..bb5221158a7702379322392a46a1ebfb4de0f476 100644 (file)
@@ -225,7 +225,7 @@ struct fsl_edma_engine {
        bool                    big_endian;
        struct edma_regs        regs;
        u64                     chan_masked;
-       struct fsl_edma_chan    chans[];
+       struct fsl_edma_chan    chans[] __counted_by(n_chans);
 };
 
 #define edma_read_tcdreg(chan, __name)                         \
index 8c4ed7012e232e3997453d1923722a4286b434ba..4635e16d7705e9036d644d95159bee216415fff6 100644 (file)
 #include <linux/interrupt.h>
 #include <linux/clk.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/of_address.h>
-#include <linux/of_irq.h>
 #include <linux/of_dma.h>
 #include <linux/dma-mapping.h>
 #include <linux/pm_runtime.h>
 #include <linux/pm_domain.h>
+#include <linux/property.h>
 
 #include "fsl-edma-common.h"
 
@@ -232,10 +230,8 @@ static int fsl_edma3_irq_init(struct platform_device *pdev, struct fsl_edma_engi
 
                /* request channel irq */
                fsl_chan->txirq = platform_get_irq(pdev, i);
-               if (fsl_chan->txirq < 0) {
-                       dev_err(&pdev->dev, "Can't get chan %d's irq.\n", i);
+               if (fsl_chan->txirq < 0)
                        return  -EINVAL;
-               }
 
                ret = devm_request_irq(&pdev->dev, fsl_chan->txirq,
                        fsl_edma3_tx_handler, IRQF_SHARED,
@@ -418,8 +414,6 @@ static int fsl_edma3_attach_pd(struct platform_device *pdev, struct fsl_edma_eng
 
 static int fsl_edma_probe(struct platform_device *pdev)
 {
-       const struct of_device_id *of_id =
-                       of_match_device(fsl_edma_dt_ids, &pdev->dev);
        struct device_node *np = pdev->dev.of_node;
        struct fsl_edma_engine *fsl_edma;
        const struct fsl_edma_drvdata *drvdata = NULL;
@@ -428,8 +422,7 @@ static int fsl_edma_probe(struct platform_device *pdev)
        int chans;
        int ret, i;
 
-       if (of_id)
-               drvdata = of_id->data;
+       drvdata = device_get_match_data(&pdev->dev);
        if (!drvdata) {
                dev_err(&pdev->dev, "unable to find driver data\n");
                return -EINVAL;
@@ -617,7 +610,7 @@ static int fsl_edma_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int fsl_edma_remove(struct platform_device *pdev)
+static void fsl_edma_remove(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct fsl_edma_engine *fsl_edma = platform_get_drvdata(pdev);
@@ -627,8 +620,6 @@ static int fsl_edma_remove(struct platform_device *pdev)
        of_dma_controller_free(np);
        dma_async_device_unregister(&fsl_edma->dma_dev);
        fsl_disable_clocks(fsl_edma, fsl_edma->drvdata->dmamuxs);
-
-       return 0;
 }
 
 static int fsl_edma_suspend_late(struct device *dev)
@@ -692,7 +683,7 @@ static struct platform_driver fsl_edma_driver = {
                .pm     = &fsl_edma_pm_ops,
        },
        .probe          = fsl_edma_probe,
-       .remove         = fsl_edma_remove,
+       .remove_new     = fsl_edma_remove,
 };
 
 static int __init fsl_edma_init(void)
index a8cc8a4bc6102c4b94ae08693de596d8597cf832..47cb284680494cc842141c3c680a617a424d5669 100644 (file)
@@ -1266,7 +1266,7 @@ static void fsl_qdma_cleanup_vchan(struct dma_device *dmadev)
        }
 }
 
-static int fsl_qdma_remove(struct platform_device *pdev)
+static void fsl_qdma_remove(struct platform_device *pdev)
 {
        int i;
        struct fsl_qdma_queue *status;
@@ -1283,7 +1283,6 @@ static int fsl_qdma_remove(struct platform_device *pdev)
                dma_free_coherent(&pdev->dev, sizeof(struct fsl_qdma_format) *
                                status->n_cq, status->cq, status->bus_addr);
        }
-       return 0;
 }
 
 static const struct of_device_id fsl_qdma_dt_ids[] = {
@@ -1298,7 +1297,7 @@ static struct platform_driver fsl_qdma_driver = {
                .of_match_table = fsl_qdma_dt_ids,
        },
        .probe          = fsl_qdma_probe,
-       .remove         = fsl_qdma_remove,
+       .remove_new     = fsl_qdma_remove,
 };
 
 module_platform_driver(fsl_qdma_driver);
index 0b9ca93ce3dca72addb8e82a439c227c9d672311..014ff523d5ec9046c389a1aa66f2d466a6c86348 100644 (file)
@@ -857,7 +857,7 @@ static void fsl_re_remove_chan(struct fsl_re_chan *chan)
                      chan->oub_phys_addr);
 }
 
-static int fsl_re_remove(struct platform_device *ofdev)
+static void fsl_re_remove(struct platform_device *ofdev)
 {
        struct fsl_re_drv_private *re_priv;
        struct device *dev;
@@ -872,8 +872,6 @@ static int fsl_re_remove(struct platform_device *ofdev)
 
        /* Unregister the driver */
        dma_async_device_unregister(&re_priv->dma_dev);
-
-       return 0;
 }
 
 static const struct of_device_id fsl_re_ids[] = {
@@ -888,7 +886,7 @@ static struct platform_driver fsl_re_driver = {
                .of_match_table = fsl_re_ids,
        },
        .probe = fsl_re_probe,
-       .remove = fsl_re_remove,
+       .remove_new = fsl_re_remove,
 };
 
 module_platform_driver(fsl_re_driver);
index ddcf736d283d8775f14d5b509042053cdda2bb02..18a6c4bf6275c48ecb438c6a7d1f685fe4236af4 100644 (file)
@@ -1306,7 +1306,7 @@ out_return:
        return err;
 }
 
-static int fsldma_of_remove(struct platform_device *op)
+static void fsldma_of_remove(struct platform_device *op)
 {
        struct fsldma_device *fdev;
        unsigned int i;
@@ -1324,8 +1324,6 @@ static int fsldma_of_remove(struct platform_device *op)
 
        iounmap(fdev->regs);
        kfree(fdev);
-
-       return 0;
 }
 
 #ifdef CONFIG_PM
@@ -1406,7 +1404,7 @@ static struct platform_driver fsldma_of_driver = {
 #endif
        },
        .probe = fsldma_of_probe,
-       .remove = fsldma_of_remove,
+       .remove_new = fsldma_of_remove,
 };
 
 /*----------------------------------------------------------------------------*/
index c1350a36fddd995c3144176b91affb5f87350ff5..4c47bff81064015a9f737eb8dfff632ae8386d56 100644 (file)
@@ -163,7 +163,7 @@ struct hisi_dma_dev {
        u32 chan_depth;
        enum hisi_dma_reg_layout reg_layout;
        void __iomem *queue_base; /* queue region start of register */
-       struct hisi_dma_chan chan[];
+       struct hisi_dma_chan chan[] __counted_by(chan_num);
 };
 
 #ifdef CONFIG_DEBUG_FS
index 0ac634a51c5e35aa8b077c750f87a5098736602c..78a938969d7d76f513885d3c749392399f367256 100644 (file)
@@ -660,13 +660,11 @@ static int idma64_platform_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int idma64_platform_remove(struct platform_device *pdev)
+static void idma64_platform_remove(struct platform_device *pdev)
 {
        struct idma64_chip *chip = platform_get_drvdata(pdev);
 
        idma64_remove(chip);
-
-       return 0;
 }
 
 static int __maybe_unused idma64_pm_suspend(struct device *dev)
@@ -691,7 +689,7 @@ static const struct dev_pm_ops idma64_dev_pm_ops = {
 
 static struct platform_driver idma64_platform_driver = {
        .probe          = idma64_platform_probe,
-       .remove         = idma64_platform_remove,
+       .remove_new     = idma64_platform_remove,
        .driver = {
                .name   = LPSS_IDMA64_DRIVER_NAME,
                .pm     = &idma64_dev_pm_ops,
index dc096839ac63749e36665e248e356700559f417e..c5e679070e4633ba48a21f3be68dccca45a61383 100644 (file)
@@ -1,12 +1,12 @@
 ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=IDXD
 
+obj-$(CONFIG_INTEL_IDXD_BUS) += idxd_bus.o
+idxd_bus-y := bus.o
+
 obj-$(CONFIG_INTEL_IDXD) += idxd.o
 idxd-y := init.o irq.o device.o sysfs.o submit.o dma.o cdev.o debugfs.o
 
 idxd-$(CONFIG_INTEL_IDXD_PERFMON) += perfmon.o
 
-obj-$(CONFIG_INTEL_IDXD_BUS) += idxd_bus.o
-idxd_bus-y := bus.o
-
 obj-$(CONFIG_INTEL_IDXD_COMPAT) += idxd_compat.o
 idxd_compat-y := compat.o
index d32deb9b4e3dee466fd056230596aa42198d8285..0423655f5a88045e2f02119f2bd112f203b011a3 100644 (file)
@@ -509,6 +509,7 @@ void idxd_wq_del_cdev(struct idxd_wq *wq)
 
 static int idxd_user_drv_probe(struct idxd_dev *idxd_dev)
 {
+       struct device *dev = &idxd_dev->conf_dev;
        struct idxd_wq *wq = idxd_dev_to_wq(idxd_dev);
        struct idxd_device *idxd = wq->idxd;
        int rc;
@@ -536,6 +537,12 @@ static int idxd_user_drv_probe(struct idxd_dev *idxd_dev)
 
        mutex_lock(&wq->wq_lock);
 
+       if (!idxd_wq_driver_name_match(wq, dev)) {
+               idxd->cmd_status = IDXD_SCMD_WQ_NO_DRV_NAME;
+               rc = -ENODEV;
+               goto wq_err;
+       }
+
        wq->wq = create_workqueue(dev_name(wq_confdev(wq)));
        if (!wq->wq) {
                rc = -ENOMEM;
index 07623fb0f52fc2bb160224ecf5d0dc0e625e2b00..47a01893cfdbf9667ae62d9cbe934350135b8285 100644 (file)
@@ -306,6 +306,12 @@ static int idxd_dmaengine_drv_probe(struct idxd_dev *idxd_dev)
                return -ENXIO;
 
        mutex_lock(&wq->wq_lock);
+       if (!idxd_wq_driver_name_match(wq, dev)) {
+               idxd->cmd_status = IDXD_SCMD_WQ_NO_DRV_NAME;
+               rc = -ENODEV;
+               goto err;
+       }
+
        wq->type = IDXD_WQT_KERNEL;
 
        rc = drv_enable_wq(wq);
index e269ca1f48625513fb03df0f678919db5ccc3c48..1e89c80a07fc25f2ba9dee61743ccd12cc483052 100644 (file)
@@ -159,6 +159,8 @@ struct idxd_cdev {
        int minor;
 };
 
+#define DRIVER_NAME_SIZE               128
+
 #define IDXD_ALLOCATED_BATCH_SIZE      128U
 #define WQ_NAME_SIZE   1024
 #define WQ_TYPE_SIZE   10
@@ -227,6 +229,8 @@ struct idxd_wq {
        /* Lock to protect upasid_xa access. */
        struct mutex uc_lock;
        struct xarray upasid_xa;
+
+       char driver_name[DRIVER_NAME_SIZE + 1];
 };
 
 struct idxd_engine {
@@ -646,6 +650,11 @@ static inline void idxd_wqcfg_set_max_batch_shift(int idxd_type, union wqcfg *wq
                wqcfg->max_batch_shift = max_batch_shift;
 }
 
+static inline int idxd_wq_driver_name_match(struct idxd_wq *wq, struct device *dev)
+{
+       return (strncmp(wq->driver_name, dev->driver->name, strlen(dev->driver->name)) == 0);
+}
+
 int __must_check __idxd_driver_register(struct idxd_device_driver *idxd_drv,
                                        struct module *module, const char *mod_name);
 #define idxd_driver_register(driver) \
index b501320a9c7ad06f52ae6202c45968605d084405..2183d7f9cdbdde9fcc9033003dad5144af09eeb7 100644 (file)
@@ -434,8 +434,8 @@ irqreturn_t idxd_misc_thread(int vec, void *data)
                val |= IDXD_INTC_ERR;
 
                for (i = 0; i < 4; i++)
-                       dev_warn(dev, "err[%d]: %#16.16llx\n",
-                                i, idxd->sw_err.bits[i]);
+                       dev_warn_ratelimited(dev, "err[%d]: %#16.16llx\n",
+                                            i, idxd->sw_err.bits[i]);
                err = true;
        }
 
index 7caba90d85b31e2d2519e7ff564f2c106e51ccc2..523ae0dff7d4aaafe80998b65de1eddecc4fcd76 100644 (file)
@@ -1259,6 +1259,39 @@ err:
 static struct device_attribute dev_attr_wq_op_config =
                __ATTR(op_config, 0644, wq_op_config_show, wq_op_config_store);
 
+static ssize_t wq_driver_name_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+       struct idxd_wq *wq = confdev_to_wq(dev);
+
+       return sysfs_emit(buf, "%s\n", wq->driver_name);
+}
+
+static ssize_t wq_driver_name_store(struct device *dev, struct device_attribute *attr,
+                                   const char *buf, size_t count)
+{
+       struct idxd_wq *wq = confdev_to_wq(dev);
+       char *input, *pos;
+
+       if (wq->state != IDXD_WQ_DISABLED)
+               return -EPERM;
+
+       if (strlen(buf) > DRIVER_NAME_SIZE || strlen(buf) == 0)
+               return -EINVAL;
+
+       input = kstrndup(buf, count, GFP_KERNEL);
+       if (!input)
+               return -ENOMEM;
+
+       pos = strim(input);
+       memset(wq->driver_name, 0, DRIVER_NAME_SIZE + 1);
+       sprintf(wq->driver_name, "%s", pos);
+       kfree(input);
+       return count;
+}
+
+static struct device_attribute dev_attr_wq_driver_name =
+               __ATTR(driver_name, 0644, wq_driver_name_show, wq_driver_name_store);
+
 static struct attribute *idxd_wq_attributes[] = {
        &dev_attr_wq_clients.attr,
        &dev_attr_wq_state.attr,
@@ -1278,6 +1311,7 @@ static struct attribute *idxd_wq_attributes[] = {
        &dev_attr_wq_occupancy.attr,
        &dev_attr_wq_enqcmds_retries.attr,
        &dev_attr_wq_op_config.attr,
+       &dev_attr_wq_driver_name.attr,
        NULL,
 };
 
index 9be0d3226e1992463e4920447c445ef103064e8f..0532dd2640dce309a72a2c50414d38c05be33299 100644 (file)
@@ -1017,7 +1017,7 @@ suspend:
        return ret;
 }
 
-static int mdc_dma_remove(struct platform_device *pdev)
+static void mdc_dma_remove(struct platform_device *pdev)
 {
        struct mdc_dma *mdma = platform_get_drvdata(pdev);
        struct mdc_chan *mchan, *next;
@@ -1037,8 +1037,6 @@ static int mdc_dma_remove(struct platform_device *pdev)
        pm_runtime_disable(&pdev->dev);
        if (!pm_runtime_status_suspended(&pdev->dev))
                img_mdc_runtime_suspend(&pdev->dev);
-
-       return 0;
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -1078,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 = mdc_dma_remove,
+       .remove_new = mdc_dma_remove,
 };
 module_platform_driver(mdc_dma_driver);
 
index 114f254b9f5057c290608c2b168535f3058ac55f..ebf7c115d5534460cffb99209b2c8740bb8ee008 100644 (file)
@@ -1216,7 +1216,7 @@ static void imxdma_free_irq(struct platform_device *pdev, struct imxdma_engine *
        }
 }
 
-static int imxdma_remove(struct platform_device *pdev)
+static void imxdma_remove(struct platform_device *pdev)
 {
        struct imxdma_engine *imxdma = platform_get_drvdata(pdev);
 
@@ -1229,8 +1229,6 @@ static int imxdma_remove(struct platform_device *pdev)
 
        clk_disable_unprepare(imxdma->dma_ipg);
        clk_disable_unprepare(imxdma->dma_ahb);
-
-        return 0;
 }
 
 static struct platform_driver imxdma_driver = {
@@ -1238,7 +1236,7 @@ static struct platform_driver imxdma_driver = {
                .name   = "imx-dma",
                .of_match_table = imx_dma_of_dev_id,
        },
-       .remove         = imxdma_remove,
+       .remove_new     = imxdma_remove,
 };
 
 static int __init imxdma_module_init(void)
index 51012bd399002d7fc45820a84321d12817efe389..f81ecf5863e86ec00190f986e64f129cc8a3dac7 100644 (file)
@@ -2358,7 +2358,7 @@ err_clk:
        return ret;
 }
 
-static int sdma_remove(struct platform_device *pdev)
+static void sdma_remove(struct platform_device *pdev)
 {
        struct sdma_engine *sdma = platform_get_drvdata(pdev);
        int i;
@@ -2377,7 +2377,6 @@ static int sdma_remove(struct platform_device *pdev)
        }
 
        platform_set_drvdata(pdev, NULL);
-       return 0;
 }
 
 static struct platform_driver sdma_driver = {
@@ -2385,7 +2384,7 @@ static struct platform_driver sdma_driver = {
                .name   = "imx-sdma",
                .of_match_table = sdma_dt_ids,
        },
-       .remove         = sdma_remove,
+       .remove_new     = sdma_remove,
        .probe          = sdma_probe,
 };
 
index ecdaada951205954d114b597851f9692b47f8f41..5de8c21d41e7d3b0cf40845a5056f7c3c80a670a 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/platform_device.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
-#include <linux/of_device.h>
 #include <linux/of.h>
 #include <linux/clk.h>
 #include <linux/of_dma.h>
@@ -839,7 +838,6 @@ static int k3_dma_probe(struct platform_device *op)
 {
        const struct k3dma_soc_data *soc_data;
        struct k3_dma_dev *d;
-       const struct of_device_id *of_id;
        int i, ret, irq = 0;
 
        d = devm_kzalloc(&op->dev, sizeof(*d), GFP_KERNEL);
@@ -854,19 +852,16 @@ static int k3_dma_probe(struct platform_device *op)
        if (IS_ERR(d->base))
                return PTR_ERR(d->base);
 
-       of_id = of_match_device(k3_pdma_dt_ids, &op->dev);
-       if (of_id) {
-               of_property_read_u32((&op->dev)->of_node,
-                               "dma-channels", &d->dma_channels);
-               of_property_read_u32((&op->dev)->of_node,
-                               "dma-requests", &d->dma_requests);
-               ret = of_property_read_u32((&op->dev)->of_node,
-                               "dma-channel-mask", &d->dma_channel_mask);
-               if (ret) {
-                       dev_warn(&op->dev,
-                                "dma-channel-mask doesn't exist, considering all as available.\n");
-                       d->dma_channel_mask = (u32)~0UL;
-               }
+       of_property_read_u32((&op->dev)->of_node,
+                       "dma-channels", &d->dma_channels);
+       of_property_read_u32((&op->dev)->of_node,
+                       "dma-requests", &d->dma_requests);
+       ret = of_property_read_u32((&op->dev)->of_node,
+                       "dma-channel-mask", &d->dma_channel_mask);
+       if (ret) {
+               dev_warn(&op->dev,
+                        "dma-channel-mask doesn't exist, considering all as available.\n");
+               d->dma_channel_mask = (u32)~0UL;
        }
 
        if (!(soc_data->flags & K3_FLAG_NOCLK)) {
@@ -974,7 +969,7 @@ dma_async_register_fail:
        return ret;
 }
 
-static int k3_dma_remove(struct platform_device *op)
+static void k3_dma_remove(struct platform_device *op)
 {
        struct k3_dma_chan *c, *cn;
        struct k3_dma_dev *d = platform_get_drvdata(op);
@@ -990,7 +985,6 @@ static int k3_dma_remove(struct platform_device *op)
        }
        tasklet_kill(&d->task);
        clk_disable_unprepare(d->clk);
-       return 0;
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -1034,7 +1028,7 @@ static struct platform_driver k3_pdma_driver = {
                .of_match_table = k3_pdma_dt_ids,
        },
        .probe          = k3_dma_probe,
-       .remove         = k3_dma_remove,
+       .remove_new     = k3_dma_remove,
 };
 
 module_platform_driver(k3_pdma_driver);
index b359421ee9ea52e2a31e786a6c0d59f4551be5b3..ab21455d9c3a48a865c2338e30eeb6e5ec1f7875 100644 (file)
@@ -255,15 +255,13 @@ static int mcf_edma_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int mcf_edma_remove(struct platform_device *pdev)
+static void mcf_edma_remove(struct platform_device *pdev)
 {
        struct fsl_edma_engine *mcf_edma = platform_get_drvdata(pdev);
 
        mcf_edma_irq_free(pdev, mcf_edma);
        fsl_edma_cleanup_vchan(&mcf_edma->dma_dev);
        dma_async_device_unregister(&mcf_edma->dma_dev);
-
-       return 0;
 }
 
 static struct platform_driver mcf_edma_driver = {
@@ -271,7 +269,7 @@ static struct platform_driver mcf_edma_driver = {
                .name   = "mcf-edma",
        },
        .probe          = mcf_edma_probe,
-       .remove         = mcf_edma_remove,
+       .remove_new     = mcf_edma_remove,
 };
 
 bool mcf_edma_filter_fn(struct dma_chan *chan, void *param)
index 324b7387b1b922d3528a2de9e38fbecac2d97d00..529100c5b9f5d2652e41ec0d68fe93efce499c2b 100644 (file)
@@ -885,7 +885,7 @@ err_unregister:
        return err;
 }
 
-static int mtk_cqdma_remove(struct platform_device *pdev)
+static void mtk_cqdma_remove(struct platform_device *pdev)
 {
        struct mtk_cqdma_device *cqdma = platform_get_drvdata(pdev);
        struct mtk_cqdma_vchan *vc;
@@ -918,13 +918,11 @@ static int mtk_cqdma_remove(struct platform_device *pdev)
 
        dma_async_device_unregister(&cqdma->ddev);
        of_dma_controller_free(pdev->dev.of_node);
-
-       return 0;
 }
 
 static struct platform_driver mtk_cqdma_driver = {
        .probe = mtk_cqdma_probe,
-       .remove = mtk_cqdma_remove,
+       .remove_new = mtk_cqdma_remove,
        .driver = {
                .name           = KBUILD_MODNAME,
                .of_match_table = mtk_cqdma_match,
index 64120767d9838c9c3eb93326ef85c405fdbed91f..36ff11e909ea08deda1a98f2cea2e768de0a71ce 100644 (file)
@@ -1009,7 +1009,7 @@ err_unregister:
        return err;
 }
 
-static int mtk_hsdma_remove(struct platform_device *pdev)
+static void mtk_hsdma_remove(struct platform_device *pdev)
 {
        struct mtk_hsdma_device *hsdma = platform_get_drvdata(pdev);
        struct mtk_hsdma_vchan *vc;
@@ -1034,13 +1034,11 @@ static int mtk_hsdma_remove(struct platform_device *pdev)
 
        dma_async_device_unregister(&hsdma->ddev);
        of_dma_controller_free(pdev->dev.of_node);
-
-       return 0;
 }
 
 static struct platform_driver mtk_hsdma_driver = {
        .probe          = mtk_hsdma_probe,
-       .remove         = mtk_hsdma_remove,
+       .remove_new     = mtk_hsdma_remove,
        .driver = {
                .name           = KBUILD_MODNAME,
                .of_match_table = mtk_hsdma_match,
index 06d12ac39144f4eefa285c58d289b1e0b70b5d54..1bdc1500be40fc11e111af213781dc389e8e4ab6 100644 (file)
@@ -572,7 +572,7 @@ err_no_dma:
        return rc;
 }
 
-static int mtk_uart_apdma_remove(struct platform_device *pdev)
+static void mtk_uart_apdma_remove(struct platform_device *pdev)
 {
        struct mtk_uart_apdmadev *mtkd = platform_get_drvdata(pdev);
 
@@ -583,8 +583,6 @@ static int mtk_uart_apdma_remove(struct platform_device *pdev)
        dma_async_device_unregister(&mtkd->ddev);
 
        pm_runtime_disable(&pdev->dev);
-
-       return 0;
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -639,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 = mtk_uart_apdma_remove,
+       .remove_new = mtk_uart_apdma_remove,
        .driver = {
                .name           = KBUILD_MODNAME,
                .pm             = &mtk_uart_apdma_pm_ops,
index ebdfdcbb4f7ae8b09d05ad61a4821d9c6554242b..136fcaeff8dda9cdb3875240d6715211b4d9cc85 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/device.h>
 #include <linux/platform_data/mmp_dma.h>
 #include <linux/dmapool.h>
-#include <linux/of_device.h>
 #include <linux/of_dma.h>
 #include <linux/of.h>
 
@@ -932,7 +931,7 @@ static void dma_do_tasklet(struct tasklet_struct *t)
        }
 }
 
-static int mmp_pdma_remove(struct platform_device *op)
+static void mmp_pdma_remove(struct platform_device *op)
 {
        struct mmp_pdma_device *pdev = platform_get_drvdata(op);
        struct mmp_pdma_phy *phy;
@@ -958,7 +957,6 @@ static int mmp_pdma_remove(struct platform_device *op)
        }
 
        dma_async_device_unregister(&pdev->device);
-       return 0;
 }
 
 static int mmp_pdma_chan_init(struct mmp_pdma_device *pdev, int idx, int irq)
@@ -1020,7 +1018,6 @@ static struct dma_chan *mmp_pdma_dma_xlate(struct of_phandle_args *dma_spec,
 static int mmp_pdma_probe(struct platform_device *op)
 {
        struct mmp_pdma_device *pdev;
-       const struct of_device_id *of_id;
        struct mmp_dma_platdata *pdata = dev_get_platdata(&op->dev);
        int i, ret, irq = 0;
        int dma_channels = 0, irq_num = 0;
@@ -1040,8 +1037,7 @@ static int mmp_pdma_probe(struct platform_device *op)
        if (IS_ERR(pdev->base))
                return PTR_ERR(pdev->base);
 
-       of_id = of_match_device(mmp_pdma_dt_ids, pdev->dev);
-       if (of_id) {
+       if (pdev->dev->of_node) {
                /* Parse new and deprecated dma-channels properties */
                if (of_property_read_u32(pdev->dev->of_node, "dma-channels",
                                         &dma_channels))
@@ -1141,7 +1137,7 @@ static struct platform_driver mmp_pdma_driver = {
        },
        .id_table       = mmp_pdma_id_table,
        .probe          = mmp_pdma_probe,
-       .remove         = mmp_pdma_remove,
+       .remove_new     = mmp_pdma_remove,
 };
 
 module_platform_driver(mmp_pdma_driver);
index d49fa6bc677592f24c50b5913c55a2843c77febf..b76fe99e1151637ef92e3a2cecd3c5e7991c9d92 100644 (file)
@@ -14,9 +14,9 @@
 #include <linux/slab.h>
 #include <linux/dmaengine.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 #include <linux/device.h>
 #include <linux/genalloc.h>
-#include <linux/of_device.h>
 #include <linux/of_dma.h>
 
 #include "dmaengine.h"
@@ -552,12 +552,10 @@ static void mmp_tdma_issue_pending(struct dma_chan *chan)
        mmp_tdma_enable_chan(tdmac);
 }
 
-static int mmp_tdma_remove(struct platform_device *pdev)
+static void mmp_tdma_remove(struct platform_device *pdev)
 {
        if (pdev->dev.of_node)
                of_dma_controller_free(pdev->dev.of_node);
-
-       return 0;
 }
 
 static int mmp_tdma_chan_init(struct mmp_tdma_device *tdev,
@@ -637,18 +635,13 @@ MODULE_DEVICE_TABLE(of, mmp_tdma_dt_ids);
 static int mmp_tdma_probe(struct platform_device *pdev)
 {
        enum mmp_tdma_type type;
-       const struct of_device_id *of_id;
        struct mmp_tdma_device *tdev;
        int i, ret;
        int irq = 0, irq_num = 0;
        int chan_num = TDMA_CHANNEL_NUM;
        struct gen_pool *pool = NULL;
 
-       of_id = of_match_device(mmp_tdma_dt_ids, &pdev->dev);
-       if (of_id)
-               type = (enum mmp_tdma_type) of_id->data;
-       else
-               type = platform_get_device_id(pdev)->driver_data;
+       type = (enum mmp_tdma_type)device_get_match_data(&pdev->dev);
 
        /* always have couple channels */
        tdev = devm_kzalloc(&pdev->dev, sizeof(*tdev), GFP_KERNEL);
@@ -726,34 +719,24 @@ static int mmp_tdma_probe(struct platform_device *pdev)
                return ret;
        }
 
-       if (pdev->dev.of_node) {
-               ret = of_dma_controller_register(pdev->dev.of_node,
-                                                       mmp_tdma_xlate, tdev);
-               if (ret) {
-                       dev_err(tdev->device.dev,
-                               "failed to register controller\n");
-                       return ret;
-               }
+       ret = of_dma_controller_register(pdev->dev.of_node,
+                                        mmp_tdma_xlate, tdev);
+       if (ret) {
+               dev_err(tdev->device.dev, "failed to register controller\n");
+               return ret;
        }
 
        dev_info(tdev->device.dev, "initialized\n");
        return 0;
 }
 
-static const struct platform_device_id mmp_tdma_id_table[] = {
-       { "mmp-adma",   MMP_AUD_TDMA },
-       { "pxa910-squ", PXA910_SQU },
-       { },
-};
-
 static struct platform_driver mmp_tdma_driver = {
        .driver         = {
                .name   = "mmp-tdma",
                .of_match_table = mmp_tdma_dt_ids,
        },
-       .id_table       = mmp_tdma_id_table,
        .probe          = mmp_tdma_probe,
-       .remove         = mmp_tdma_remove,
+       .remove_new     = mmp_tdma_remove,
 };
 
 module_platform_driver(mmp_tdma_driver);
index 7565ad98ba6604e0fddcf0f174d929c51b00323c..c48d68cbff9232acf30e4eebce051145009b25b1 100644 (file)
@@ -124,7 +124,7 @@ struct moxart_desc {
        unsigned int                    dma_cycles;
        struct virt_dma_desc            vd;
        uint8_t                         es;
-       struct moxart_sg                sg[];
+       struct moxart_sg                sg[] __counted_by(sglen);
 };
 
 struct moxart_chan {
@@ -309,6 +309,7 @@ static struct dma_async_tx_descriptor *moxart_prep_slave_sg(
        d = kzalloc(struct_size(d, sg, sg_len), GFP_ATOMIC);
        if (!d)
                return NULL;
+       d->sglen = sg_len;
 
        d->dma_dir = dir;
        d->dev_addr = dev_addr;
@@ -319,8 +320,6 @@ static struct dma_async_tx_descriptor *moxart_prep_slave_sg(
                d->sg[i].len = sg_dma_len(sgent);
        }
 
-       d->sglen = sg_len;
-
        ch->error = 0;
 
        return vchan_tx_prep(&ch->vc, &d->vd, tx_flags);
@@ -630,7 +629,7 @@ static int moxart_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int moxart_remove(struct platform_device *pdev)
+static void moxart_remove(struct platform_device *pdev)
 {
        struct moxart_dmadev *m = platform_get_drvdata(pdev);
 
@@ -640,8 +639,6 @@ static int moxart_remove(struct platform_device *pdev)
 
        if (pdev->dev.of_node)
                of_dma_controller_free(pdev->dev.of_node);
-
-       return 0;
 }
 
 static const struct of_device_id moxart_dma_match[] = {
@@ -652,7 +649,7 @@ MODULE_DEVICE_TABLE(of, moxart_dma_match);
 
 static struct platform_driver moxart_driver = {
        .probe  = moxart_probe,
-       .remove = moxart_remove,
+       .remove_new = moxart_remove,
        .driver = {
                .name           = "moxart-dma-engine",
                .of_match_table = moxart_dma_match,
index 1104017320b888ba3058475d9e1eae3bc03061ea..68c247a46321cbf906900f0ec741eca4f1382fe4 100644 (file)
@@ -1084,7 +1084,7 @@ err:
        return retval;
 }
 
-static int mpc_dma_remove(struct platform_device *op)
+static void mpc_dma_remove(struct platform_device *op)
 {
        struct device *dev = &op->dev;
        struct mpc_dma *mdma = dev_get_drvdata(dev);
@@ -1099,8 +1099,6 @@ static int mpc_dma_remove(struct platform_device *op)
        free_irq(mdma->irq, mdma);
        irq_dispose_mapping(mdma->irq);
        tasklet_kill(&mdma->tasklet);
-
-       return 0;
 }
 
 static const struct of_device_id mpc_dma_match[] = {
@@ -1112,7 +1110,7 @@ MODULE_DEVICE_TABLE(of, mpc_dma_match);
 
 static struct platform_driver mpc_dma_driver = {
        .probe          = mpc_dma_probe,
-       .remove         = mpc_dma_remove,
+       .remove_new     = mpc_dma_remove,
        .driver = {
                .name = DRV_NAME,
                .of_match_table = mpc_dma_match,
index 23b232b5751844f8329a1f4c62fd3294e5de5391..bcd3b623ac6c20a4aee0d2973b0aa308d99743f1 100644 (file)
@@ -10,8 +10,8 @@
 #include <linux/dma-mapping.h>
 #include <linux/spinlock.h>
 #include <linux/interrupt.h>
-#include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 #include <linux/memory.h>
 #include <linux/clk.h>
 #include <linux/of.h>
@@ -1328,13 +1328,8 @@ static int mv_xor_probe(struct platform_device *pdev)
         * setting up. In non-dt case it can only be the legacy one.
         */
        xordev->xor_type = XOR_ORION;
-       if (pdev->dev.of_node) {
-               const struct of_device_id *of_id =
-                       of_match_device(mv_xor_dt_ids,
-                                       &pdev->dev);
-
-               xordev->xor_type = (uintptr_t)of_id->data;
-       }
+       if (pdev->dev.of_node)
+               xordev->xor_type = (uintptr_t)device_get_match_data(&pdev->dev);
 
        /*
         * (Re-)program MBUS remapping windows if we are asked to.
index 0e1e9ca1c005a8254ac3fff9a314e66f0d20a891..1ebfbe88e7335af1f9ba4894e2e2ffa2e85becf2 100644 (file)
@@ -855,7 +855,7 @@ free_msi_irqs:
        return ret;
 }
 
-static int mv_xor_v2_remove(struct platform_device *pdev)
+static void mv_xor_v2_remove(struct platform_device *pdev)
 {
        struct mv_xor_v2_device *xor_dev = platform_get_drvdata(pdev);
 
@@ -870,8 +870,6 @@ static int mv_xor_v2_remove(struct platform_device *pdev)
        platform_msi_domain_free_irqs(&pdev->dev);
 
        tasklet_kill(&xor_dev->irq_tasklet);
-
-       return 0;
 }
 
 #ifdef CONFIG_OF
@@ -886,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         = mv_xor_v2_remove,
+       .remove_new     = mv_xor_v2_remove,
        .driver         = {
                .name   = "mv_xor_v2",
                .of_match_table = of_match_ptr(mv_xor_v2_dt_ids),
index 0b2f96fd8bf0c607bb08a7bb1dafb191bf11b4df..c08916339aa767f303fd5170abd14c4372acb178 100644 (file)
@@ -1454,7 +1454,7 @@ e_clk_off:
        return ret;
 }
 
-static int nbpf_remove(struct platform_device *pdev)
+static void nbpf_remove(struct platform_device *pdev)
 {
        struct nbpf_device *nbpf = platform_get_drvdata(pdev);
        int i;
@@ -1472,8 +1472,6 @@ static int nbpf_remove(struct platform_device *pdev)
        of_dma_controller_free(pdev->dev.of_node);
        dma_async_device_unregister(&nbpf->dma_dev);
        clk_disable_unprepare(nbpf->clk);
-
-       return 0;
 }
 
 static const struct platform_device_id nbpf_ids[] = {
@@ -1517,7 +1515,7 @@ static struct platform_driver nbpf_driver = {
        },
        .id_table = nbpf_ids,
        .probe = nbpf_probe,
-       .remove = nbpf_remove,
+       .remove_new = nbpf_remove,
 };
 
 module_platform_driver(nbpf_driver);
index 384476757c5e3a47502c23dbadc2049b627dcf34..4e76c4ec2d39660bf91d0350f0b8334e943feb3f 100644 (file)
@@ -1231,7 +1231,7 @@ err_pool_free:
        return ret;
 }
 
-static int owl_dma_remove(struct platform_device *pdev)
+static void owl_dma_remove(struct platform_device *pdev)
 {
        struct owl_dma *od = platform_get_drvdata(pdev);
 
@@ -1248,13 +1248,11 @@ static int owl_dma_remove(struct platform_device *pdev)
 
        clk_disable_unprepare(od->clk);
        dma_pool_destroy(od->lli_pool);
-
-       return 0;
 }
 
 static struct platform_driver owl_dma_driver = {
        .probe  = owl_dma_probe,
-       .remove = owl_dma_remove,
+       .remove_new = owl_dma_remove,
        .driver = {
                .name = "dma-owl",
                .of_match_table = of_match_ptr(owl_dma_match),
index f9b82dff33871c35a9291f65b68320838fba9f27..bbb60a970dabdcdcab588a8173dd4fa1bc4cf884 100644 (file)
@@ -4230,7 +4230,7 @@ out:
 /**
  * ppc440spe_adma_remove - remove the asynch device
  */
-static int ppc440spe_adma_remove(struct platform_device *ofdev)
+static void ppc440spe_adma_remove(struct platform_device *ofdev)
 {
        struct ppc440spe_adma_device *adev = platform_get_drvdata(ofdev);
        struct device_node *np = ofdev->dev.of_node;
@@ -4278,7 +4278,6 @@ static int ppc440spe_adma_remove(struct platform_device *ofdev)
        of_address_to_resource(np, 0, &res);
        release_mem_region(res.start, resource_size(&res));
        kfree(adev);
-       return 0;
 }
 
 /*
@@ -4550,7 +4549,7 @@ MODULE_DEVICE_TABLE(of, ppc440spe_adma_of_match);
 
 static struct platform_driver ppc440spe_adma_driver = {
        .probe = ppc440spe_adma_probe,
-       .remove = ppc440spe_adma_remove,
+       .remove_new = ppc440spe_adma_remove,
        .driver = {
                .name = "PPC440SP(E)-ADMA",
                .of_match_table = ppc440spe_adma_of_match,
index 1b046d9a3a269aed4080a890f5950a11e7f5b30c..31f8da810c055a4e93472348b7b8d642219ac972 100644 (file)
@@ -15,9 +15,8 @@
 #include <linux/device.h>
 #include <linux/platform_data/mmp_dma.h>
 #include <linux/dmapool.h>
-#include <linux/of_device.h>
-#include <linux/of_dma.h>
 #include <linux/of.h>
+#include <linux/of_dma.h>
 #include <linux/wait.h>
 #include <linux/dma/pxa-dma.h>
 
@@ -91,7 +90,8 @@ struct pxad_desc_sw {
        bool                    cyclic;
        struct dma_pool         *desc_pool;     /* Channel's used allocator */
 
-       struct pxad_desc_hw     *hw_desc[];     /* DMA coherent descriptors */
+       struct pxad_desc_hw     *hw_desc[] __counted_by(nb_desc);
+                                               /* DMA coherent descriptors */
 };
 
 struct pxad_phy {
@@ -722,7 +722,6 @@ static void pxad_free_desc(struct virt_dma_desc *vd)
        dma_addr_t dma;
        struct pxad_desc_sw *sw_desc = to_pxad_sw_desc(vd);
 
-       BUG_ON(sw_desc->nb_desc == 0);
        for (i = sw_desc->nb_desc - 1; i >= 0; i--) {
                if (i > 0)
                        dma = sw_desc->hw_desc[i - 1]->ddadr;
@@ -740,6 +739,7 @@ pxad_alloc_desc(struct pxad_chan *chan, unsigned int nb_hw_desc)
 {
        struct pxad_desc_sw *sw_desc;
        dma_addr_t dma;
+       void *desc;
        int i;
 
        sw_desc = kzalloc(struct_size(sw_desc, hw_desc, nb_hw_desc),
@@ -749,20 +749,21 @@ pxad_alloc_desc(struct pxad_chan *chan, unsigned int nb_hw_desc)
        sw_desc->desc_pool = chan->desc_pool;
 
        for (i = 0; i < nb_hw_desc; i++) {
-               sw_desc->hw_desc[i] = dma_pool_alloc(sw_desc->desc_pool,
-                                                    GFP_NOWAIT, &dma);
-               if (!sw_desc->hw_desc[i]) {
+               desc = dma_pool_alloc(sw_desc->desc_pool, GFP_NOWAIT, &dma);
+               if (!desc) {
                        dev_err(&chan->vc.chan.dev->device,
                                "%s(): Couldn't allocate the %dth hw_desc from dma_pool %p\n",
                                __func__, i, sw_desc->desc_pool);
                        goto err;
                }
 
+               sw_desc->nb_desc++;
+               sw_desc->hw_desc[i] = desc;
+
                if (i == 0)
                        sw_desc->first = dma;
                else
                        sw_desc->hw_desc[i - 1]->ddadr = dma;
-               sw_desc->nb_desc++;
        }
 
        return sw_desc;
@@ -1221,13 +1222,12 @@ static void pxad_free_channels(struct dma_device *dmadev)
        }
 }
 
-static int pxad_remove(struct platform_device *op)
+static void pxad_remove(struct platform_device *op)
 {
        struct pxad_device *pdev = platform_get_drvdata(op);
 
        pxad_cleanup_debugfs(pdev);
        pxad_free_channels(&pdev->slave);
-       return 0;
 }
 
 static int pxad_init_phys(struct platform_device *op,
@@ -1343,7 +1343,6 @@ static int pxad_init_dmadev(struct platform_device *op,
 static int pxad_probe(struct platform_device *op)
 {
        struct pxad_device *pdev;
-       const struct of_device_id *of_id;
        const struct dma_slave_map *slave_map = NULL;
        struct mmp_dma_platdata *pdata = dev_get_platdata(&op->dev);
        int ret, dma_channels = 0, nb_requestors = 0, slave_map_cnt = 0;
@@ -1361,8 +1360,7 @@ static int pxad_probe(struct platform_device *op)
        if (IS_ERR(pdev->base))
                return PTR_ERR(pdev->base);
 
-       of_id = of_match_device(pxad_dt_ids, &op->dev);
-       if (of_id) {
+       if (op->dev.of_node) {
                /* Parse new and deprecated dma-channels properties */
                if (of_property_read_u32(op->dev.of_node, "dma-channels",
                                         &dma_channels))
@@ -1444,7 +1442,7 @@ static struct platform_driver pxad_driver = {
        },
        .id_table       = pxad_id_table,
        .probe          = pxad_probe,
-       .remove         = pxad_remove,
+       .remove_new     = pxad_remove,
 };
 
 static bool pxad_filter_fn(struct dma_chan *chan, void *param)
index 4c3eb972039d600a9ed26ca262daf167b50822f8..5e7d332731e0c111792b51b23f28e35d7463ff5f 100644 (file)
@@ -74,7 +74,7 @@ struct bam_async_desc {
        struct list_head desc_node;
        enum dma_transfer_direction dir;
        size_t length;
-       struct bam_desc_hw desc[];
+       struct bam_desc_hw desc[] __counted_by(num_desc);
 };
 
 enum bam_reg {
@@ -1386,7 +1386,7 @@ err_disable_clk:
        return ret;
 }
 
-static int bam_dma_remove(struct platform_device *pdev)
+static void bam_dma_remove(struct platform_device *pdev)
 {
        struct bam_device *bdev = platform_get_drvdata(pdev);
        u32 i;
@@ -1416,8 +1416,6 @@ static int bam_dma_remove(struct platform_device *pdev)
        tasklet_kill(&bdev->task);
 
        clk_disable_unprepare(bdev->bamclk);
-
-       return 0;
 }
 
 static int __maybe_unused bam_dma_runtime_suspend(struct device *dev)
@@ -1475,7 +1473,7 @@ static const struct dev_pm_ops bam_dma_pm_ops = {
 
 static struct platform_driver bam_dma_driver = {
        .probe = bam_dma_probe,
-       .remove = bam_dma_remove,
+       .remove_new = bam_dma_remove,
        .driver = {
                .name = "bam-dma-engine",
                .pm = &bam_dma_pm_ops,
index 834ae519c15de052eacc2d16c2097a0f6707bf28..d63b93dc7047643c00b5381df936715bc4c56369 100644 (file)
@@ -745,7 +745,7 @@ static bool hidma_test_capability(struct device *dev, enum hidma_cap test_cap)
 {
        enum hidma_cap cap;
 
-       cap = (enum hidma_cap) device_get_match_data(dev);
+       cap = (uintptr_t) device_get_match_data(dev);
        return cap ? ((cap & test_cap) > 0) : 0;
 }
 
@@ -915,7 +915,7 @@ static void hidma_shutdown(struct platform_device *pdev)
 
 }
 
-static int hidma_remove(struct platform_device *pdev)
+static void hidma_remove(struct platform_device *pdev)
 {
        struct hidma_dev *dmadev = platform_get_drvdata(pdev);
 
@@ -935,8 +935,6 @@ static int hidma_remove(struct platform_device *pdev)
        dev_info(&pdev->dev, "HI-DMA engine removed\n");
        pm_runtime_put_sync_suspend(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
-
-       return 0;
 }
 
 #if IS_ENABLED(CONFIG_ACPI)
@@ -960,7 +958,7 @@ MODULE_DEVICE_TABLE(of, hidma_match);
 
 static struct platform_driver hidma_driver = {
        .probe = hidma_probe,
-       .remove = hidma_remove,
+       .remove_new = hidma_remove,
        .shutdown = hidma_shutdown,
        .driver = {
                   .name = "hidma",
index d56caf1681ffb3a3a37f52edb109b48b00891045..53f4273b657cecd197db44d22e719f4738d976b0 100644 (file)
@@ -904,7 +904,7 @@ err_disable_core_clk:
        return ret;
 }
 
-static int adm_dma_remove(struct platform_device *pdev)
+static void adm_dma_remove(struct platform_device *pdev)
 {
        struct adm_device *adev = platform_get_drvdata(pdev);
        struct adm_chan *achan;
@@ -927,8 +927,6 @@ static int adm_dma_remove(struct platform_device *pdev)
 
        clk_disable_unprepare(adev->core_clk);
        clk_disable_unprepare(adev->iface_clk);
-
-       return 0;
 }
 
 static const struct of_device_id adm_of_match[] = {
@@ -939,7 +937,7 @@ MODULE_DEVICE_TABLE(of, adm_of_match);
 
 static struct platform_driver adm_dma_driver = {
        .probe = adm_dma_probe,
-       .remove = adm_dma_remove,
+       .remove_new = adm_dma_remove,
        .driver = {
                .name = "adm-dma-engine",
                .of_match_table = adm_of_match,
index a29c13cae7167a8ff694406b312a01f005fd809b..01e656c69e6c1f79657f09d94d676d885d5a1b2f 100644 (file)
@@ -78,7 +78,7 @@ struct sa11x0_dma_desc {
        bool                    cyclic;
 
        unsigned                sglen;
-       struct sa11x0_dma_sg    sg[];
+       struct sa11x0_dma_sg    sg[] __counted_by(sglen);
 };
 
 struct sa11x0_dma_phy;
@@ -558,6 +558,7 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
                dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
                return NULL;
        }
+       txd->sglen = j;
 
        j = 0;
        for_each_sg(sg, sgent, sglen, i) {
@@ -593,7 +594,6 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_slave_sg(
 
        txd->ddar = c->ddar;
        txd->size = size;
-       txd->sglen = j;
 
        dev_dbg(chan->device->dev, "vchan %p: txd %p: size %zu nr %u\n",
                &c->vc, &txd->vd, txd->size, txd->sglen);
@@ -628,6 +628,7 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
                dev_dbg(chan->device->dev, "vchan %p: kzalloc failed\n", &c->vc);
                return NULL;
        }
+       txd->sglen = sglen;
 
        for (i = k = 0; i < size / period; i++) {
                size_t tlen, len = period;
@@ -653,7 +654,6 @@ static struct dma_async_tx_descriptor *sa11x0_dma_prep_dma_cyclic(
 
        txd->ddar = c->ddar;
        txd->size = size;
-       txd->sglen = sglen;
        txd->cyclic = 1;
        txd->period = sgperiod;
 
@@ -984,7 +984,7 @@ static int sa11x0_dma_probe(struct platform_device *pdev)
        return ret;
 }
 
-static int sa11x0_dma_remove(struct platform_device *pdev)
+static void sa11x0_dma_remove(struct platform_device *pdev)
 {
        struct sa11x0_dma_dev *d = platform_get_drvdata(pdev);
        unsigned pch;
@@ -997,8 +997,6 @@ static int sa11x0_dma_remove(struct platform_device *pdev)
        tasklet_kill(&d->task);
        iounmap(d->base);
        kfree(d);
-
-       return 0;
 }
 
 static __maybe_unused int sa11x0_dma_suspend(struct device *dev)
@@ -1081,7 +1079,7 @@ static struct platform_driver sa11x0_dma_driver = {
                .pm     = &sa11x0_dma_pm_ops,
        },
        .probe          = sa11x0_dma_probe,
-       .remove         = sa11x0_dma_remove,
+       .remove_new     = sa11x0_dma_remove,
 };
 
 static int __init sa11x0_dma_init(void)
index d1c6956af45201bd61271ce6c50f29533fd487f6..3125a2f162b4788d3ffbf182265bff18532ba19c 100644 (file)
@@ -566,7 +566,7 @@ static int sf_pdma_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int sf_pdma_remove(struct platform_device *pdev)
+static void sf_pdma_remove(struct platform_device *pdev)
 {
        struct sf_pdma *pdma = platform_get_drvdata(pdev);
        struct sf_pdma_chan *ch;
@@ -584,8 +584,6 @@ static int sf_pdma_remove(struct platform_device *pdev)
        }
 
        dma_async_device_unregister(&pdma->dma_dev);
-
-       return 0;
 }
 
 static const struct of_device_id sf_pdma_dt_ids[] = {
@@ -597,7 +595,7 @@ MODULE_DEVICE_TABLE(of, sf_pdma_dt_ids);
 
 static struct platform_driver sf_pdma_driver = {
        .probe          = sf_pdma_probe,
-       .remove         = sf_pdma_remove,
+       .remove_new     = sf_pdma_remove,
        .driver         = {
                .name   = "sf-pdma",
                .of_match_table = sf_pdma_dt_ids,
index 5c398a83b491aa3af5c1f505af95ea1f0ddb445b..d05772b5d8d3fd3e0bee8d984eb41916c80e5214 100644 (file)
@@ -113,7 +113,7 @@ struct sf_pdma {
        void __iomem            *membase;
        void __iomem            *mappedbase;
        u32                     n_chans;
-       struct sf_pdma_chan     chans[];
+       struct sf_pdma_chan     chans[] __counted_by(n_chans);
 };
 
 #endif /* _SF_PDMA_H */
index 641d689d17ff189b485ca54673812aeb7976292a..40482cb73d798ac15d24fa1aa1a94ea0c2ee2723 100644 (file)
@@ -1990,7 +1990,7 @@ err_pm_disable:
        return ret;
 }
 
-static int rcar_dmac_remove(struct platform_device *pdev)
+static void rcar_dmac_remove(struct platform_device *pdev)
 {
        struct rcar_dmac *dmac = platform_get_drvdata(pdev);
 
@@ -1998,8 +1998,6 @@ static int rcar_dmac_remove(struct platform_device *pdev)
        dma_async_device_unregister(&dmac->engine);
 
        pm_runtime_disable(&pdev->dev);
-
-       return 0;
 }
 
 static void rcar_dmac_shutdown(struct platform_device *pdev)
@@ -2041,7 +2039,7 @@ static struct platform_driver rcar_dmac_driver = {
                .of_match_table = rcar_dmac_of_ids,
        },
        .probe          = rcar_dmac_probe,
-       .remove         = rcar_dmac_remove,
+       .remove_new     = rcar_dmac_remove,
        .shutdown       = rcar_dmac_shutdown,
 };
 
index f777addda8bac068d97da1d3a744924368213daa..fea5bda34bc20f679b987e0a2d4ffde4f28e1f7c 100644 (file)
@@ -969,7 +969,7 @@ err_pm_disable:
        return ret;
 }
 
-static int rz_dmac_remove(struct platform_device *pdev)
+static void rz_dmac_remove(struct platform_device *pdev)
 {
        struct rz_dmac *dmac = platform_get_drvdata(pdev);
        unsigned int i;
@@ -987,8 +987,6 @@ static int rz_dmac_remove(struct platform_device *pdev)
        reset_control_assert(dmac->rstc);
        pm_runtime_put(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
-
-       return 0;
 }
 
 static const struct of_device_id of_rz_dmac_match[] = {
@@ -1003,7 +1001,7 @@ static struct platform_driver rz_dmac_driver = {
                .of_match_table = of_rz_dmac_match,
        },
        .probe          = rz_dmac_probe,
-       .remove         = rz_dmac_remove,
+       .remove_new     = rz_dmac_remove,
 };
 
 module_platform_driver(rz_dmac_driver);
index 00067b29e23223abcec60f1847bdb2c07189fbf6..7cc9eb2217e8f09c3f6060f27250813ae77b6d82 100644 (file)
@@ -882,7 +882,7 @@ eshdma:
        return err;
 }
 
-static int sh_dmae_remove(struct platform_device *pdev)
+static void sh_dmae_remove(struct platform_device *pdev)
 {
        struct sh_dmae_device *shdev = platform_get_drvdata(pdev);
        struct dma_device *dma_dev = &shdev->shdma_dev.dma_dev;
@@ -899,8 +899,6 @@ static int sh_dmae_remove(struct platform_device *pdev)
        shdma_cleanup(&shdev->shdma_dev);
 
        synchronize_rcu();
-
-       return 0;
 }
 
 static struct platform_driver sh_dmae_driver = {
@@ -908,7 +906,7 @@ static struct platform_driver sh_dmae_driver = {
                .pm     = &sh_dmae_pm,
                .name   = SH_DMAE_DRV_NAME,
        },
-       .remove         = sh_dmae_remove,
+       .remove_new     = sh_dmae_remove,
 };
 
 static int __init sh_dmae_init(void)
index b14cf350b669aa7d911b20b00bba63b2ee12b16b..a9b4302f6050144f2359927c4cd4cf41dc38e80f 100644 (file)
@@ -57,7 +57,7 @@ struct usb_dmac_desc {
        u32 residue;
        struct list_head node;
        dma_cookie_t done_cookie;
-       struct usb_dmac_sg sg[];
+       struct usb_dmac_sg sg[] __counted_by(sg_allocated_len);
 };
 
 #define to_usb_dmac_desc(vd)   container_of(vd, struct usb_dmac_desc, vd)
@@ -866,7 +866,7 @@ static void usb_dmac_chan_remove(struct usb_dmac *dmac,
        devm_free_irq(dmac->dev, uchan->irq, uchan);
 }
 
-static int usb_dmac_remove(struct platform_device *pdev)
+static void usb_dmac_remove(struct platform_device *pdev)
 {
        struct usb_dmac *dmac = platform_get_drvdata(pdev);
        int i;
@@ -877,8 +877,6 @@ static int usb_dmac_remove(struct platform_device *pdev)
        dma_async_device_unregister(&dmac->engine);
 
        pm_runtime_disable(&pdev->dev);
-
-       return 0;
 }
 
 static void usb_dmac_shutdown(struct platform_device *pdev)
@@ -901,7 +899,7 @@ static struct platform_driver usb_dmac_driver = {
                .of_match_table = usb_dmac_of_ids,
        },
        .probe          = usb_dmac_probe,
-       .remove         = usb_dmac_remove,
+       .remove_new     = usb_dmac_remove,
        .shutdown       = usb_dmac_shutdown,
 };
 
index 168aa0bd73a0dd3b7f8224c9c5768945e15b9902..3f54ff37c5e051a4d02fe7962abf0474317994e5 100644 (file)
@@ -212,7 +212,7 @@ struct sprd_dma_dev {
        struct clk              *ashb_clk;
        int                     irq;
        u32                     total_chns;
-       struct sprd_dma_chn     channels[];
+       struct sprd_dma_chn     channels[] __counted_by(total_chns);
 };
 
 static void sprd_dma_free_desc(struct virt_dma_desc *vd);
@@ -572,8 +572,7 @@ static void sprd_dma_stop(struct sprd_dma_chn *schan)
        schan->cur_desc = NULL;
 }
 
-static bool sprd_dma_check_trans_done(struct sprd_dma_desc *sdesc,
-                                     enum sprd_dma_int_type int_type,
+static bool sprd_dma_check_trans_done(enum sprd_dma_int_type int_type,
                                      enum sprd_dma_req_mode req_mode)
 {
        if (int_type == SPRD_DMA_NO_INT)
@@ -619,8 +618,7 @@ static irqreturn_t dma_irq_handle(int irq, void *dev_id)
                        vchan_cyclic_callback(&sdesc->vd);
                } else {
                        /* Check if the dma request descriptor is done. */
-                       trans_done = sprd_dma_check_trans_done(sdesc, int_type,
-                                                              req_type);
+                       trans_done = sprd_dma_check_trans_done(int_type, req_type);
                        if (trans_done == true) {
                                vchan_cookie_complete(&sdesc->vd);
                                schan->cur_desc = NULL;
@@ -1117,6 +1115,15 @@ static int sprd_dma_probe(struct platform_device *pdev)
        u32 chn_count;
        int ret, i;
 
+       ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(36));
+       if (ret) {
+               ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+               if (ret) {
+                       dev_err(&pdev->dev, "unable to set coherent mask to 32\n");
+                       return ret;
+               }
+       }
+
        /* Parse new and deprecated dma-channels properties */
        ret = device_property_read_u32(&pdev->dev, "dma-channels", &chn_count);
        if (ret)
@@ -1232,7 +1239,7 @@ err_rpm:
        return ret;
 }
 
-static int sprd_dma_remove(struct platform_device *pdev)
+static void sprd_dma_remove(struct platform_device *pdev)
 {
        struct sprd_dma_dev *sdev = platform_get_drvdata(pdev);
        struct sprd_dma_chn *c, *cn;
@@ -1255,7 +1262,6 @@ static int sprd_dma_remove(struct platform_device *pdev)
 
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
-       return 0;
 }
 
 static const struct of_device_id sprd_dma_match[] = {
@@ -1292,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 = sprd_dma_remove,
+       .remove_new = sprd_dma_remove,
        .driver = {
                .name = "sprd-dma",
                .of_match_table = sprd_dma_match,
index d95c421877fb7361b1da14c8ed8a93e34faea985..8880b5e336f8d4afa80901d79aaf38b4a7218446 100644 (file)
 
 #include <linux/init.h>
 #include <linux/module.h>
-#include <linux/of_device.h>
+#include <linux/of.h>
 #include <linux/of_dma.h>
 #include <linux/platform_device.h>
+#include <linux/property.h>
 #include <linux/interrupt.h>
 #include <linux/remoteproc.h>
 #include <linux/slab.h>
@@ -739,18 +740,11 @@ static void st_fdma_free(struct st_fdma_dev *fdev)
 static int st_fdma_probe(struct platform_device *pdev)
 {
        struct st_fdma_dev *fdev;
-       const struct of_device_id *match;
        struct device_node *np = pdev->dev.of_node;
        const struct st_fdma_driverdata *drvdata;
        int ret, i;
 
-       match = of_match_device((st_fdma_match), &pdev->dev);
-       if (!match || !match->data) {
-               dev_err(&pdev->dev, "No device match found\n");
-               return -ENODEV;
-       }
-
-       drvdata = match->data;
+       drvdata = device_get_match_data(&pdev->dev);
 
        fdev = devm_kzalloc(&pdev->dev, sizeof(*fdev), GFP_KERNEL);
        if (!fdev)
@@ -849,15 +843,13 @@ err:
        return ret;
 }
 
-static int st_fdma_remove(struct platform_device *pdev)
+static void st_fdma_remove(struct platform_device *pdev)
 {
        struct st_fdma_dev *fdev = platform_get_drvdata(pdev);
 
        devm_free_irq(&pdev->dev, fdev->irq, fdev);
        st_slim_rproc_put(fdev->slim_rproc);
        of_dma_controller_free(pdev->dev.of_node);
-
-       return 0;
 }
 
 static struct platform_driver st_fdma_platform_driver = {
@@ -866,7 +858,7 @@ static struct platform_driver st_fdma_platform_driver = {
                .of_match_table = st_fdma_match,
        },
        .probe = st_fdma_probe,
-       .remove = st_fdma_remove,
+       .remove_new = st_fdma_remove,
 };
 module_platform_driver(st_fdma_platform_driver);
 
index fa15b97a3bab665f97ab7df7a3cd7b0eee1cbd3f..f296412e96b6a5c5e2749077bb5e8f3725afe369 100644 (file)
@@ -97,7 +97,7 @@ struct st_fdma_desc {
        struct st_fdma_chan *fchan;
        bool iscyclic;
        unsigned int n_nodes;
-       struct st_fdma_sw_node node[];
+       struct st_fdma_sw_node node[] __counted_by(n_nodes);
 };
 
 enum st_fdma_type {
index 0b30151fb45c4c18c17565e1f254f1783fe63059..72d83cd9ed6bcd41aa8050c00cc41393f01693e5 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/list.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/of_dma.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
@@ -191,7 +190,7 @@ struct stm32_dma_desc {
        struct virt_dma_desc vdesc;
        bool cyclic;
        u32 num_sgs;
-       struct stm32_dma_sg_req sg_req[];
+       struct stm32_dma_sg_req sg_req[] __counted_by(num_sgs);
 };
 
 /**
@@ -1105,6 +1104,7 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_slave_sg(
        desc = kzalloc(struct_size(desc, sg_req, sg_len), GFP_NOWAIT);
        if (!desc)
                return NULL;
+       desc->num_sgs = sg_len;
 
        /* Set peripheral flow controller */
        if (chan->dma_sconfig.device_fc)
@@ -1143,8 +1143,6 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_slave_sg(
                        desc->sg_req[i].chan_reg.dma_sm1ar += sg_dma_len(sg);
                desc->sg_req[i].chan_reg.dma_sndtr = nb_data_items;
        }
-
-       desc->num_sgs = sg_len;
        desc->cyclic = false;
 
        return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
@@ -1218,6 +1216,7 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_dma_cyclic(
        desc = kzalloc(struct_size(desc, sg_req, num_periods), GFP_NOWAIT);
        if (!desc)
                return NULL;
+       desc->num_sgs = num_periods;
 
        for (i = 0; i < num_periods; i++) {
                desc->sg_req[i].len = period_len;
@@ -1234,8 +1233,6 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_dma_cyclic(
                if (!chan->trig_mdma)
                        buf_addr += period_len;
        }
-
-       desc->num_sgs = num_periods;
        desc->cyclic = true;
 
        return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
@@ -1256,6 +1253,7 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_dma_memcpy(
        desc = kzalloc(struct_size(desc, sg_req, num_sgs), GFP_NOWAIT);
        if (!desc)
                return NULL;
+       desc->num_sgs = num_sgs;
 
        threshold = chan->threshold;
 
@@ -1285,8 +1283,6 @@ static struct dma_async_tx_descriptor *stm32_dma_prep_dma_memcpy(
                desc->sg_req[i].chan_reg.dma_sndtr = xfer_count;
                desc->sg_req[i].len = xfer_count;
        }
-
-       desc->num_sgs = num_sgs;
        desc->cyclic = false;
 
        return vchan_tx_prep(&chan->vchan, &desc->vdesc, flags);
@@ -1567,17 +1563,10 @@ static int stm32_dma_probe(struct platform_device *pdev)
        struct stm32_dma_chan *chan;
        struct stm32_dma_device *dmadev;
        struct dma_device *dd;
-       const struct of_device_id *match;
        struct resource *res;
        struct reset_control *rst;
        int i, ret;
 
-       match = of_match_device(stm32_dma_of_match, &pdev->dev);
-       if (!match) {
-               dev_err(&pdev->dev, "Error: No device match found\n");
-               return -ENODEV;
-       }
-
        dmadev = devm_kzalloc(&pdev->dev, sizeof(*dmadev), GFP_KERNEL);
        if (!dmadev)
                return -ENOMEM;
index bae08b3f55c73fa07bc5e67c427a94c326f7ac39..6505081ced441cff5dc7fd34ee2bd0fdad0dd7db 100644 (file)
@@ -224,7 +224,7 @@ struct stm32_mdma_desc {
        u32 ccr;
        bool cyclic;
        u32 count;
-       struct stm32_mdma_desc_node node[];
+       struct stm32_mdma_desc_node node[] __counted_by(count);
 };
 
 struct stm32_mdma_dma_config {
@@ -256,7 +256,7 @@ struct stm32_mdma_device {
        u32 nr_ahb_addr_masks;
        u32 chan_reserved;
        struct stm32_mdma_chan chan[STM32_MDMA_MAX_CHANNELS];
-       u32 ahb_addr_masks[];
+       u32 ahb_addr_masks[] __counted_by(nr_ahb_addr_masks);
 };
 
 static struct stm32_mdma_device *stm32_mdma_get_dev(
@@ -321,6 +321,7 @@ static struct stm32_mdma_desc *stm32_mdma_alloc_desc(
        desc = kzalloc(struct_size(desc, node, count), GFP_NOWAIT);
        if (!desc)
                return NULL;
+       desc->count = count;
 
        for (i = 0; i < count; i++) {
                desc->node[i].hwdesc =
@@ -330,8 +331,6 @@ static struct stm32_mdma_desc *stm32_mdma_alloc_desc(
                        goto err;
        }
 
-       desc->count = count;
-
        return desc;
 
 err:
@@ -489,7 +488,7 @@ static int stm32_mdma_set_xfer_param(struct stm32_mdma_chan *chan,
        src_maxburst = chan->dma_config.src_maxburst;
        dst_maxburst = chan->dma_config.dst_maxburst;
 
-       ccr = stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id));
+       ccr = stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id)) & ~STM32_MDMA_CCR_EN;
        ctcr = stm32_mdma_read(dmadev, STM32_MDMA_CTCR(chan->id));
        ctbr = stm32_mdma_read(dmadev, STM32_MDMA_CTBR(chan->id));
 
@@ -965,7 +964,7 @@ stm32_mdma_prep_dma_memcpy(struct dma_chan *c, dma_addr_t dest, dma_addr_t src,
        if (!desc)
                return NULL;
 
-       ccr = stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id));
+       ccr = stm32_mdma_read(dmadev, STM32_MDMA_CCR(chan->id)) & ~STM32_MDMA_CCR_EN;
        ctcr = stm32_mdma_read(dmadev, STM32_MDMA_CTCR(chan->id));
        ctbr = stm32_mdma_read(dmadev, STM32_MDMA_CTBR(chan->id));
        cbndtr = stm32_mdma_read(dmadev, STM32_MDMA_CBNDTR(chan->id));
@@ -1627,13 +1626,13 @@ static int stm32_mdma_probe(struct platform_device *pdev)
                              GFP_KERNEL);
        if (!dmadev)
                return -ENOMEM;
+       dmadev->nr_ahb_addr_masks = count;
 
        dmadev->nr_channels = nr_channels;
        dmadev->nr_requests = nr_requests;
        device_property_read_u32_array(&pdev->dev, "st,ahb-addr-masks",
                                       dmadev->ahb_addr_masks,
                                       count);
-       dmadev->nr_ahb_addr_masks = count;
 
        dmadev->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(dmadev->base))
index e86c8829513a3339d50b33a1497c18a4520a8c8f..2e7f9b07fdd29e2ecff58974322a8d36c3bbaff4 100644 (file)
@@ -1271,7 +1271,7 @@ err_clk_disable:
        return ret;
 }
 
-static int sun4i_dma_remove(struct platform_device *pdev)
+static void sun4i_dma_remove(struct platform_device *pdev)
 {
        struct sun4i_dma_dev *priv = platform_get_drvdata(pdev);
 
@@ -1282,8 +1282,6 @@ static int sun4i_dma_remove(struct platform_device *pdev)
        dma_async_device_unregister(&priv->slave);
 
        clk_disable_unprepare(priv->clk);
-
-       return 0;
 }
 
 static const struct of_device_id sun4i_dma_match[] = {
@@ -1294,7 +1292,7 @@ MODULE_DEVICE_TABLE(of, sun4i_dma_match);
 
 static struct platform_driver sun4i_dma_driver = {
        .probe  = sun4i_dma_probe,
-       .remove = sun4i_dma_remove,
+       .remove_new = sun4i_dma_remove,
        .driver = {
                .name           = "sun4i-dma",
                .of_match_table = sun4i_dma_match,
index 2469efddf540153d40bd4706e00f30874b94612f..583bf49031cf2dbf19f76bb87882fa4fbc82c6fb 100644 (file)
@@ -1470,7 +1470,7 @@ err_chan_free:
        return ret;
 }
 
-static int sun6i_dma_remove(struct platform_device *pdev)
+static void sun6i_dma_remove(struct platform_device *pdev)
 {
        struct sun6i_dma_dev *sdc = platform_get_drvdata(pdev);
 
@@ -1484,13 +1484,11 @@ static int sun6i_dma_remove(struct platform_device *pdev)
        reset_control_assert(sdc->rstc);
 
        sun6i_dma_free(sdc);
-
-       return 0;
 }
 
 static struct platform_driver sun6i_dma_driver = {
        .probe          = sun6i_dma_probe,
-       .remove         = sun6i_dma_remove,
+       .remove_new     = sun6i_dma_remove,
        .driver = {
                .name           = "sun6i-dma",
                .of_match_table = sun6i_dma_match,
index 33b10100110096f37b7a05f423d3a5b14539cb2f..fa4d4142a68a2183744a46f8d36da5e51fe2b18c 100644 (file)
@@ -221,7 +221,7 @@ struct tegra_dma_desc {
        unsigned int sg_count;
        struct virt_dma_desc vd;
        struct tegra_dma_channel *tdc;
-       struct tegra_dma_sg_req sg_req[];
+       struct tegra_dma_sg_req sg_req[] __counted_by(sg_count);
 };
 
 /*
@@ -1473,14 +1473,12 @@ static int tegra_dma_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int tegra_dma_remove(struct platform_device *pdev)
+static void tegra_dma_remove(struct platform_device *pdev)
 {
        struct tegra_dma *tdma = platform_get_drvdata(pdev);
 
        of_dma_controller_free(pdev->dev.of_node);
        dma_async_device_unregister(&tdma->dma_dev);
-
-       return 0;
 }
 
 static int __maybe_unused tegra_dma_pm_suspend(struct device *dev)
@@ -1533,7 +1531,7 @@ static struct platform_driver tegra_dma_driver = {
                .of_match_table = tegra_dma_of_match,
        },
        .probe          = tegra_dma_probe,
-       .remove         = tegra_dma_remove,
+       .remove_new     = tegra_dma_remove,
 };
 
 module_platform_driver(tegra_dma_driver);
index 063022f9df7633a2581de0d13f287781ccf9d2d8..ac69778827f2a2bb3863d3b1f32de050b02a3919 100644 (file)
@@ -1581,7 +1581,7 @@ err_clk_unprepare:
        return ret;
 }
 
-static int tegra_dma_remove(struct platform_device *pdev)
+static void tegra_dma_remove(struct platform_device *pdev)
 {
        struct tegra_dma *tdma = platform_get_drvdata(pdev);
 
@@ -1589,8 +1589,6 @@ static int tegra_dma_remove(struct platform_device *pdev)
        dma_async_device_unregister(&tdma->dma_dev);
        pm_runtime_disable(&pdev->dev);
        clk_unprepare(tdma->dma_clk);
-
-       return 0;
 }
 
 static int __maybe_unused tegra_dma_runtime_suspend(struct device *dev)
@@ -1677,7 +1675,7 @@ static struct platform_driver tegra_dmac_driver = {
                .of_match_table = tegra_dma_of_match,
        },
        .probe          = tegra_dma_probe,
-       .remove         = tegra_dma_remove,
+       .remove_new     = tegra_dma_remove,
 };
 
 module_platform_driver(tegra_dmac_driver);
index e557bada151073385f04fe0624c19da28eb7255a..7a0586633bf32624b442cf5569bacf9361408b78 100644 (file)
@@ -162,7 +162,7 @@ struct tegra_adma {
        const struct tegra_adma_chip_data *cdata;
 
        /* Last member of the structure */
-       struct tegra_adma_chan          channels[];
+       struct tegra_adma_chan          channels[] __counted_by(nr_channels);
 };
 
 static inline void tdma_write(struct tegra_adma *tdma, u32 reg, u32 val)
@@ -949,7 +949,7 @@ irq_dispose:
        return ret;
 }
 
-static int tegra_adma_remove(struct platform_device *pdev)
+static void tegra_adma_remove(struct platform_device *pdev)
 {
        struct tegra_adma *tdma = platform_get_drvdata(pdev);
        int i;
@@ -961,8 +961,6 @@ static int tegra_adma_remove(struct platform_device *pdev)
                irq_dispose_mapping(tdma->channels[i].irq);
 
        pm_runtime_disable(&pdev->dev);
-
-       return 0;
 }
 
 static const struct dev_pm_ops tegra_adma_dev_pm_ops = {
@@ -979,7 +977,7 @@ static struct platform_driver tegra_admac_driver = {
                .of_match_table = tegra_adma_of_match,
        },
        .probe          = tegra_adma_probe,
-       .remove         = tegra_adma_remove,
+       .remove_new     = tegra_adma_remove,
 };
 
 module_platform_driver(tegra_admac_driver);
index c3555cfb06817d69e182d3c650af631074b817d8..7e0b06b5dff020e7c421f89cc8dcf49bbc7dc494 100644 (file)
@@ -1156,7 +1156,7 @@ err_get_sync:
        return ret;
 }
 
-static int cppi41_dma_remove(struct platform_device *pdev)
+static void cppi41_dma_remove(struct platform_device *pdev)
 {
        struct cppi41_dd *cdd = platform_get_drvdata(pdev);
        int error;
@@ -1173,7 +1173,6 @@ static int cppi41_dma_remove(struct platform_device *pdev)
        pm_runtime_dont_use_autosuspend(&pdev->dev);
        pm_runtime_put_sync(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
-       return 0;
 }
 
 static int __maybe_unused cppi41_suspend(struct device *dev)
@@ -1244,7 +1243,7 @@ static const struct dev_pm_ops cppi41_pm_ops = {
 
 static struct platform_driver cpp41_dma_driver = {
        .probe  = cppi41_dma_probe,
-       .remove = cppi41_dma_remove,
+       .remove_new = cppi41_dma_remove,
        .driver = {
                .name = "cppi41-dma-engine",
                .pm = &cppi41_pm_ops,
index aa8e2e8ac260981d037f94b8995eb4c7b949d127..f1f920861fa9d8937a34bc29906778720a8dbfd8 100644 (file)
@@ -202,7 +202,7 @@ struct edma_desc {
        u32                             residue;
        u32                             residue_stat;
 
-       struct edma_pset                pset[];
+       struct edma_pset                pset[] __counted_by(pset_nr);
 };
 
 struct edma_cc;
@@ -2401,7 +2401,7 @@ static int edma_probe(struct platform_device *pdev)
        if (irq < 0 && node)
                irq = irq_of_parse_and_map(node, 0);
 
-       if (irq >= 0) {
+       if (irq > 0) {
                irq_name = devm_kasprintf(dev, GFP_KERNEL, "%s_ccint",
                                          dev_name(dev));
                ret = devm_request_irq(dev, irq, dma_irq_handler, 0, irq_name,
@@ -2417,7 +2417,7 @@ static int edma_probe(struct platform_device *pdev)
        if (irq < 0 && node)
                irq = irq_of_parse_and_map(node, 2);
 
-       if (irq >= 0) {
+       if (irq > 0) {
                irq_name = devm_kasprintf(dev, GFP_KERNEL, "%s_ccerrint",
                                          dev_name(dev));
                ret = devm_request_irq(dev, irq, dma_ccerr_handler, 0, irq_name,
@@ -2550,7 +2550,7 @@ static void edma_cleanupp_vchan(struct dma_device *dmadev)
        }
 }
 
-static int edma_remove(struct platform_device *pdev)
+static void edma_remove(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct edma_cc *ecc = dev_get_drvdata(dev);
@@ -2568,8 +2568,6 @@ static int edma_remove(struct platform_device *pdev)
        edma_free_slot(ecc, ecc->dummy_slot);
        pm_runtime_put_sync(dev);
        pm_runtime_disable(dev);
-
-       return 0;
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -2628,7 +2626,7 @@ static const struct dev_pm_ops edma_pm_ops = {
 
 static struct platform_driver edma_driver = {
        .probe          = edma_probe,
-       .remove         = edma_remove,
+       .remove_new     = edma_remove,
        .driver = {
                .name   = "edma",
                .pm     = &edma_pm_ops,
index cf96cf915c0c7483a6edf3e46048c90b8fc43a76..b9e0e22383b7202ba6c81d5a79cde1a7707a419d 100644 (file)
@@ -124,7 +124,7 @@ struct omap_desc {
        uint32_t csdp;          /* CSDP value */
 
        unsigned sglen;
-       struct omap_sg sg[];
+       struct omap_sg sg[] __counted_by(sglen);
 };
 
 enum {
@@ -1005,6 +1005,7 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
        d = kzalloc(struct_size(d, sg, sglen), GFP_ATOMIC);
        if (!d)
                return NULL;
+       d->sglen = sglen;
 
        d->dir = dir;
        d->dev_addr = dev_addr;
@@ -1120,8 +1121,6 @@ static struct dma_async_tx_descriptor *omap_dma_prep_slave_sg(
                }
        }
 
-       d->sglen = sglen;
-
        /* Release the dma_pool entries if one allocation failed */
        if (ll_failed) {
                for (i = 0; i < d->sglen; i++) {
@@ -1844,7 +1843,7 @@ static int omap_dma_probe(struct platform_device *pdev)
        return rc;
 }
 
-static int omap_dma_remove(struct platform_device *pdev)
+static void omap_dma_remove(struct platform_device *pdev)
 {
        struct omap_dmadev *od = platform_get_drvdata(pdev);
        int irq;
@@ -1869,8 +1868,6 @@ static int omap_dma_remove(struct platform_device *pdev)
                dma_pool_destroy(od->desc_pool);
 
        omap_dma_free(od);
-
-       return 0;
 }
 
 static const struct omap_dma_config omap2420_data = {
@@ -1918,7 +1915,7 @@ MODULE_DEVICE_TABLE(of, omap_dma_match);
 
 static struct platform_driver omap_dma_driver = {
        .probe  = omap_dma_probe,
-       .remove = omap_dma_remove,
+       .remove_new = omap_dma_remove,
        .driver = {
                .name = "omap-dma-engine",
                .of_match_table = omap_dma_match,
index 3f524be69efbf0b7bf656627d1f14970c7789b4a..7410025605e03420c7bc967c02e7240ecbad5c21 100644 (file)
@@ -740,7 +740,7 @@ err_release_region:
 
 }
 
-static int td_remove(struct platform_device *pdev)
+static void td_remove(struct platform_device *pdev)
 {
        struct timb_dma *td = platform_get_drvdata(pdev);
        struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -754,7 +754,6 @@ static int td_remove(struct platform_device *pdev)
        release_mem_region(iomem->start, resource_size(iomem));
 
        dev_dbg(&pdev->dev, "Removed...\n");
-       return 0;
 }
 
 static struct platform_driver td_driver = {
@@ -762,7 +761,7 @@ static struct platform_driver td_driver = {
                .name   = DRIVER_NAME,
        },
        .probe  = td_probe,
-       .remove = td_remove,
+       .remove_new = td_remove,
 };
 
 module_platform_driver(td_driver);
index 5b6b375a257ecbe974361486e177102ebc22d1ea..44ba377b4b5a5ed377db1a4ac8d0cc3c30508e3d 100644 (file)
@@ -1151,7 +1151,7 @@ static int __init txx9dmac_chan_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int txx9dmac_chan_remove(struct platform_device *pdev)
+static void txx9dmac_chan_remove(struct platform_device *pdev)
 {
        struct txx9dmac_chan *dc = platform_get_drvdata(pdev);
 
@@ -1162,7 +1162,6 @@ static int txx9dmac_chan_remove(struct platform_device *pdev)
                tasklet_kill(&dc->tasklet);
        }
        dc->ddev->chan[pdev->id % TXX9_DMA_MAX_NR_CHANNELS] = NULL;
-       return 0;
 }
 
 static int __init txx9dmac_probe(struct platform_device *pdev)
@@ -1215,7 +1214,7 @@ static int __init txx9dmac_probe(struct platform_device *pdev)
        return 0;
 }
 
-static int txx9dmac_remove(struct platform_device *pdev)
+static void txx9dmac_remove(struct platform_device *pdev)
 {
        struct txx9dmac_dev *ddev = platform_get_drvdata(pdev);
 
@@ -1224,7 +1223,6 @@ static int txx9dmac_remove(struct platform_device *pdev)
                devm_free_irq(&pdev->dev, ddev->irq, ddev);
                tasklet_kill(&ddev->tasklet);
        }
-       return 0;
 }
 
 static void txx9dmac_shutdown(struct platform_device *pdev)
@@ -1262,14 +1260,14 @@ static const struct dev_pm_ops txx9dmac_dev_pm_ops = {
 };
 
 static struct platform_driver txx9dmac_chan_driver = {
-       .remove         = txx9dmac_chan_remove,
+       .remove_new     = txx9dmac_chan_remove,
        .driver = {
                .name   = "txx9dmac-chan",
        },
 };
 
 static struct platform_driver txx9dmac_driver = {
-       .remove         = txx9dmac_remove,
+       .remove_new     = txx9dmac_remove,
        .shutdown       = txx9dmac_shutdown,
        .driver = {
                .name   = "txx9dmac",
index 290836b7e1be2b9ac86dbd437038d8c828a0832e..3a8ee2b173b52e83b775bbe27d5f715a205aef87 100644 (file)
@@ -80,7 +80,7 @@ struct uniphier_xdmac_desc {
        unsigned int nr_node;
        unsigned int cur_node;
        enum dma_transfer_direction dir;
-       struct uniphier_xdmac_desc_node nodes[];
+       struct uniphier_xdmac_desc_node nodes[] __counted_by(nr_node);
 };
 
 struct uniphier_xdmac_chan {
@@ -97,7 +97,7 @@ struct uniphier_xdmac_device {
        struct dma_device ddev;
        void __iomem *reg_base;
        int nr_chans;
-       struct uniphier_xdmac_chan channels[];
+       struct uniphier_xdmac_chan channels[] __counted_by(nr_chans);
 };
 
 static struct uniphier_xdmac_chan *
@@ -295,6 +295,7 @@ uniphier_xdmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,
        xd = kzalloc(struct_size(xd, nodes, nr), GFP_NOWAIT);
        if (!xd)
                return NULL;
+       xd->nr_node = nr;
 
        for (i = 0; i < nr; i++) {
                burst_size = min_t(size_t, len, XDMAC_MAX_WORD_SIZE);
@@ -309,7 +310,6 @@ uniphier_xdmac_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,
        }
 
        xd->dir = DMA_MEM_TO_MEM;
-       xd->nr_node = nr;
        xd->cur_node = 0;
 
        return vchan_tx_prep(vc, &xd->vd, flags);
@@ -351,6 +351,7 @@ uniphier_xdmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
        xd = kzalloc(struct_size(xd, nodes, sg_len), GFP_NOWAIT);
        if (!xd)
                return NULL;
+       xd->nr_node = sg_len;
 
        for_each_sg(sgl, sg, sg_len, i) {
                xd->nodes[i].src = (direction == DMA_DEV_TO_MEM)
@@ -385,7 +386,6 @@ uniphier_xdmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
        }
 
        xd->dir = direction;
-       xd->nr_node = sg_len;
        xd->cur_node = 0;
 
        return vchan_tx_prep(vc, &xd->vd, flags);
index bb4ff8c86733bf358b1ecb53142ea8c7b2efb176..fd4397adeb792ba4977438b67aad0fd7c8740102 100644 (file)
@@ -1776,7 +1776,7 @@ err_clk_enable:
        return ret;
 }
 
-static int xgene_dma_remove(struct platform_device *pdev)
+static void xgene_dma_remove(struct platform_device *pdev)
 {
        struct xgene_dma *pdma = platform_get_drvdata(pdev);
        struct xgene_dma_chan *chan;
@@ -1797,8 +1797,6 @@ static int xgene_dma_remove(struct platform_device *pdev)
 
        if (!IS_ERR(pdma->clk))
                clk_disable_unprepare(pdma->clk);
-
-       return 0;
 }
 
 #ifdef CONFIG_ACPI
@@ -1817,7 +1815,7 @@ MODULE_DEVICE_TABLE(of, xgene_dma_of_match_ptr);
 
 static struct platform_driver xgene_dma_driver = {
        .probe = xgene_dma_probe,
-       .remove = xgene_dma_remove,
+       .remove_new = xgene_dma_remove,
        .driver = {
                .name = "X-Gene-DMA",
                .of_match_table = xgene_dma_of_match_ptr,
index dd98b4526b90aa74106cf72dafcd920acfd582b4..e641a5083e14b081a7871b3a19bda0c57601d6b5 100644 (file)
@@ -44,6 +44,8 @@
         FIELD_PREP(XDMA_DESC_FLAGS_BITS, (flag)))
 #define XDMA_DESC_CONTROL_LAST                                         \
        XDMA_DESC_CONTROL(1, XDMA_DESC_STOPPED | XDMA_DESC_COMPLETED)
+#define XDMA_DESC_CONTROL_CYCLIC                                       \
+       XDMA_DESC_CONTROL(1, XDMA_DESC_COMPLETED)
 
 /*
  * Descriptor for a single contiguous memory block transfer.
index e0bfd129d563f3687a55e298d30157595245c3cf..84a88029226fdc16e423d8162408eea40cc22d00 100644 (file)
@@ -83,6 +83,9 @@ struct xdma_chan {
  * @dblk_num: Number of hardware descriptor blocks
  * @desc_num: Number of hardware descriptors
  * @completed_desc_num: Completed hardware descriptors
+ * @cyclic: Cyclic transfer vs. scatter-gather
+ * @periods: Number of periods in the cyclic transfer
+ * @period_size: Size of a period in bytes in cyclic transfers
  */
 struct xdma_desc {
        struct virt_dma_desc            vdesc;
@@ -93,6 +96,9 @@ struct xdma_desc {
        u32                             dblk_num;
        u32                             desc_num;
        u32                             completed_desc_num;
+       bool                            cyclic;
+       u32                             periods;
+       u32                             period_size;
 };
 
 #define XDMA_DEV_STATUS_REG_DMA                BIT(0)
@@ -137,10 +143,10 @@ static inline void *xdma_blk_last_desc(struct xdma_desc_block *block)
 }
 
 /**
- * xdma_link_desc_blocks - Link descriptor blocks for DMA transfer
+ * xdma_link_sg_desc_blocks - Link SG descriptor blocks for DMA transfer
  * @sw_desc: Tx descriptor pointer
  */
-static void xdma_link_desc_blocks(struct xdma_desc *sw_desc)
+static void xdma_link_sg_desc_blocks(struct xdma_desc *sw_desc)
 {
        struct xdma_desc_block *block;
        u32 last_blk_desc, desc_control;
@@ -174,6 +180,25 @@ static void xdma_link_desc_blocks(struct xdma_desc *sw_desc)
        desc->control = cpu_to_le32(XDMA_DESC_CONTROL_LAST);
 }
 
+/**
+ * xdma_link_cyclic_desc_blocks - Link cyclic descriptor blocks for DMA transfer
+ * @sw_desc: Tx descriptor pointer
+ */
+static void xdma_link_cyclic_desc_blocks(struct xdma_desc *sw_desc)
+{
+       struct xdma_desc_block *block;
+       struct xdma_hw_desc *desc;
+       int i;
+
+       block = sw_desc->desc_blocks;
+       for (i = 0; i < sw_desc->desc_num - 1; i++) {
+               desc = block->virt_addr + i * XDMA_DESC_SIZE;
+               desc->next_desc = cpu_to_le64(block->dma_addr + ((i + 1) * XDMA_DESC_SIZE));
+       }
+       desc = block->virt_addr + i * XDMA_DESC_SIZE;
+       desc->next_desc = cpu_to_le64(block->dma_addr);
+}
+
 static inline struct xdma_chan *to_xdma_chan(struct dma_chan *chan)
 {
        return container_of(chan, struct xdma_chan, vchan.chan);
@@ -231,14 +256,16 @@ static void xdma_free_desc(struct virt_dma_desc *vdesc)
  * xdma_alloc_desc - Allocate descriptor
  * @chan: DMA channel pointer
  * @desc_num: Number of hardware descriptors
+ * @cyclic: Whether this is a cyclic transfer
  */
 static struct xdma_desc *
-xdma_alloc_desc(struct xdma_chan *chan, u32 desc_num)
+xdma_alloc_desc(struct xdma_chan *chan, u32 desc_num, bool cyclic)
 {
        struct xdma_desc *sw_desc;
        struct xdma_hw_desc *desc;
        dma_addr_t dma_addr;
        u32 dblk_num;
+       u32 control;
        void *addr;
        int i, j;
 
@@ -248,12 +275,18 @@ xdma_alloc_desc(struct xdma_chan *chan, u32 desc_num)
 
        sw_desc->chan = chan;
        sw_desc->desc_num = desc_num;
+       sw_desc->cyclic = cyclic;
        dblk_num = DIV_ROUND_UP(desc_num, XDMA_DESC_ADJACENT);
        sw_desc->desc_blocks = kcalloc(dblk_num, sizeof(*sw_desc->desc_blocks),
                                       GFP_NOWAIT);
        if (!sw_desc->desc_blocks)
                goto failed;
 
+       if (cyclic)
+               control = XDMA_DESC_CONTROL_CYCLIC;
+       else
+               control = XDMA_DESC_CONTROL(1, 0);
+
        sw_desc->dblk_num = dblk_num;
        for (i = 0; i < sw_desc->dblk_num; i++) {
                addr = dma_pool_alloc(chan->desc_pool, GFP_NOWAIT, &dma_addr);
@@ -263,10 +296,13 @@ xdma_alloc_desc(struct xdma_chan *chan, u32 desc_num)
                sw_desc->desc_blocks[i].virt_addr = addr;
                sw_desc->desc_blocks[i].dma_addr = dma_addr;
                for (j = 0, desc = addr; j < XDMA_DESC_ADJACENT; j++)
-                       desc[j].control = cpu_to_le32(XDMA_DESC_CONTROL(1, 0));
+                       desc[j].control = cpu_to_le32(control);
        }
 
-       xdma_link_desc_blocks(sw_desc);
+       if (cyclic)
+               xdma_link_cyclic_desc_blocks(sw_desc);
+       else
+               xdma_link_sg_desc_blocks(sw_desc);
 
        return sw_desc;
 
@@ -466,7 +502,7 @@ xdma_prep_device_sg(struct dma_chan *chan, struct scatterlist *sgl,
        for_each_sg(sgl, sg, sg_len, i)
                desc_num += DIV_ROUND_UP(sg_dma_len(sg), XDMA_DESC_BLEN_MAX);
 
-       sw_desc = xdma_alloc_desc(xdma_chan, desc_num);
+       sw_desc = xdma_alloc_desc(xdma_chan, desc_num, false);
        if (!sw_desc)
                return NULL;
        sw_desc->dir = dir;
@@ -521,6 +557,81 @@ failed:
        return NULL;
 }
 
+/**
+ * xdma_prep_dma_cyclic - prepare for cyclic DMA transactions
+ * @chan: DMA channel pointer
+ * @address: Device DMA address to access
+ * @size: Total length to transfer
+ * @period_size: Period size to use for each transfer
+ * @dir: Transfer direction
+ * @flags: Transfer ack flags
+ */
+static struct dma_async_tx_descriptor *
+xdma_prep_dma_cyclic(struct dma_chan *chan, dma_addr_t address,
+                    size_t size, size_t period_size,
+                    enum dma_transfer_direction dir,
+                    unsigned long flags)
+{
+       struct xdma_chan *xdma_chan = to_xdma_chan(chan);
+       struct xdma_device *xdev = xdma_chan->xdev_hdl;
+       unsigned int periods = size / period_size;
+       struct dma_async_tx_descriptor *tx_desc;
+       struct xdma_desc_block *dblk;
+       struct xdma_hw_desc *desc;
+       struct xdma_desc *sw_desc;
+       unsigned int i;
+
+       /*
+        * Simplify the whole logic by preventing an abnormally high number of
+        * periods and periods size.
+        */
+       if (period_size > XDMA_DESC_BLEN_MAX) {
+               xdma_err(xdev, "period size limited to %lu bytes\n", XDMA_DESC_BLEN_MAX);
+               return NULL;
+       }
+
+       if (periods > XDMA_DESC_ADJACENT) {
+               xdma_err(xdev, "number of periods limited to %u\n", XDMA_DESC_ADJACENT);
+               return NULL;
+       }
+
+       sw_desc = xdma_alloc_desc(xdma_chan, periods, true);
+       if (!sw_desc)
+               return NULL;
+
+       sw_desc->periods = periods;
+       sw_desc->period_size = period_size;
+       sw_desc->dir = dir;
+
+       dblk = sw_desc->desc_blocks;
+       desc = dblk->virt_addr;
+
+       /* fill hardware descriptor */
+       for (i = 0; i < periods; i++) {
+               desc->bytes = cpu_to_le32(period_size);
+               if (dir == DMA_MEM_TO_DEV) {
+                       desc->src_addr = cpu_to_le64(address + i * period_size);
+                       desc->dst_addr = cpu_to_le64(xdma_chan->cfg.dst_addr);
+               } else {
+                       desc->src_addr = cpu_to_le64(xdma_chan->cfg.src_addr);
+                       desc->dst_addr = cpu_to_le64(address + i * period_size);
+               }
+
+               desc++;
+       }
+
+       tx_desc = vchan_tx_prep(&xdma_chan->vchan, &sw_desc->vdesc, flags);
+       if (!tx_desc)
+               goto failed;
+
+       return tx_desc;
+
+failed:
+       xdma_free_desc(&sw_desc->vdesc);
+
+       return NULL;
+}
+
 /**
  * xdma_device_config - Configure the DMA channel
  * @chan: DMA channel
@@ -577,6 +688,41 @@ static int xdma_alloc_chan_resources(struct dma_chan *chan)
        return 0;
 }
 
+static enum dma_status xdma_tx_status(struct dma_chan *chan, dma_cookie_t cookie,
+                                     struct dma_tx_state *state)
+{
+       struct xdma_chan *xdma_chan = to_xdma_chan(chan);
+       struct xdma_desc *desc = NULL;
+       struct virt_dma_desc *vd;
+       enum dma_status ret;
+       unsigned long flags;
+       unsigned int period_idx;
+       u32 residue = 0;
+
+       ret = dma_cookie_status(chan, cookie, state);
+       if (ret == DMA_COMPLETE)
+               return ret;
+
+       spin_lock_irqsave(&xdma_chan->vchan.lock, flags);
+
+       vd = vchan_find_desc(&xdma_chan->vchan, cookie);
+       if (vd)
+               desc = to_xdma_desc(vd);
+       if (!desc || !desc->cyclic) {
+               spin_unlock_irqrestore(&xdma_chan->vchan.lock, flags);
+               return ret;
+       }
+
+       period_idx = desc->completed_desc_num % desc->periods;
+       residue = (desc->periods - period_idx) * desc->period_size;
+
+       spin_unlock_irqrestore(&xdma_chan->vchan.lock, flags);
+
+       dma_set_residue(state, residue);
+
+       return ret;
+}
+
 /**
  * xdma_channel_isr - XDMA channel interrupt handler
  * @irq: IRQ number
@@ -590,6 +736,7 @@ static irqreturn_t xdma_channel_isr(int irq, void *dev_id)
        struct virt_dma_desc *vd;
        struct xdma_desc *desc;
        int ret;
+       u32 st;
 
        spin_lock(&xchan->vchan.lock);
 
@@ -608,6 +755,19 @@ static irqreturn_t xdma_channel_isr(int irq, void *dev_id)
                goto out;
 
        desc->completed_desc_num += complete_desc_num;
+
+       if (desc->cyclic) {
+               ret = regmap_read(xdev->rmap, xchan->base + XDMA_CHAN_STATUS,
+                                 &st);
+               if (ret)
+                       goto out;
+
+               regmap_write(xdev->rmap, xchan->base + XDMA_CHAN_STATUS, st);
+
+               vchan_cyclic_callback(vd);
+               goto out;
+       }
+
        /*
         * if all data blocks are transferred, remove and complete the request
         */
@@ -621,7 +781,7 @@ static irqreturn_t xdma_channel_isr(int irq, void *dev_id)
            complete_desc_num != XDMA_DESC_BLOCK_NUM * XDMA_DESC_ADJACENT)
                goto out;
 
-       /* transfer the rest of data */
+       /* transfer the rest of data (SG only) */
        xdma_xfer_start(xchan);
 
 out:
@@ -841,7 +1001,7 @@ EXPORT_SYMBOL(xdma_get_user_irq);
  * xdma_remove - Driver remove function
  * @pdev: Pointer to the platform_device structure
  */
-static int xdma_remove(struct platform_device *pdev)
+static void xdma_remove(struct platform_device *pdev)
 {
        struct xdma_device *xdev = platform_get_drvdata(pdev);
 
@@ -850,8 +1010,6 @@ static int xdma_remove(struct platform_device *pdev)
 
        if (xdev->status & XDMA_DEV_STATUS_REG_DMA)
                dma_async_device_unregister(&xdev->dma_dev);
-
-       return 0;
 }
 
 /**
@@ -885,7 +1043,7 @@ static int xdma_probe(struct platform_device *pdev)
                goto failed;
        }
        xdev->irq_start = res->start;
-       xdev->irq_num = res->end - res->start + 1;
+       xdev->irq_num = resource_size(res);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
@@ -921,17 +1079,20 @@ static int xdma_probe(struct platform_device *pdev)
 
        dma_cap_set(DMA_SLAVE, xdev->dma_dev.cap_mask);
        dma_cap_set(DMA_PRIVATE, xdev->dma_dev.cap_mask);
+       dma_cap_set(DMA_CYCLIC, xdev->dma_dev.cap_mask);
 
        xdev->dma_dev.dev = &pdev->dev;
+       xdev->dma_dev.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT;
        xdev->dma_dev.device_free_chan_resources = xdma_free_chan_resources;
        xdev->dma_dev.device_alloc_chan_resources = xdma_alloc_chan_resources;
-       xdev->dma_dev.device_tx_status = dma_cookie_status;
+       xdev->dma_dev.device_tx_status = xdma_tx_status;
        xdev->dma_dev.device_prep_slave_sg = xdma_prep_device_sg;
        xdev->dma_dev.device_config = xdma_device_config;
        xdev->dma_dev.device_issue_pending = xdma_issue_pending;
        xdev->dma_dev.filter.map = pdata->device_map;
        xdev->dma_dev.filter.mapcnt = pdata->device_map_cnt;
        xdev->dma_dev.filter.fn = xdma_filter_fn;
+       xdev->dma_dev.device_prep_dma_cyclic = xdma_prep_dma_cyclic;
 
        ret = dma_async_device_register(&xdev->dma_dev);
        if (ret) {
@@ -966,7 +1127,7 @@ static struct platform_driver xdma_driver = {
        },
        .id_table       = xdma_id_table,
        .probe          = xdma_probe,
-       .remove         = xdma_remove,
+       .remove_new     = xdma_remove,
 };
 
 module_platform_driver(xdma_driver);
index 0a3b2e22f23dbbf339f8ca28b32b6e57942abc78..e40696f6f8647de7f3d869be1684891725f903d7 100644 (file)
@@ -3242,10 +3242,8 @@ disable_clks:
 /**
  * xilinx_dma_remove - Driver remove function
  * @pdev: Pointer to the platform_device structure
- *
- * Return: Always '0'
  */
-static int xilinx_dma_remove(struct platform_device *pdev)
+static void xilinx_dma_remove(struct platform_device *pdev)
 {
        struct xilinx_dma_device *xdev = platform_get_drvdata(pdev);
        int i;
@@ -3259,8 +3257,6 @@ static int xilinx_dma_remove(struct platform_device *pdev)
                        xilinx_dma_chan_remove(xdev->chan[i]);
 
        xdma_disable_allclks(xdev);
-
-       return 0;
 }
 
 static struct platform_driver xilinx_vdma_driver = {
@@ -3269,7 +3265,7 @@ static struct platform_driver xilinx_vdma_driver = {
                .of_match_table = xilinx_dma_of_ids,
        },
        .probe = xilinx_dma_probe,
-       .remove = xilinx_dma_remove,
+       .remove_new = xilinx_dma_remove,
 };
 
 module_platform_driver(xilinx_vdma_driver);
index 84dc5240a8074ad3f184df62696ed8c902b58a9e..69587d85a7cd20417b83be157aa4134784eae389 100644 (file)
@@ -1736,7 +1736,7 @@ error:
        return ret;
 }
 
-static int xilinx_dpdma_remove(struct platform_device *pdev)
+static void xilinx_dpdma_remove(struct platform_device *pdev)
 {
        struct xilinx_dpdma_device *xdev = platform_get_drvdata(pdev);
        unsigned int i;
@@ -1751,8 +1751,6 @@ static int xilinx_dpdma_remove(struct platform_device *pdev)
 
        for (i = 0; i < ARRAY_SIZE(xdev->chan); i++)
                xilinx_dpdma_chan_remove(xdev->chan[i]);
-
-       return 0;
 }
 
 static const struct of_device_id xilinx_dpdma_of_match[] = {
@@ -1763,7 +1761,7 @@ MODULE_DEVICE_TABLE(of, xilinx_dpdma_of_match);
 
 static struct platform_driver xilinx_dpdma_driver = {
        .probe                  = xilinx_dpdma_probe,
-       .remove                 = xilinx_dpdma_remove,
+       .remove_new             = xilinx_dpdma_remove,
        .driver                 = {
                .name           = "xilinx-zynqmp-dpdma",
                .of_match_table = xilinx_dpdma_of_match,
index bd8c3cc2eaab6f84e5485d9e4b9a9d36e86003b7..f31631bef961a979c0de5515391b0572e18a2ee0 100644 (file)
@@ -1147,7 +1147,7 @@ err_disable_pm:
  *
  * Return: Always '0'
  */
-static int zynqmp_dma_remove(struct platform_device *pdev)
+static void zynqmp_dma_remove(struct platform_device *pdev)
 {
        struct zynqmp_dma_device *zdev = platform_get_drvdata(pdev);
 
@@ -1158,8 +1158,6 @@ static int zynqmp_dma_remove(struct platform_device *pdev)
        pm_runtime_disable(zdev->dev);
        if (!pm_runtime_enabled(zdev->dev))
                zynqmp_dma_runtime_suspend(zdev->dev);
-
-       return 0;
 }
 
 static const struct of_device_id zynqmp_dma_of_match[] = {
@@ -1175,7 +1173,7 @@ static struct platform_driver zynqmp_dma_driver = {
                .pm = &zynqmp_dma_dev_pm_ops,
        },
        .probe = zynqmp_dma_probe,
-       .remove = zynqmp_dma_remove,
+       .remove_new = zynqmp_dma_remove,
 };
 
 module_platform_driver(zynqmp_dma_driver);
index c3656e59021310d7dc57c5a2dabdf029c95ac5f3..3df70d6131c8fee686ffbd8ecfc7e7c432370bac 100644 (file)
@@ -517,8 +517,6 @@ static inline const char *dma_chan_name(struct dma_chan *chan)
        return dev_name(&chan->dev->device);
 }
 
-void dma_chan_cleanup(struct kref *kref);
-
 /**
  * typedef dma_filter_fn - callback filter for dma_request_channel
  * @chan: channel to be reviewed
index 606b52e88ce335b02e3efa5a558fd3bba20481ab..3d1987e1bb2dd65557d11c2fe99c89c2d9b1704c 100644 (file)
@@ -31,6 +31,7 @@ enum idxd_scmd_stat {
        IDXD_SCMD_WQ_IRQ_ERR = 0x80100000,
        IDXD_SCMD_WQ_USER_NO_IOMMU = 0x80110000,
        IDXD_SCMD_DEV_EVL_ERR = 0x80120000,
+       IDXD_SCMD_WQ_NO_DRV_NAME = 0x80200000,
 };
 
 #define IDXD_SCMD_SOFTERR_MASK 0x80000000