tegra_ion.c revision 1be544cdb92954e7d73ce09f0681d9f8b6f5c3c6
1/* 2 * drivers/gpu/tegra/tegra_ion.c 3 * 4 * Copyright (C) 2011 Google, Inc. 5 * 6 * This software is licensed under the terms of the GNU General Public 7 * License version 2, as published by the Free Software Foundation, and 8 * may be copied, distributed, and modified under those terms. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 */ 16 17#include <linux/err.h> 18#include <linux/platform_device.h> 19#include <linux/slab.h> 20#include "../ion.h" 21#include "../ion_priv.h" 22 23static struct ion_device *idev; 24static int num_heaps; 25static struct ion_heap **heaps; 26 27static int tegra_ion_probe(struct platform_device *pdev) 28{ 29 struct ion_platform_data *pdata = pdev->dev.platform_data; 30 int err; 31 int i; 32 33 num_heaps = pdata->nr; 34 35 heaps = kzalloc(sizeof(struct ion_heap *) * pdata->nr, GFP_KERNEL); 36 37 idev = ion_device_create(NULL); 38 if (IS_ERR_OR_NULL(idev)) { 39 kfree(heaps); 40 return PTR_ERR(idev); 41 } 42 43 /* create the heaps as specified in the board file */ 44 for (i = 0; i < num_heaps; i++) { 45 struct ion_platform_heap *heap_data = &pdata->heaps[i]; 46 47 heaps[i] = ion_heap_create(heap_data); 48 if (IS_ERR_OR_NULL(heaps[i])) { 49 err = PTR_ERR(heaps[i]); 50 goto err; 51 } 52 ion_device_add_heap(idev, heaps[i]); 53 } 54 platform_set_drvdata(pdev, idev); 55 return 0; 56err: 57 for (i = 0; i < num_heaps; i++) { 58 if (heaps[i]) 59 ion_heap_destroy(heaps[i]); 60 } 61 kfree(heaps); 62 return err; 63} 64 65static int tegra_ion_remove(struct platform_device *pdev) 66{ 67 struct ion_device *idev = platform_get_drvdata(pdev); 68 int i; 69 70 ion_device_destroy(idev); 71 for (i = 0; i < num_heaps; i++) 72 ion_heap_destroy(heaps[i]); 73 kfree(heaps); 74 return 0; 75} 76 77static struct platform_driver ion_driver = { 78 .probe = tegra_ion_probe, 79 .remove = tegra_ion_remove, 80 .driver = { .name = "ion-tegra" } 81}; 82 83module_platform_driver(ion_driver); 84 85