struct resource *mem_base,
                          int irq_base)
 {
-       struct resource res[cell->num_resources];
+       struct resource *res;
        struct platform_device *pdev;
        int ret = -ENOMEM;
        int r;
        if (!pdev)
                goto fail_alloc;
 
+       res = kzalloc(sizeof(*res) * cell->num_resources, GFP_KERNEL);
+       if (!res)
+               goto fail_device;
+
        pdev->dev.parent = parent;
 
        ret = platform_device_add_data(pdev,
                        cell->platform_data, cell->data_size);
        if (ret)
-               goto fail_device;
+               goto fail_res;
 
-       memset(res, 0, sizeof(res));
        for (r = 0; r < cell->num_resources; r++) {
                res[r].name = cell->resources[r].name;
                res[r].flags = cell->resources[r].flags;
 
        ret = platform_device_add(pdev);
        if (ret)
-               goto fail_device;
+               goto fail_res;
+
+       kfree(res);
 
        return 0;
 
 /*     platform_device_del(pdev); */
+fail_res:
+       kfree(res);
 fail_device:
        platform_device_put(pdev);
 fail_alloc: