static int msm_ion_probe(struct platform_device *pdev) { struct ion_platform_data *pdata = pdev->dev.platform_data; int err; int i; num_heaps = pdata->nr; heaps = kcalloc(pdata->nr, sizeof(struct ion_heap *), GFP_KERNEL); if (!heaps) { err = -ENOMEM; goto out; } idev = ion_device_create(NULL); if (IS_ERR_OR_NULL(idev)) { err = PTR_ERR(idev); goto freeheaps; } msm_ion_heap_fixup(pdata->heaps, num_heaps); for (i = 0; i < num_heaps; i++) { struct ion_platform_heap *heap_data = &pdata->heaps[i]; msm_ion_allocate(heap_data); heap_data->has_outer_cache = pdata->has_outer_cache; heaps[i] = ion_heap_create(heap_data); if (IS_ERR_OR_NULL(heaps[i])) { heaps[i] = 0; continue; } else { if (heap_data->size) pr_info("ION heap %s created at %lx " "with size %x\n", heap_data->name, heap_data->base, heap_data->size); else pr_info("ION heap %s created\n", heap_data->name); } ion_device_add_heap(idev, heaps[i]); } check_for_heap_overlap(pdata->heaps, num_heaps); platform_set_drvdata(pdev, idev); return 0; freeheaps: kfree(heaps); out: return err; }
static int msm_ion_probe(struct platform_device *pdev) { struct ion_platform_data *pdata = pdev->dev.platform_data; int err; int i; num_heaps = pdata->nr; heaps = kcalloc(pdata->nr, sizeof(struct ion_heap *), GFP_KERNEL); if (!heaps) { err = -ENOMEM; goto out; } idev = ion_device_create(NULL); if (IS_ERR_OR_NULL(idev)) { err = PTR_ERR(idev); goto freeheaps; } msm_ion_heap_fixup(pdata->heaps, num_heaps); /* 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]; msm_ion_allocate(heap_data); heaps[i] = ion_heap_create(heap_data); if (IS_ERR_OR_NULL(heaps[i])) { err = PTR_ERR(heaps[i]); goto heapdestroy; } ion_device_add_heap(idev, heaps[i]); } platform_set_drvdata(pdev, idev); return 0; heapdestroy: for (i = 0; i < num_heaps; i++) { if (!IS_ERR_OR_NULL(heaps[i])) ion_heap_destroy(heaps[i]); } freeheaps: kfree(heaps); out: return err; }