static int backlight_pwm_of_probe(struct device_d *dev) { int ret; struct pwm_backlight *pwm_backlight; struct pwm_device *pwm; pwm = of_pwm_request(dev->device_node, NULL); if (IS_ERR(pwm)) { dev_err(dev, "Cannot find PWM device\n"); return PTR_ERR(pwm); } pwm_backlight = xzalloc(sizeof(*pwm_backlight)); pwm_backlight->pwm = pwm; pwm_backlight->period = pwm_get_period(pwm); ret = pwm_backlight_parse_dt(dev, pwm_backlight); if (ret) return ret; pwm_backlight->power = regulator_get(dev, "power"); if (IS_ERR(pwm_backlight->power)) { dev_err(dev, "Cannot find regulator\n"); return PTR_ERR(pwm_backlight->power); } pwm_backlight->period = pwm_get_period(pwm_backlight->pwm); pwm_backlight->backlight.brightness_set = backlight_pwm_set; pwm_backlight->backlight.node = dev->device_node; ret = backlight_register(&pwm_backlight->backlight); if (ret) return ret; return 0; }
static struct led_pwm_priv *led_pwm_create_of(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; struct device_node *child; struct led_pwm_priv *priv; int count, ret; /* count LEDs in this device, so we know how much to allocate */ count = of_get_child_count(node); if (!count) return NULL; priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(count), GFP_KERNEL); if (!priv) return NULL; for_each_child_of_node(node, child) { struct led_pwm_data *led_dat = &priv->leds[priv->num_leds]; led_dat->cdev.name = of_get_property(child, "label", NULL) ? : child->name; /* caution: this is not release automatically */ led_dat->pwm = of_pwm_request(child, NULL); if (IS_ERR(led_dat->pwm)) { dev_err(&pdev->dev, "unable to request PWM for %s\n", led_dat->cdev.name); goto err; } /* Get the period from PWM core when n*/ led_dat->period = pwm_get_period(led_dat->pwm); led_dat->cdev.default_trigger = of_get_property(child, "linux,default-trigger", NULL); of_property_read_u32(child, "max-brightness", &led_dat->cdev.max_brightness); led_dat->cdev.brightness_set = led_pwm_set; led_dat->cdev.brightness = LED_OFF; led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; led_dat->can_sleep = 0; /* pwm_can_sleep(led_dat->pwm); */ if (led_dat->can_sleep) INIT_WORK(&led_dat->work, led_pwm_work); ret = led_classdev_register(&pdev->dev, &led_dat->cdev); if (ret < 0) { dev_err(&pdev->dev, "failed to register for %s\n", led_dat->cdev.name); of_node_put(child); goto err; } priv->num_leds++; } return priv; err: while (priv->num_leds--) led_classdev_unregister(&priv->leds[priv->num_leds].cdev); return NULL; }