aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/amba-pl08x.c
diff options
context:
space:
mode:
authorRussell King - ARM Linux <linux@arm.linux.org.uk>2011-08-31 04:34:35 -0400
committerVinod Koul <vinod.koul@intel.com>2011-09-05 09:27:38 -0400
commit7703eac96abd119dcfbb04f287a5127462d18269 (patch)
tree75de31e4ddfe8f1899b7547d40e84be6d5b4face /drivers/dma/amba-pl08x.c
parent503473ac2a3952e6af254b0769fe788a67d797e5 (diff)
dmaengine: amba-pl08x: make filter check that the channel is owned by pl08x
Before converting the dma channel to our private data structure, first check that the channel is indeed one which our driver registered. We do this by ensuring that the underlying device is bound to our driver. This avoids potential oopses if we try to reference 'plchan->name' against a foreign drivers dma channel. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Diffstat (limited to 'drivers/dma/amba-pl08x.c')
-rw-r--r--drivers/dma/amba-pl08x.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/dma/amba-pl08x.c b/drivers/dma/amba-pl08x.c
index 3c2cad5b1165..cd8df7f5b5c8 100644
--- a/drivers/dma/amba-pl08x.c
+++ b/drivers/dma/amba-pl08x.c
@@ -87,6 +87,8 @@
87 87
88#define DRIVER_NAME "pl08xdmac" 88#define DRIVER_NAME "pl08xdmac"
89 89
90static struct amba_driver pl08x_amba_driver;
91
90/** 92/**
91 * struct vendor_data - vendor-specific config parameters for PL08x derivatives 93 * struct vendor_data - vendor-specific config parameters for PL08x derivatives
92 * @channels: the number of channels available in this variant 94 * @channels: the number of channels available in this variant
@@ -1420,9 +1422,15 @@ static int pl08x_control(struct dma_chan *chan, enum dma_ctrl_cmd cmd,
1420 1422
1421bool pl08x_filter_id(struct dma_chan *chan, void *chan_id) 1423bool pl08x_filter_id(struct dma_chan *chan, void *chan_id)
1422{ 1424{
1423 struct pl08x_dma_chan *plchan = to_pl08x_chan(chan); 1425 struct pl08x_dma_chan *plchan;
1424 char *name = chan_id; 1426 char *name = chan_id;
1425 1427
1428 /* Reject channels for devices not bound to this driver */
1429 if (chan->device->dev->driver != &pl08x_amba_driver.drv)
1430 return false;
1431
1432 plchan = to_pl08x_chan(chan);
1433
1426 /* Check that the channel is not taken! */ 1434 /* Check that the channel is not taken! */
1427 if (!strcmp(plchan->name, name)) 1435 if (!strcmp(plchan->name, name))
1428 return true; 1436 return true;