static int mali_probe(struct platform_device *pdev)
{
	int err;

	MALI_DEBUG_PRINT(2, ("mali_probe(): Called for platform device %s\n", pdev->name));

	if (NULL != mali_platform_device)
	{
		/* Already connected to a device, return error */
		MALI_PRINT_ERROR(("mali_probe(): The Mali driver is already connected with a Mali device."));
		return -EEXIST;
	}

	mali_platform_device = pdev;

	if (mali_platform_init() != _MALI_OSK_ERR_OK)
	{
		/* Platform-specific initialization failed, return error */
		MALI_PRINT_ERROR(("mali_probe(): mali_platform_init() failed."));
		return -EFAULT;
	}

	if (_MALI_OSK_ERR_OK == _mali_osk_wq_init())
	{
		/* Initialize the Mali GPU HW specified by pdev */
		if (_MALI_OSK_ERR_OK == mali_initialize_subsystems())
		{
			/* Register a misc device (so we are accessible from user space) */
			err = mali_miscdevice_register(pdev);
			if (0 == err)
			{
				/* Setup sysfs entries */
				err = mali_sysfs_register(mali_dev_name);
				if (0 == err)
				{
					MALI_DEBUG_PRINT(2, ("mali_probe(): Successfully initialized driver for platform device %s\n", pdev->name));
					return 0;
				}
				else
				{
					MALI_PRINT_ERROR(("mali_probe(): failed to register sysfs entries"));
				}
				mali_miscdevice_unregister();
			}
			else
			{
				MALI_PRINT_ERROR(("mali_probe(): failed to register Mali misc device."));
			}
			mali_terminate_subsystems();
		}
		else
		{
			MALI_PRINT_ERROR(("mali_probe(): Failed to initialize Mali device driver."));
		}
		_mali_osk_wq_term();
	}

	mali_platform_device = NULL;
	return -EFAULT;
}
Exemple #2
0
/* called from _mali_osk_init */
int initialize_kernel_device(void)
{
    int err;
    dev_t dev = 0;
    if (0 == mali_major)
    {
        /* auto select a major */
        err = alloc_chrdev_region(&dev, 0/*first minor*/, 1/*count*/, mali_dev_name);
        mali_major = MAJOR(dev);
    }
    else
    {
        /* use load time defined major number */
        dev = MKDEV(mali_major, 0);
        err = register_chrdev_region(dev, 1/*count*/, mali_dev_name);
    }

    if (err)
    {
        goto init_chrdev_err;
    }

    memset(&device, 0, sizeof(device));

    /* initialize our char dev data */
    cdev_init(&device.cdev, &mali_fops);
    device.cdev.owner = THIS_MODULE;
    device.cdev.ops = &mali_fops;

    /* register char dev with the kernel */
    err = cdev_add(&device.cdev, dev, 1/*count*/);
    if (err)
    {
        goto init_cdev_err;
    }

    err = mali_sysfs_register(&device, dev, mali_dev_name);
    if (err)
    {
        goto init_sysfs_err;
    }

    /* Success! */
    return 0;

init_sysfs_err:
    cdev_del(&device.cdev);
init_cdev_err:
    unregister_chrdev_region(dev, 1/*count*/);
init_chrdev_err:
    return err;
}
static int initialize_sysfs(void)
{
	dev_t dev = MKDEV(mali_major, 0);
	return mali_sysfs_register(&device, dev, mali_dev_name);
}