mcbuf_sz means bytes to allocate for MicroCode buffer. flags is for irq sharing, default is non-shared, in AMD Carrizo, pl330 shares IRQ with its corresponding UART device. Signed-off-by: Wang Hongcheng <annie.wang@xxxxxxx> --- drivers/acpi/acpi_apd.c | 17 +++++++++++++++++ drivers/dma/pl330.c | 9 ++++++++- include/linux/amba/pl330.h | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/acpi/acpi_apd.c b/drivers/acpi/acpi_apd.c index 9520daf..4d71a65 100644 --- a/drivers/acpi/acpi_apd.c +++ b/drivers/acpi/acpi_apd.c @@ -20,6 +20,9 @@ #include <linux/pm.h> #include <linux/amba/bus.h> #include <linux/dma-mapping.h> +#include <linux/dmaengine.h> +#include <linux/interrupt.h> +#include <linux/amba/pl330.h> #include "internal.h" @@ -33,6 +36,14 @@ struct apd_private_data; #define ACPI_APD_SYSFS BIT(0) #define ACPI_APD_PM BIT(1) +static u8 peri_id[2] = { 0, 1 }; + +static struct dma_pl330_platdata amd_pl330 = { + .nr_valid_peri = 2, + .peri_id = peri_id, + .mcbuf_sz = 0, + .flags = IRQF_SHARED, +}; /** * struct apd_device_desc - a descriptor for apd device * @flags: device flags like %ACPI_APD_SYSFS, %ACPI_APD_PM @@ -150,6 +161,12 @@ static int acpi_apd_setup_quirks(struct apd_private_data *pdata) goto amba_register_err; kfree(resource); + + dma_cap_set(DMA_MEMCPY, amd_pl330.cap_mask); + dma_cap_set(DMA_SLAVE, amd_pl330.cap_mask); + dma_cap_set(DMA_CYCLIC, amd_pl330.cap_mask); + dma_cap_set(DMA_PRIVATE, amd_pl330.cap_mask); + return 0; amba_register_err: diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index 17ee758..5e5fb46 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -26,6 +26,8 @@ #include <linux/scatterlist.h> #include <linux/of.h> #include <linux/of_dma.h> +#include <linux/acpi.h> +#include <linux/acpi_dma.h> #include <linux/err.h> #include <linux/pm_runtime.h> @@ -488,6 +490,9 @@ struct pl330_dmac { /* Peripheral channels connected to this DMAC */ unsigned int num_peripherals; struct dma_pl330_chan *peripherals; /* keep at end */ + + /*IRQ register flags */ + unsigned int flags; }; struct dma_pl330_desc { @@ -2800,6 +2805,8 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) pl330->mcbufsz = pdat ? pdat->mcbuf_sz : 0; + pl330->flags = pdat ? pdat->flags : IRQF_TRIGGER_NONE; + res = &adev->res; pl330->base = devm_ioremap_resource(&adev->dev, res); if (IS_ERR(pl330->base)) @@ -2811,7 +2818,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) irq = adev->irq[i]; if (irq) { ret = devm_request_irq(&adev->dev, irq, - pl330_irq_handler, 0, + pl330_irq_handler, pl330->flags, dev_name(&adev->dev), pl330); if (ret) return ret; diff --git a/include/linux/amba/pl330.h b/include/linux/amba/pl330.h index fe93758..cdc80f0 100644 --- a/include/linux/amba/pl330.h +++ b/include/linux/amba/pl330.h @@ -29,6 +29,8 @@ struct dma_pl330_platdata { dma_cap_mask_t cap_mask; /* Bytes to allocate for MC buffer */ unsigned mcbuf_sz; + /*flags for irq sharing, default is non-shared*/ + unsigned flags; }; extern bool pl330_filter(struct dma_chan *chan, void *param); -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe dmaengine" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html