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; }
/* 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); }