tegra_ion.c revision f71373c06c48660fb9a52e3393f86dac3e9ffd84
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 = devm_kzalloc(&pdev->dev, 36 sizeof(struct ion_heap *) * pdata->nr, 37 GFP_KERNEL); 38 39 idev = ion_device_create(NULL); 40 if (IS_ERR_OR_NULL(idev)) 41 return PTR_ERR(idev); 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 return err; 62} 63 64static int tegra_ion_remove(struct platform_device *pdev) 65{ 66 struct ion_device *idev = platform_get_drvdata(pdev); 67 int i; 68 69 ion_device_destroy(idev); 70 for (i = 0; i < num_heaps; i++) 71 ion_heap_destroy(heaps[i]); 72 return 0; 73} 74 75static struct platform_driver ion_driver = { 76 .probe = tegra_ion_probe, 77 .remove = tegra_ion_remove, 78 .driver = { .name = "ion-tegra" } 79}; 80 81module_platform_driver(ion_driver); 82 83