]> rtime.felk.cvut.cz Git - zynq/linux.git/commitdiff
v4l: xilinx: scd: Initialize DMA channels in xilinx-scenechange-dma.c
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Wed, 3 Apr 2019 20:01:53 +0000 (13:01 -0700)
committerMichal Simek <michal.simek@xilinx.com>
Fri, 5 Apr 2019 11:03:49 +0000 (13:03 +0200)
Most of the DMA channel initialization is performed in
xilinx-scenechange-dma.c, but a small part is in
xilinx-scenechange-channel.c. Move all the initialization code to
xilinx-scenechange-dma.c, rename the xscd_dma_chan_probe() function to
xscd_dma_chan_init(), and simplify the code as the function can't fail.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Hyun Kwon <hyun.kwon@xilinx.com>
drivers/media/platform/xilinx/xilinx-scenechange-channel.c
drivers/media/platform/xilinx/xilinx-scenechange-dma.c

index bff7f06dd5195805b7619bffa6d811dc0580df86..80923b5f1355b2785f05896df3928c81cba37cc4 100644 (file)
@@ -372,10 +372,6 @@ int xscd_chan_init(struct xscd_device *xscd, unsigned int chan_id,
        chan->xscd = xscd;
        chan->id = chan_id;
        chan->iomem = chan->xscd->iomem + chan->id * XSCD_CHAN_OFFSET;
-       chan->dmachan.id = chan->id;
-       chan->dmachan.iomem = chan->iomem;
-
-       xscd->channels[chan->id] = &chan->dmachan;
 
        /* Initialize V4L2 subdevice and media entity */
        subdev = &chan->subdev;
index d9c9c84d063c7b1582508ef27773b40529763b28..4723415162208ae908c8972571efd5035ec1ccb5 100644 (file)
@@ -241,15 +241,6 @@ static void xscd_dma_chan_desc_cleanup(struct xscd_dma_chan *chan)
        spin_unlock_irqrestore(&chan->lock, flags);
 }
 
-/**
- * xscd_dma_chan_remove - Per Channel remove function
- * @chan: Driver specific DMA channel
- */
-static void xscd_dma_chan_remove(struct xscd_dma_chan *chan)
-{
-       list_del(&chan->common.device_node);
-}
-
 /**
  * xscd_dma_dma_prep_interleaved - prepare a descriptor for a
  * DMA_SLAVE transaction
@@ -449,14 +440,17 @@ static struct dma_chan *of_scdma_xilinx_xlate(struct of_phandle_args *dma_spec,
        return dma_get_slave_channel(&xscd->channels[chan_id]->common);
 }
 
-static struct xscd_dma_chan *
-xscd_dma_chan_probe(struct xscd_device *xscd, int chan_id)
+static void xscd_dma_chan_init(struct xscd_device *xscd, int chan_id)
 {
-       struct xscd_dma_chan *chan = xscd->channels[chan_id];
+       struct xscd_dma_chan *chan = &xscd->chans[chan_id]->dmachan;
 
+       chan->id = chan_id;
+       chan->iomem = xscd->iomem + chan->id * XSCD_CHAN_OFFSET;
        chan->xscd = xscd;
        chan->idle = true;
 
+       xscd->channels[chan->id] = chan;
+
        spin_lock_init(&chan->lock);
        INIT_LIST_HEAD(&chan->pending_list);
        INIT_LIST_HEAD(&chan->done_list);
@@ -464,8 +458,15 @@ xscd_dma_chan_probe(struct xscd_device *xscd, int chan_id)
                     (unsigned long)chan);
        chan->common.device = &xscd->dma_device;
        list_add_tail(&chan->common.device_node, &xscd->dma_device.channels);
+}
 
-       return chan;
+/**
+ * xscd_dma_chan_remove - Per Channel remove function
+ * @chan: Driver specific DMA channel
+ */
+static void xscd_dma_chan_remove(struct xscd_dma_chan *chan)
+{
+       list_del(&chan->common.device_node);
 }
 
 /**
@@ -477,7 +478,6 @@ xscd_dma_chan_probe(struct xscd_device *xscd, int chan_id)
 int xscd_dma_init(struct xscd_device *xscd)
 {
        struct dma_device *ddev = &xscd->dma_device;
-       struct xscd_dma_chan *chan;
        unsigned int chan_id;
        int ret;
 
@@ -495,14 +495,8 @@ int xscd_dma_init(struct xscd_device *xscd)
        ddev->device_terminate_all = xscd_dma_terminate_all;
        ddev->device_prep_interleaved_dma = xscd_dma_prep_interleaved;
 
-       for (chan_id = 0; chan_id < xscd->num_streams; chan_id++) {
-               chan = xscd_dma_chan_probe(xscd, chan_id);
-               if (IS_ERR(chan)) {
-                       dev_err(xscd->dev, "failed to probe a channel\n");
-                       ret = PTR_ERR(chan);
-                       goto error;
-               }
-       }
+       for (chan_id = 0; chan_id < xscd->num_streams; chan_id++)
+               xscd_dma_chan_init(xscd, chan_id);
 
        ret = dma_async_device_register(ddev);
        if (ret) {
@@ -524,10 +518,9 @@ error_of_dma:
        dma_async_device_unregister(ddev);
 
 error:
-       for (chan_id = 0; chan_id < xscd->num_streams; chan_id++) {
-               if (xscd->channels[chan_id])
-                       xscd_dma_chan_remove(xscd->channels[chan_id]);
-       }
+       for (chan_id = 0; chan_id < xscd->num_streams; chan_id++)
+               xscd_dma_chan_remove(xscd->channels[chan_id]);
+
        return ret;
 }