aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/leds/leds-lp5523.c
diff options
context:
space:
mode:
authorMilo(Woogyom) Kim <milo.kim@ti.com>2013-02-05 17:49:46 +0900
committerBryan Wu <cooloney@gmail.com>2013-02-06 15:59:25 -0800
commit944f7b1dedb859f76a88c8d34ce23a90bf6285a0 (patch)
treeba55b8a43e9f1077abe7df911292ab9ef43dcf73 /drivers/leds/leds-lp5523.c
parentleds: wm831x: add missing const (diff)
downloadlinux-dev-944f7b1dedb859f76a88c8d34ce23a90bf6285a0.tar.xz
linux-dev-944f7b1dedb859f76a88c8d34ce23a90bf6285a0.zip
leds-lp55xx: clean up init_device() in lp5521/5523
To make _probe() simple, device initialization code is moved to _init_device() at each driver. This patch is a preceding step for lp55xx common driver architecture. leds-lp5521: When 'lp5521_init_device()' gets failed, error handling should be 'fail1' rather than 'fail2'. fail1: releasing platform resource and return code fail2: releasing allocated LED devices with handling 'fail1' The 'lp5521_init_device()' is called before creating LED devices. Thus, 'goto fail1' is proper error handler of this function. Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com> Signed-off-by: Bryan Wu <cooloney@gmail.com>
Diffstat (limited to 'drivers/leds/leds-lp5523.c')
-rw-r--r--drivers/leds/leds-lp5523.c47
1 files changed, 28 insertions, 19 deletions
diff --git a/drivers/leds/leds-lp5523.c b/drivers/leds/leds-lp5523.c
index 7f5be8948cde..491ea725bb0b 100644
--- a/drivers/leds/leds-lp5523.c
+++ b/drivers/leds/leds-lp5523.c
@@ -896,6 +896,33 @@ static int lp5523_init_led(struct lp5523_led *led, struct device *dev,
return 0;
}
+static int lp5523_init_device(struct lp5523_chip *chip)
+{
+ struct lp5523_platform_data *pdata = chip->pdata;
+ struct i2c_client *client = chip->client;
+ int ret;
+
+ if (pdata->setup_resources) {
+ ret = pdata->setup_resources();
+ if (ret < 0)
+ return ret;
+ }
+
+ if (pdata->enable) {
+ pdata->enable(0);
+ usleep_range(1000, 2000); /* Keep enable down at least 1ms */
+ pdata->enable(1);
+ usleep_range(1000, 2000); /* 500us abs min. */
+ }
+
+ lp5523_write(client, LP5523_REG_RESET, 0xff);
+ usleep_range(10000, 20000); /*
+ * Exact value is not available. 10 - 20ms
+ * appears to be enough for reset.
+ */
+ return lp5523_detect(client);
+}
+
static int lp5523_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -921,25 +948,7 @@ static int lp5523_probe(struct i2c_client *client,
chip->pdata = pdata;
- if (pdata->setup_resources) {
- ret = pdata->setup_resources();
- if (ret < 0)
- return ret;
- }
-
- if (pdata->enable) {
- pdata->enable(0);
- usleep_range(1000, 2000); /* Keep enable down at least 1ms */
- pdata->enable(1);
- usleep_range(1000, 2000); /* 500us abs min. */
- }
-
- lp5523_write(client, LP5523_REG_RESET, 0xff);
- usleep_range(10000, 20000); /*
- * Exact value is not available. 10 - 20ms
- * appears to be enough for reset.
- */
- ret = lp5523_detect(client);
+ ret = lp5523_init_device(chip);
if (ret)
goto fail1;