]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/leds/leds-lp55xx-common.c
leds: lp55xx: handle enable pin in driver
[karo-tx-linux.git] / drivers / leds / leds-lp55xx-common.c
index 351825b96f16b534923b36d97e5fd0ccaacbdf6c..9acc6bb7deef01f153e5c71044ac93be7e983ba9 100644 (file)
@@ -20,6 +20,8 @@
 #include <linux/module.h>
 #include <linux/platform_data/leds-lp55xx.h>
 #include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
 
 #include "leds-lp55xx-common.h"
 
@@ -165,6 +167,7 @@ static int lp55xx_init_led(struct lp55xx_led *led,
        led->led_current = pdata->led_config[chan].led_current;
        led->max_current = pdata->led_config[chan].max_current;
        led->chan_nr = pdata->led_config[chan].chan_nr;
+       led->cdev.default_trigger = pdata->led_config[chan].default_trigger;
 
        if (led->chan_nr >= max_channel) {
                dev_err(dev, "Use channel numbers between 0 and %d\n",
@@ -406,18 +409,18 @@ int lp55xx_init_device(struct lp55xx_chip *chip)
        if (!pdata || !cfg)
                return -EINVAL;
 
-       if (pdata->setup_resources) {
-               ret = pdata->setup_resources();
+       if (gpio_is_valid(pdata->enable_gpio)) {
+               ret = devm_gpio_request_one(dev, pdata->enable_gpio,
+                                           GPIOF_DIR_OUT, "lp5523_enable");
                if (ret < 0) {
-                       dev_err(dev, "setup resoure err: %d\n", ret);
+                       dev_err(dev, "could not acquire enable gpio (err=%d)\n",
+                               ret);
                        goto err;
                }
-       }
 
-       if (pdata->enable) {
-               pdata->enable(0);
+               gpio_set_value(pdata->enable_gpio, 0);
                usleep_range(1000, 2000); /* Keep enable down at least 1ms */
-               pdata->enable(1);
+               gpio_set_value(pdata->enable_gpio, 1);
                usleep_range(1000, 2000); /* 500us abs min. */
        }
 
@@ -458,11 +461,8 @@ void lp55xx_deinit_device(struct lp55xx_chip *chip)
        if (chip->clk)
                clk_disable_unprepare(chip->clk);
 
-       if (pdata->enable)
-               pdata->enable(0);
-
-       if (pdata->release_resources)
-               pdata->release_resources();
+       if (gpio_is_valid(pdata->enable_gpio))
+               gpio_set_value(pdata->enable_gpio, 0);
 }
 EXPORT_SYMBOL_GPL(lp55xx_deinit_device);
 
@@ -586,6 +586,8 @@ int lp55xx_of_populate_pdata(struct device *dev, struct device_node *np)
                of_property_read_string(child, "chan-name", &cfg[i].name);
                of_property_read_u8(child, "led-cur", &cfg[i].led_current);
                of_property_read_u8(child, "max-cur", &cfg[i].max_current);
+               cfg[i].default_trigger =
+                       of_get_property(child, "linux,default-trigger", NULL);
 
                i++;
        }
@@ -593,6 +595,8 @@ int lp55xx_of_populate_pdata(struct device *dev, struct device_node *np)
        of_property_read_string(np, "label", &pdata->label);
        of_property_read_u8(np, "clock-mode", &pdata->clock_mode);
 
+       pdata->enable_gpio = of_get_named_gpio(np, "enable-gpio", 0);
+
        /* LP8501 specific */
        of_property_read_u8(np, "pwr-sel", (u8 *)&pdata->pwr_sel);