int watchdog_dev_register(struct watchdog_device *wdd) { struct device *dev; dev_t devno; int ret; devno = MKDEV(MAJOR(watchdog_devt), wdd->id); ret = watchdog_cdev_register(wdd, devno); if (ret) return ret; dev = device_create_with_groups(&watchdog_class, wdd->parent, devno, wdd, wdd->groups, "watchdog%d", wdd->id); if (IS_ERR(dev)) { watchdog_cdev_unregister(wdd); return PTR_ERR(dev); } ret = watchdog_register_pretimeout(wdd); if (ret) { device_destroy(&watchdog_class, devno); watchdog_cdev_unregister(wdd); } return ret; }
int mei_register(struct mei_device *dev, struct device *parent) { struct device *clsdev; /* class device */ int ret, devno; ret = mei_minor_get(dev); if (ret < 0) return ret; /* Fill in the data structures */ devno = MKDEV(MAJOR(mei_devt), dev->minor); cdev_init(&dev->cdev, &mei_fops); dev->cdev.owner = parent->driver->owner; /* Add the device */ ret = cdev_add(&dev->cdev, devno, 1); if (ret) { dev_err(parent, "unable to add device %d:%d\n", MAJOR(mei_devt), dev->minor); goto err_dev_add; } clsdev = device_create_with_groups(mei_class, parent, devno, dev, mei_groups, "mei%d", dev->minor); if (IS_ERR(clsdev)) { dev_err(parent, "unable to create device %d:%d\n", MAJOR(mei_devt), dev->minor); ret = PTR_ERR(clsdev); goto err_dev_create; } ret = mei_dbgfs_register(dev, dev_name(clsdev)); if (ret) { dev_err(clsdev, "cannot register debugfs ret = %d\n", ret); goto err_dev_dbgfs; } return 0; err_dev_dbgfs: device_destroy(mei_class, devno); err_dev_create: cdev_del(&dev->cdev); err_dev_add: mei_minor_free(dev); return ret; }
/** * led_classdev_register - register a new object of led_classdev class. * @parent: The device to register. * @led_cdev: the led_classdev structure for this device. */ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) { char name[64]; int ret; ret = led_classdev_next_name(led_cdev->name, name, sizeof(name)); if (ret < 0) return ret; led_cdev->dev = device_create_with_groups(leds_class, parent, 0, led_cdev, led_cdev->groups, "%s", name); if (IS_ERR(led_cdev->dev)) return PTR_ERR(led_cdev->dev); if (ret) dev_warn(parent, "Led %s renamed to %s due to name collision", led_cdev->name, dev_name(led_cdev->dev)); #ifdef CONFIG_LEDS_TRIGGERS init_rwsem(&led_cdev->trigger_lock); #endif mutex_init(&led_cdev->led_access); /* add to the list of leds */ down_write(&leds_list_lock); list_add_tail(&led_cdev->node, &leds_list); up_write(&leds_list_lock); if (!led_cdev->max_brightness) led_cdev->max_brightness = LED_FULL; led_cdev->flags |= SET_BRIGHTNESS_ASYNC; led_update_brightness(led_cdev); INIT_WORK(&led_cdev->set_brightness_work, set_brightness_delayed); setup_timer(&led_cdev->blink_timer, led_timer_function, (unsigned long)led_cdev); #ifdef CONFIG_LEDS_TRIGGERS led_trigger_set_default(led_cdev); #endif dev_dbg(parent, "Registered led device: %s\n", led_cdev->name); return 0; }
int watchdog_dev_register(struct watchdog_device *wdd) { struct device *dev; dev_t devno; int ret; devno = MKDEV(MAJOR(watchdog_devt), wdd->id); ret = watchdog_cdev_register(wdd, devno); if (ret) return ret; dev = device_create_with_groups(&watchdog_class, wdd->parent, devno, wdd, wdd->groups, "watchdog%d", wdd->id); if (IS_ERR(dev)) { watchdog_cdev_unregister(wdd); return PTR_ERR(dev); } ret = watchdog_register_pretimeout(wdd); if (ret) { device_destroy(&watchdog_class, devno); watchdog_cdev_unregister(wdd); return ret; } if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; ret = devm_register_reboot_notifier(dev, &wdd->reboot_nb); if (ret) { pr_err("watchdog%d: Cannot register reboot notifier (%d)\n", wdd->id, ret); watchdog_dev_unregister(wdd); } } return ret; }