Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 12 Jun 2014 20:08:09 +0000 (13:08 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 12 Jun 2014 20:08:09 +0000 (13:08 -0700)
Pull LED updates from Bryan Wu:
 "I just found merge window is open and I'm quite busy and almost forget
  to send out this pull request.  Thanks Russell and Alexandre ping me
  about this.

  So basically we got some clean up and leds-pwm fixing patches from
  Russell"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/cooloney/linux-leds:
  leds: Remove duplicated OOM message for individual driver
  drivers/leds: Replace __get_cpu_var use through this_cpu_ptr
  leds: lp55xx: add DT bindings for LP55231
  leds: 88pm860x: Fix missing refcount decrement for parent of_node
  leds: 88pm860x: Use of_get_child_by_name
  leds: leds-pwm: add DT support for LEDs wired to supply
  leds: leds-pwm: implement PWM inversion
  leds: leds-pwm: convert OF parsing code to use led_pwm_add()
  leds: leds-pwm: provide a common function to setup a single led-pwm device
  leds: pca9685: Remove leds-pca9685 driver
  dell-led: add mic mute led interface

1  2 
drivers/leds/Kconfig
drivers/leds/Makefile
drivers/leds/leds-pwm.c

Simple merge
Simple merge
index aa770ec1e8928cc6b8f8eeaf9d6daea314e46d65,f5cf1b0f274873d9142a008dff9e024b6da3251d..d672bb4480f6c96530be00ebca63b074a3400762
@@@ -92,55 -96,75 +96,78 @@@ static void led_pwm_cleanup(struct led_
        }
  }
  
- static int led_pwm_create_of(struct platform_device *pdev,
-                            struct led_pwm_priv *priv)
+ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
+                      struct led_pwm *led, struct device_node *child)
  {
-       struct device_node *child;
+       struct led_pwm_data *led_data = &priv->leds[priv->num_leds];
        int ret;
  
-       for_each_child_of_node(pdev->dev.of_node, child) {
-               struct led_pwm_data *led_dat = &priv->leds[priv->num_leds];
+       led_data->active_low = led->active_low;
 -      led_data->period = led->pwm_period_ns;
+       led_data->cdev.name = led->name;
+       led_data->cdev.default_trigger = led->default_trigger;
+       led_data->cdev.brightness_set = led_pwm_set;
+       led_data->cdev.brightness = LED_OFF;
+       led_data->cdev.max_brightness = led->max_brightness;
+       led_data->cdev.flags = LED_CORE_SUSPENDRESUME;
  
-               led_dat->cdev.name = of_get_property(child, "label",
-                                                    NULL) ? : child->name;
+       if (child)
+               led_data->pwm = devm_of_pwm_get(dev, child, NULL);
+       else
+               led_data->pwm = devm_pwm_get(dev, led->name);
+       if (IS_ERR(led_data->pwm)) {
+               ret = PTR_ERR(led_data->pwm);
+               dev_err(dev, "unable to request PWM for %s: %d\n",
+                       led->name, ret);
+               return ret;
+       }
  
-               led_dat->pwm = devm_of_pwm_get(&pdev->dev, child, NULL);
-               if (IS_ERR(led_dat->pwm)) {
-                       dev_err(&pdev->dev, "unable to request PWM for %s\n",
-                               led_dat->cdev.name);
-                       ret = PTR_ERR(led_dat->pwm);
-                       goto err;
-               }
-               /* Get the period from PWM core when n*/
-               led_dat->period = pwm_get_period(led_dat->pwm);
+       if (child)
+               led_data->period = pwm_get_period(led_data->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_data->can_sleep = pwm_can_sleep(led_data->pwm);
+       if (led_data->can_sleep)
+               INIT_WORK(&led_data->work, led_pwm_work);
  
-               led_dat->cdev.brightness_set = led_pwm_set;
-               led_dat->cdev.brightness = LED_OFF;
-               led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
++      led_data->period = pwm_get_period(led_data->pwm);
++      if (!led_data->period && (led->pwm_period_ns > 0))
++              led_data->period = led->pwm_period_ns;
 +
-               led_dat->can_sleep = pwm_can_sleep(led_dat->pwm);
-               if (led_dat->can_sleep)
-                       INIT_WORK(&led_dat->work, led_pwm_work);
+       ret = led_classdev_register(dev, &led_data->cdev);
+       if (ret == 0) {
+               priv->num_leds++;
+       } else {
+               dev_err(dev, "failed to register PWM led for %s: %d\n",
+                       led->name, ret);
+       }
+       return ret;
+ }
  
-               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);
+ static int led_pwm_create_of(struct device *dev, struct led_pwm_priv *priv)
+ {
+       struct device_node *child;
+       struct led_pwm led;
+       int ret = 0;
+       memset(&led, 0, sizeof(led));
+       for_each_child_of_node(dev->of_node, child) {
+               led.name = of_get_property(child, "label", NULL) ? :
+                          child->name;
+               led.default_trigger = of_get_property(child,
+                                               "linux,default-trigger", NULL);
+               led.active_low = of_property_read_bool(child, "active-low");
+               of_property_read_u32(child, "max-brightness",
+                                    &led.max_brightness);
+               ret = led_pwm_add(dev, priv, &led, child);
+               if (ret) {
                        of_node_put(child);
-                       goto err;
+                       break;
                }
-               priv->num_leds++;
        }
  
-       return 0;
- err:
-       led_pwm_cleanup(priv);
        return ret;
  }