leds-lp55xx: use lp55xx common init function - reset
authorMilo(Woogyom) Kim <milo.kim@ti.com>
Tue, 5 Feb 2013 09:08:49 +0000 (18:08 +0900)
committerBryan Wu <cooloney@gmail.com>
Wed, 6 Feb 2013 23:59:27 +0000 (15:59 -0800)
 LP5521/5523 reset device functions are moved to lp55xx common driver.
 Value of register address and value are chip dependent.
 Those are configured in each driver.
 In init function, reset command is executed.

Signed-off-by: Milo(Woogyom) Kim <milo.kim@ti.com>
Signed-off-by: Bryan Wu <cooloney@gmail.com>
drivers/leds/leds-lp5521.c
drivers/leds/leds-lp5523.c
drivers/leds/leds-lp55xx-common.c
drivers/leds/leds-lp55xx-common.h

index 124ce80..e1f1dfc 100644 (file)
@@ -98,6 +98,9 @@
 /* Pattern Mode */
 #define PATTERN_OFF    0
 
+/* Reset register value */
+#define LP5521_RESET                   0xFF
+
 struct lp5521_engine {
        int             id;
        u8              mode;
@@ -709,26 +712,12 @@ static void lp5521_unregister_sysfs(struct i2c_client *client)
                                &lp5521_led_attribute_group);
 }
 
-static void lp5521_reset_device(struct lp5521_chip *chip)
-{
-       struct i2c_client *client = chip->client;
-
-       lp5521_write(client, LP5521_REG_RESET, 0xff);
-}
-
 static void lp5521_deinit_device(struct lp5521_chip *chip);
 static int lp5521_init_device(struct lp5521_chip *chip)
 {
        struct i2c_client *client = chip->client;
        int ret;
 
-       lp5521_reset_device(chip);
-
-       usleep_range(10000, 20000); /*
-                                    * Exact value is not available. 10 - 20ms
-                                    * appears to be enough for reset.
-                                    */
-
        ret = lp5521_detect(client);
        if (ret) {
                dev_err(&client->dev, "Chip not found\n");
@@ -856,6 +845,14 @@ static void lp5521_unregister_leds(struct lp5521_chip *chip)
        }
 }
 
+/* Chip specific configurations */
+static struct lp55xx_device_config lp5521_cfg = {
+       .reset = {
+               .addr = LP5521_REG_RESET,
+               .val  = LP5521_RESET,
+       },
+};
+
 static int lp5521_probe(struct i2c_client *client,
                        const struct i2c_device_id *id)
 {
@@ -881,6 +878,7 @@ static int lp5521_probe(struct i2c_client *client,
 
        chip->cl = client;
        chip->pdata = pdata;
+       chip->cfg = &lp5521_cfg;
 
        mutex_init(&chip->lock);
 
index 8e60204..0054778 100644 (file)
@@ -87,6 +87,7 @@
 #define LP5523_AUTO_CLK                        0x02
 #define LP5523_EN_LEDTEST              0x80
 #define LP5523_LEDTEST_DONE            0x80
+#define LP5523_RESET                   0xFF
 
 #define LP5523_DEFAULT_CURRENT         50 /* microAmps */
 #define LP5523_PROGRAM_LENGTH          32 /* in bytes */
@@ -900,25 +901,12 @@ static void lp5523_unregister_leds(struct lp5523_chip *chip)
        }
 }
 
-static void lp5523_reset_device(struct lp5523_chip *chip)
-{
-       struct i2c_client *client = chip->client;
-
-       lp5523_write(client, LP5523_REG_RESET, 0xff);
-}
-
 static void lp5523_deinit_device(struct lp5523_chip *chip);
 static int lp5523_init_device(struct lp5523_chip *chip)
 {
        struct i2c_client *client = chip->client;
        int ret;
 
-       lp5523_reset_device(chip);
-
-       usleep_range(10000, 20000); /*
-                                    * Exact value is not available. 10 - 20ms
-                                    * appears to be enough for reset.
-                                    */
        ret = lp5523_detect(client);
        if (ret)
                goto err;
@@ -947,6 +935,14 @@ static void lp5523_deinit_device(struct lp5523_chip *chip)
                pdata->release_resources();
 }
 
+/* Chip specific configurations */
+static struct lp55xx_device_config lp5523_cfg = {
+       .reset = {
+               .addr = LP5523_REG_RESET,
+               .val  = LP5523_RESET,
+       },
+};
+
 static int lp5523_probe(struct i2c_client *client,
                        const struct i2c_device_id *id)
 {
@@ -972,6 +968,7 @@ static int lp5523_probe(struct i2c_client *client,
 
        chip->cl = client;
        chip->pdata = pdata;
+       chip->cfg = &lp5523_cfg;
 
        mutex_init(&chip->lock);
 
index 05a854c..bbf2bbf 100644 (file)
 
 #include "leds-lp55xx-common.h"
 
+static void lp55xx_reset_device(struct lp55xx_chip *chip)
+{
+       struct lp55xx_device_config *cfg = chip->cfg;
+       u8 addr = cfg->reset.addr;
+       u8 val  = cfg->reset.val;
+
+       /* no error checking here because no ACK from the device after reset */
+       lp55xx_write(chip, addr, val);
+}
+
 int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val)
 {
        return i2c_smbus_write_byte_data(chip->cl, reg, val);
@@ -58,14 +68,16 @@ EXPORT_SYMBOL_GPL(lp55xx_update_bits);
 int lp55xx_init_device(struct lp55xx_chip *chip)
 {
        struct lp55xx_platform_data *pdata;
+       struct lp55xx_device_config *cfg;
        struct device *dev = &chip->cl->dev;
        int ret = 0;
 
        WARN_ON(!chip);
 
        pdata = chip->pdata;
+       cfg = chip->cfg;
 
-       if (!pdata)
+       if (!pdata || !cfg)
                return -EINVAL;
 
        if (pdata->setup_resources) {
@@ -83,6 +95,14 @@ int lp55xx_init_device(struct lp55xx_chip *chip)
                usleep_range(1000, 2000); /* 500us abs min. */
        }
 
+       lp55xx_reset_device(chip);
+
+       /*
+        * Exact value is not available. 10 - 20ms
+        * appears to be enough for reset.
+        */
+       usleep_range(10000, 20000);
+
 err:
        return ret;
 }
index 09d1882..a73ee0b 100644 (file)
@@ -19,17 +19,37 @@ struct lp55xx_led;
 struct lp55xx_chip;
 
 /*
+ * struct lp55xx_reg
+ * @addr : Register address
+ * @val  : Register value
+ */
+struct lp55xx_reg {
+       u8 addr;
+       u8 val;
+};
+
+/*
+ * struct lp55xx_device_config
+ * @reset              : Chip specific reset command
+ */
+struct lp55xx_device_config {
+       const struct lp55xx_reg reset;
+};
+
+/*
  * struct lp55xx_chip
  * @cl         : I2C communication for access registers
  * @pdata      : Platform specific data
  * @lock       : Lock for user-space interface
  * @num_leds   : Number of registered LEDs
+ * @cfg        : Device specific configuration data
  */
 struct lp55xx_chip {
        struct i2c_client *cl;
        struct lp55xx_platform_data *pdata;
        struct mutex lock;      /* lock for user-space interface */
        int num_leds;
+       struct lp55xx_device_config *cfg;
 };
 
 /*