From a2b9c044e98091e7c48e2dfc5460f7d112220603 Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Wed, 3 Apr 2019 13:01:54 -0700 Subject: [PATCH] v4l: xilinx: scd: Allocate all channels in one go This eases memory management and channels initialization, we don't have to iterate over subnodes anymore. Signed-off-by: Laurent Pinchart Signed-off-by: Satish Kumar Nagireddy Reviewed-by: Hyun Kwon --- .../media/platform/xilinx/xilinx-scenechange-channel.c | 8 +------- drivers/media/platform/xilinx/xilinx-scenechange-dma.c | 4 ++-- drivers/media/platform/xilinx/xilinx-scenechange.c | 9 ++++++++- drivers/media/platform/xilinx/xilinx-scenechange.h | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/xilinx/xilinx-scenechange-channel.c b/drivers/media/platform/xilinx/xilinx-scenechange-channel.c index 80923b5f1355..2161de7de0ab 100644 --- a/drivers/media/platform/xilinx/xilinx-scenechange-channel.c +++ b/drivers/media/platform/xilinx/xilinx-scenechange-channel.c @@ -357,17 +357,11 @@ void xscd_chan_irq_handler(struct xscd_chan *chan) int xscd_chan_init(struct xscd_device *xscd, unsigned int chan_id, struct device_node *node) { - struct xscd_chan *chan; + struct xscd_chan *chan = &xscd->chans[chan_id]; struct v4l2_subdev *subdev; unsigned int num_pads; int ret; - chan = devm_kzalloc(xscd->dev, sizeof(*chan), GFP_KERNEL); - if (!chan) - return -ENOMEM; - - xscd->chans[chan_id] = chan; - mutex_init(&chan->lock); chan->xscd = xscd; chan->id = chan_id; diff --git a/drivers/media/platform/xilinx/xilinx-scenechange-dma.c b/drivers/media/platform/xilinx/xilinx-scenechange-dma.c index 472341516220..b6fd1ce1e2c2 100644 --- a/drivers/media/platform/xilinx/xilinx-scenechange-dma.c +++ b/drivers/media/platform/xilinx/xilinx-scenechange-dma.c @@ -442,7 +442,7 @@ static struct dma_chan *of_scdma_xilinx_xlate(struct of_phandle_args *dma_spec, static void xscd_dma_chan_init(struct xscd_device *xscd, int chan_id) { - struct xscd_dma_chan *chan = &xscd->chans[chan_id]->dmachan; + struct xscd_dma_chan *chan = &xscd->chans[chan_id].dmachan; chan->id = chan_id; chan->iomem = xscd->iomem + chan->id * XSCD_CHAN_OFFSET; @@ -511,7 +511,7 @@ int xscd_dma_init(struct xscd_device *xscd) goto error_of_dma; } - dev_info(xscd->dev, "Xilinx Scene Change DMA is probed!\n"); + dev_info(xscd->dev, "Xilinx Scene Change DMA is initialized!\n"); return 0; error_of_dma: diff --git a/drivers/media/platform/xilinx/xilinx-scenechange.c b/drivers/media/platform/xilinx/xilinx-scenechange.c index 8feada6703d1..b1d7daed8dd7 100644 --- a/drivers/media/platform/xilinx/xilinx-scenechange.c +++ b/drivers/media/platform/xilinx/xilinx-scenechange.c @@ -26,7 +26,7 @@ static irqreturn_t xscd_irq_handler(int irq, void *data) xscd_write(xscd->iomem, XSCD_ISR_OFFSET, XSCD_IE_AP_DONE); for (i = 0; i < xscd->num_streams; ++i) - xscd_chan_irq_handler(xscd->chans[i]); + xscd_chan_irq_handler(&xscd->chans[i]); xscd_dma_irq_handler(xscd); @@ -111,6 +111,12 @@ static int xscd_probe(struct platform_device *pdev) gpiod_set_value_cansleep(xscd->rst_gpio, XSCD_RESET_ASSERT); gpiod_set_value_cansleep(xscd->rst_gpio, XSCD_RESET_DEASSERT); + /* Initialize the channels. */ + xscd->chans = devm_kcalloc(xscd->dev, xscd->num_streams, + sizeof(*xscd->chans), GFP_KERNEL); + if (!xscd->chans) + return -ENOMEM; + id = 0; for_each_child_of_node(xscd->dev->of_node, subdev_node) { if (id >= xscd->num_streams) { @@ -131,6 +137,7 @@ static int xscd_probe(struct platform_device *pdev) id++; } + /* Initialize the DMA engine. */ ret = xscd_dma_init(xscd); if (ret < 0) dev_err(&pdev->dev, "Failed to initialize the DMA\n"); diff --git a/drivers/media/platform/xilinx/xilinx-scenechange.h b/drivers/media/platform/xilinx/xilinx-scenechange.h index 18b4d8a8b886..e19a497b70ca 100644 --- a/drivers/media/platform/xilinx/xilinx-scenechange.h +++ b/drivers/media/platform/xilinx/xilinx-scenechange.h @@ -195,7 +195,7 @@ struct xscd_device { u8 memory_based; int num_streams; - struct xscd_chan *chans[XSCD_MAX_CHANNELS]; + struct xscd_chan *chans; struct dma_device dma_device; struct xscd_dma_chan *channels[XSCD_MAX_CHANNELS]; -- 2.39.2