Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / staging / android / ion / tegra / tegra_ion.c
diff --git a/kernel/drivers/staging/android/ion/tegra/tegra_ion.c b/kernel/drivers/staging/android/ion/tegra/tegra_ion.c
new file mode 100644 (file)
index 0000000..5b8ef0e
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * drivers/gpu/tegra/tegra_ion.c
+ *
+ * Copyright (C) 2011 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/err.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include "../ion.h"
+#include "../ion_priv.h"
+
+static struct ion_device *idev;
+static int num_heaps;
+static struct ion_heap **heaps;
+
+static int tegra_ion_probe(struct platform_device *pdev)
+{
+       struct ion_platform_data *pdata = pdev->dev.platform_data;
+       int err;
+       int i;
+
+       num_heaps = pdata->nr;
+
+       heaps = devm_kzalloc(&pdev->dev,
+                            sizeof(struct ion_heap *) * pdata->nr,
+                            GFP_KERNEL);
+
+       idev = ion_device_create(NULL);
+       if (IS_ERR_OR_NULL(idev))
+               return PTR_ERR(idev);
+
+       /* create the heaps as specified in the board file */
+       for (i = 0; i < num_heaps; i++) {
+               struct ion_platform_heap *heap_data = &pdata->heaps[i];
+
+               heaps[i] = ion_heap_create(heap_data);
+               if (IS_ERR_OR_NULL(heaps[i])) {
+                       err = PTR_ERR(heaps[i]);
+                       goto err;
+               }
+               ion_device_add_heap(idev, heaps[i]);
+       }
+       platform_set_drvdata(pdev, idev);
+       return 0;
+err:
+       for (i = 0; i < num_heaps; ++i)
+               ion_heap_destroy(heaps[i]);
+       return err;
+}
+
+static int tegra_ion_remove(struct platform_device *pdev)
+{
+       struct ion_device *idev = platform_get_drvdata(pdev);
+       int i;
+
+       ion_device_destroy(idev);
+       for (i = 0; i < num_heaps; i++)
+               ion_heap_destroy(heaps[i]);
+       return 0;
+}
+
+static struct platform_driver ion_driver = {
+       .probe = tegra_ion_probe,
+       .remove = tegra_ion_remove,
+       .driver = { .name = "ion-tegra" }
+};
+
+module_platform_driver(ion_driver);
+