drivers/leds/leds-lp5521.c: check if reset is successful
authorSrinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Tue, 1 Nov 2011 00:12:24 +0000 (17:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 1 Nov 2011 00:30:55 +0000 (17:30 -0700)
Make sure that the reset is successful by issuing a dummy read to R
channel current register and check its default value.  On some platforms,
without this dummy read, any further access to {R/G/B}_EXEC will not have
any impact.

[akpm@linux-foundation.org: fix up code comment]
Signed-off-by: srinidhi kasagar <srinidhi.kasagar@stericsson.com>
Tested-by: Naga Radhesh <naga.radheshy@stericsson.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Cc: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/leds/leds-lp5521.c

index 16f281b..cb641f1 100644 (file)
@@ -97,6 +97,9 @@
 /* Status */
 #define LP5521_EXT_CLK_USED            0x08
 
 /* Status */
 #define LP5521_EXT_CLK_USED            0x08
 
+/* default R channel current register value */
+#define LP5521_REG_R_CURR_DEFAULT      0xAF
+
 struct lp5521_engine {
        int             id;
        u8              mode;
 struct lp5521_engine {
        int             id;
        u8              mode;
@@ -643,6 +646,7 @@ static int __devinit lp5521_probe(struct i2c_client *client,
        struct lp5521_chip              *chip;
        struct lp5521_platform_data     *pdata;
        int ret, i, led;
        struct lp5521_chip              *chip;
        struct lp5521_platform_data     *pdata;
        int ret, i, led;
+       u8 buf;
 
        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
        if (!chip)
 
        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
        if (!chip)
@@ -681,6 +685,20 @@ static int __devinit lp5521_probe(struct i2c_client *client,
                                     * Exact value is not available. 10 - 20ms
                                     * appears to be enough for reset.
                                     */
                                     * Exact value is not available. 10 - 20ms
                                     * appears to be enough for reset.
                                     */
+
+       /*
+        * Make sure that the chip is reset by reading back the r channel
+        * current reg. This is dummy read is required on some platforms -
+        * otherwise further access to the R G B channels in the
+        * LP5521_REG_ENABLE register will not have any effect - strange!
+        */
+       lp5521_read(client, LP5521_REG_R_CURRENT, &buf);
+       if (buf != LP5521_REG_R_CURR_DEFAULT) {
+               dev_err(&client->dev, "error in reseting chip\n");
+               goto fail2;
+       }
+       usleep_range(10000, 20000);
+
        ret = lp5521_detect(client);
 
        if (ret) {
        ret = lp5521_detect(client);
 
        if (ret) {