int omap_ion_probe(struct platform_device *pdev) { printk(KERN_ERR "enter omap_ion_probe()\n"); struct ion_platform_data *pdata = pdev->dev.platform_data; int err; int i; num_heaps = pdata->nr; heaps = kzalloc(sizeof(struct ion_heap *) * pdata->nr, GFP_KERNEL); omap_ion_device = ion_device_create(omap_ion_ioctl); printk(KERN_ERR "Created ion device at %d\n", omap_ion_device); if (IS_ERR_OR_NULL(omap_ion_device)) { printk(KERN_ERR "Error creating ion_device!\n"); kfree(heaps); return PTR_ERR(omap_ion_device); } /* 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]; if (heap_data->type == OMAP_ION_HEAP_TYPE_TILER) { heaps[i] = omap_tiler_heap_create(heap_data); if (heap_data->id == OMAP_ION_HEAP_NONSECURE_TILER) nonsecure_tiler_heap = heaps[i]; else tiler_heap = heaps[i]; } else if (heap_data->type == OMAP_ION_HEAP_TYPE_TILER_RESERVATION) { heaps[i] = omap_tiler_heap_create(heap_data); } else { 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(omap_ion_device, heaps[i]); pr_info("%s: adding heap %s of type %d with %lx@%x\n", __func__, heap_data->name, heap_data->type, heap_data->base, heap_data->size); } platform_set_drvdata(pdev, omap_ion_device); return 0; err: for (i = 0; i < num_heaps; i++) { if (heaps[i]) { if (heaps[i]->type == OMAP_ION_HEAP_TYPE_TILER) omap_tiler_heap_destroy(heaps[i]); else ion_heap_destroy(heaps[i]); } } kfree(heaps); return err; }
int omap_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++) if (heaps[i]->type == OMAP_ION_HEAP_TYPE_TILER) omap_tiler_heap_destroy(heaps[i]); else ion_heap_destroy(heaps[i]); kfree(heaps); return 0; }