Example #1
0
int dev_ion_probe(struct platform_device *pdev) {
    int err;
    int i;

    struct resource *res;
    struct device_node	*of_node = pdev->dev.of_node;
    const void *name;
    int offset,size;

    num_heaps = 1;
    my_ion_heap[0].type = ION_HEAP_TYPE_SYSTEM;
    my_ion_heap[0].id = ION_HEAP_TYPE_SYSTEM;
    my_ion_heap[0].name = "vmalloc_ion";
#if 0
    res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
#else
    res = &memobj;
    i = find_reserve_block(of_node->name,0);
    if(i < 0){
	 name = of_get_property(of_node, "share-memory-name", NULL);
	 if(!name)
	 {
		printk("\ndev_ion memory resource undefined1.\n");
		return -EFAULT;
	 }
	 else
	 {
		i= find_reserve_block_by_name((char *)name);
		if(i<0)
		{
			printk("\ndev_ion memory resource undefined2.\n");
			return -EFAULT;
		}
		name = of_get_property(of_node, "share-memory-offset", NULL);
		if(name)
			offset = of_read_ulong(name,1);
		else
		{
			printk("\ndev_ion memory resource undefined3.\n");
			return -EFAULT;
		}
		name = of_get_property(of_node, "share-memory-size", NULL);
		if(name)
			size = of_read_ulong(name,1);
		else
		{
			printk("\ndev_ion memory resource undefined4.\n");
			return -EFAULT;
		}


		res->start = (phys_addr_t)get_reserve_block_addr(i)+offset;
		res->end = res->start+ size-1;

	 }
    }
    else
    {
	res->start = (phys_addr_t)get_reserve_block_addr(i);
	res->end = res->start+ (phys_addr_t)get_reserve_block_size(i)-1;
    }
#endif
    if (res) {
        num_heaps = 2;
        my_ion_heap[1].type = ION_HEAP_TYPE_CARVEOUT;//ION_HEAP_TYPE_CHUNK;//ION_HEAP_TYPE_CARVEOUT;
        my_ion_heap[1].id = ION_HEAP_TYPE_CARVEOUT;
        my_ion_heap[1].name = "carveout_ion";
        my_ion_heap[1].base = (ion_phys_addr_t) res->start;
        my_ion_heap[1].size = res->end - res->start + 1;
    }
    heaps = kzalloc(sizeof(struct ion_heap *) * num_heaps, GFP_KERNEL);
    idev = ion_device_create(NULL);
    if (IS_ERR_OR_NULL(idev)) {
        kfree(heaps);
        panic(0);
        return PTR_ERR(idev);
    }

    /* create the heaps as specified in the board file */
    for (i = 0; i < num_heaps; i++) {
        heaps[i] = ion_heap_create(&my_ion_heap[i]);
        if (IS_ERR_OR_NULL(heaps[i])) {
            err = PTR_ERR(heaps[i]);
            goto err;
        }
        ion_device_add_heap(idev, heaps[i]);
        dprintk(2, "add heap type:%d id:%d\n", my_ion_heap[i].type, my_ion_heap[i].id);
    }
    platform_set_drvdata(pdev, idev);
    return 0;
err:
	for (i = 0; i < num_heaps; i++) {
        if (heaps[i])
            ion_heap_destroy(heaps[i]);
    }
    kfree(heaps);
    panic(0);
    return err;
}
Example #2
0
static int d2d3_probe(struct platform_device *pdev)
{
        int ret = 0;
        struct d2d3_dev_s *devp;
        struct resource *res;

        /* kmalloc d2d3 dev */
        devp = kmalloc(sizeof(struct d2d3_dev_s), GFP_KERNEL);
        if (!devp)
        {
                printk("[d2d3]%s: failed to allocate memory for d2d3 device.\n",__func__);
                ret = -ENOMEM;
                goto failed_kmalloc_devp;
        }
        memset(devp,0,sizeof(d2d3_dev_t));
        d2d3_devp = devp;
        //spin_lock_init(&d2d3_devp->buf_lock);
        d2d3_devp->flag = D2D3_BYPASS;
	/*disable hw&path*/
	d2d3_enable_hw(false);
	d2d3_enable_path(false,&d2d3_devp->param);
        /*create cdev and register with sysfs*/
        ret = d2d3_add_cdev(&devp->cdev, &d2d3_fops,0);
        if (ret) {
                printk("[d2d3]%s: failed to add device.\n",__func__);
                /* @todo do with error */
                goto failed_add_cdev;
        }
        /*create the udev node /dev/...*/
        devp->dev = d2d3_create_device(&pdev->dev,0);
        if (devp->dev == NULL) {
                printk("[d2d3]%s: device_create create error.\n",__func__);
                ret = -EEXIST;
                goto failed_create_device;
        }
        ret = device_create_file(devp->dev, &dev_attr_debug);
        if(ret < 0){
                printk(KERN_ERR "[d2d3]%s: failed create device attr file.\n",__func__);
                goto failed_create_device_file;
        }
      #ifdef CONFIG_USE_OF
      	res = &memobj;
       	ret = find_reserve_block(pdev->dev.of_node->name,0);
      	if(ret < 0){
             pr_err("\nd2d3 memory resource undefined.\n");
             return -EFAULT;
     	}
      	printk("[d2d3]%s: hhhhhhhhhhhhhh[%d].\n",__func__,__LINE__);
      	res->start = (phys_addr_t)get_reserve_block_addr(ret);
      	res->end = res->start+ (phys_addr_t)get_reserve_block_size(ret)-1;
      #else
        /* get device memory */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!res) {
                pr_err("[d2d3]%s: can't get memory resource.\n",__func__);
                ret = -EFAULT;
                goto failed_get_resource;
        }
	#endif
        devp->mem_start = res->start;
        devp->mem_size  = res->end - res->start + 1;
        printk("[d2d3]%s: mem_start = 0x%x, mem_size = 0x%x.\n",__func__, devp->mem_start,devp->mem_size);
#ifdef CONFIG_USE_OF
     	if (pdev->dev.of_node) {
               	ret = of_property_read_u32(pdev->dev.of_node,"irq",&(res->start));
              	if(ret) {
                       pr_err("don't find d2d3  match irq\n");
                     	goto failed_get_resource;
             	}
              res->end = res->start;
              res->flags = IORESOURCE_IRQ;
      	}
#else
	/*get d2d3's irq*/
        res = platform_get_resource(pdev,IORESOURCE_MEM,0);
        if (!res) {
                pr_err("[d2d3]%s: can't get irq resource.\n",__func__);
                ret = -EFAULT;
                goto failed_get_resource;
        }
#endif
        devp->irq = res->start;
        sprintf(devp->vfm_name,"%s",VFM_NAME);
        platform_set_drvdata(pdev,(void *)devp);
        dev_set_drvdata(devp->dev,(void *)devp);

        vf_receiver_init(&d2d3_vf_recv, devp->vfm_name, &d2d3_vf_receiver, NULL);
        vf_reg_receiver(&d2d3_vf_recv);

        vf_provider_init(&d2d3_vf_prov, devp->vfm_name, &d2d3_vf_provider, NULL);
        return ret;
failed_get_resource:
        device_remove_file(&pdev->dev,&dev_attr_debug);
failed_create_device_file:
        device_del(&pdev->dev);
failed_create_device:
        cdev_del(&devp->cdev);
failed_add_cdev:
        kfree(devp);
failed_kmalloc_devp:
        return ret;
}