[media] SOLO6x10: don't do DMA from stack in solo_dma_vin_region()
authorKrzysztof Hałasa <khalasa@piap.pl>
Thu, 12 Sep 2013 11:25:36 +0000 (08:25 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Mon, 14 Oct 2013 09:32:04 +0000 (06:32 -0300)
[m.chehab@samsung.com: Fix CodingStyle: don't use 2 statements on just one line]

Signed-off-by: Krzysztof Ha?asa <khalasa@piap.pl>
Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/staging/media/solo6x10/solo6x10-disp.c

index 32d9953..145295a 100644 (file)
@@ -176,18 +176,27 @@ static void solo_vout_config(struct solo_dev *solo_dev)
 static int solo_dma_vin_region(struct solo_dev *solo_dev, u32 off,
                               u16 val, int reg_size)
 {
-       u16 buf[64];
-       int i;
-       int ret = 0;
+       u16 *buf;
+       const int n = 64, size = n * sizeof(*buf);
+       int i, ret = 0;
+
+       buf = kmalloc(size, GFP_KERNEL);
+       if (!buf)
+               return -ENOMEM;
 
-       for (i = 0; i < sizeof(buf) >> 1; i++)
+       for (i = 0; i < n; i++)
                buf[i] = cpu_to_le16(val);
 
-       for (i = 0; i < reg_size; i += sizeof(buf))
-               ret |= solo_p2m_dma(solo_dev, 1, buf,
-                                   SOLO_MOTION_EXT_ADDR(solo_dev) + off + i,
-                                   sizeof(buf), 0, 0);
+       for (i = 0; i < reg_size; i += size) {
+               ret = solo_p2m_dma(solo_dev, 1, buf,
+                                  SOLO_MOTION_EXT_ADDR(solo_dev) + off + i,
+                                  size, 0, 0);
+
+               if (ret)
+                       break;
+       }
 
+       kfree(buf);
        return ret;
 }