mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-02 07:11:12 +00:00
DMA: PL330: Add new pl330 filter for DT case.
This patch adds a new pl330_dt_filter for DT case to filter the required channel based on the new filter params and modifies the old filter only for non-DT case as suggested by Arnd Bergmann. Signed-off-by: Padmavathi Venna <padma.v@samsung.com> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
This commit is contained in:
parent
a72208733f
commit
34d19355b8
@ -606,6 +606,11 @@ struct dma_pl330_desc {
|
|||||||
struct dma_pl330_chan *pchan;
|
struct dma_pl330_chan *pchan;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct dma_pl330_filter_args {
|
||||||
|
struct dma_pl330_dmac *pdmac;
|
||||||
|
unsigned int chan_id;
|
||||||
|
};
|
||||||
|
|
||||||
static inline void _callback(struct pl330_req *r, enum pl330_op_err err)
|
static inline void _callback(struct pl330_req *r, enum pl330_op_err err)
|
||||||
{
|
{
|
||||||
if (r && r->xfer_cb)
|
if (r && r->xfer_cb)
|
||||||
@ -2352,6 +2357,16 @@ static void dma_pl330_rqcb(void *token, enum pl330_op_err err)
|
|||||||
tasklet_schedule(&pch->task);
|
tasklet_schedule(&pch->task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool pl330_dt_filter(struct dma_chan *chan, void *param)
|
||||||
|
{
|
||||||
|
struct dma_pl330_filter_args *fargs = param;
|
||||||
|
|
||||||
|
if (chan->device != &fargs->pdmac->ddma)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return (chan->chan_id == fargs->chan_id);
|
||||||
|
}
|
||||||
|
|
||||||
bool pl330_filter(struct dma_chan *chan, void *param)
|
bool pl330_filter(struct dma_chan *chan, void *param)
|
||||||
{
|
{
|
||||||
u8 *peri_id;
|
u8 *peri_id;
|
||||||
@ -2359,20 +2374,6 @@ bool pl330_filter(struct dma_chan *chan, void *param)
|
|||||||
if (chan->device->dev->driver != &pl330_driver.drv)
|
if (chan->device->dev->driver != &pl330_driver.drv)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
if (chan->device->dev->of_node) {
|
|
||||||
const __be32 *prop_value;
|
|
||||||
phandle phandle;
|
|
||||||
struct device_node *node;
|
|
||||||
|
|
||||||
prop_value = ((struct property *)param)->value;
|
|
||||||
phandle = be32_to_cpup(prop_value++);
|
|
||||||
node = of_find_node_by_phandle(phandle);
|
|
||||||
return ((chan->private == node) &&
|
|
||||||
(chan->chan_id == be32_to_cpup(prop_value)));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
peri_id = chan->private;
|
peri_id = chan->private;
|
||||||
return *peri_id == (unsigned)param;
|
return *peri_id == (unsigned)param;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user