Commit 48068d5d authored by Milo(Woogyom) Kim's avatar Milo(Woogyom) Kim Committed by Bryan Wu

leds-lp55xx: use lp55xx common init function - reset

 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: default avatarMilo(Woogyom) Kim <milo.kim@ti.com>
Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
parent a85908dd
...@@ -98,6 +98,9 @@ ...@@ -98,6 +98,9 @@
/* Pattern Mode */ /* Pattern Mode */
#define PATTERN_OFF 0 #define PATTERN_OFF 0
/* Reset register value */
#define LP5521_RESET 0xFF
struct lp5521_engine { struct lp5521_engine {
int id; int id;
u8 mode; u8 mode;
...@@ -709,26 +712,12 @@ static void lp5521_unregister_sysfs(struct i2c_client *client) ...@@ -709,26 +712,12 @@ static void lp5521_unregister_sysfs(struct i2c_client *client)
&lp5521_led_attribute_group); &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 void lp5521_deinit_device(struct lp5521_chip *chip);
static int lp5521_init_device(struct lp5521_chip *chip) static int lp5521_init_device(struct lp5521_chip *chip)
{ {
struct i2c_client *client = chip->client; struct i2c_client *client = chip->client;
int ret; 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); ret = lp5521_detect(client);
if (ret) { if (ret) {
dev_err(&client->dev, "Chip not found\n"); dev_err(&client->dev, "Chip not found\n");
...@@ -856,6 +845,14 @@ static void lp5521_unregister_leds(struct lp5521_chip *chip) ...@@ -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, static int lp5521_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
...@@ -881,6 +878,7 @@ static int lp5521_probe(struct i2c_client *client, ...@@ -881,6 +878,7 @@ static int lp5521_probe(struct i2c_client *client,
chip->cl = client; chip->cl = client;
chip->pdata = pdata; chip->pdata = pdata;
chip->cfg = &lp5521_cfg;
mutex_init(&chip->lock); mutex_init(&chip->lock);
......
...@@ -87,6 +87,7 @@ ...@@ -87,6 +87,7 @@
#define LP5523_AUTO_CLK 0x02 #define LP5523_AUTO_CLK 0x02
#define LP5523_EN_LEDTEST 0x80 #define LP5523_EN_LEDTEST 0x80
#define LP5523_LEDTEST_DONE 0x80 #define LP5523_LEDTEST_DONE 0x80
#define LP5523_RESET 0xFF
#define LP5523_DEFAULT_CURRENT 50 /* microAmps */ #define LP5523_DEFAULT_CURRENT 50 /* microAmps */
#define LP5523_PROGRAM_LENGTH 32 /* in bytes */ #define LP5523_PROGRAM_LENGTH 32 /* in bytes */
...@@ -900,25 +901,12 @@ static void lp5523_unregister_leds(struct lp5523_chip *chip) ...@@ -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 void lp5523_deinit_device(struct lp5523_chip *chip);
static int lp5523_init_device(struct lp5523_chip *chip) static int lp5523_init_device(struct lp5523_chip *chip)
{ {
struct i2c_client *client = chip->client; struct i2c_client *client = chip->client;
int ret; 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); ret = lp5523_detect(client);
if (ret) if (ret)
goto err; goto err;
...@@ -947,6 +935,14 @@ static void lp5523_deinit_device(struct lp5523_chip *chip) ...@@ -947,6 +935,14 @@ static void lp5523_deinit_device(struct lp5523_chip *chip)
pdata->release_resources(); 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, static int lp5523_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
...@@ -972,6 +968,7 @@ static int lp5523_probe(struct i2c_client *client, ...@@ -972,6 +968,7 @@ static int lp5523_probe(struct i2c_client *client,
chip->cl = client; chip->cl = client;
chip->pdata = pdata; chip->pdata = pdata;
chip->cfg = &lp5523_cfg;
mutex_init(&chip->lock); mutex_init(&chip->lock);
......
...@@ -20,6 +20,16 @@ ...@@ -20,6 +20,16 @@
#include "leds-lp55xx-common.h" #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) int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val)
{ {
return i2c_smbus_write_byte_data(chip->cl, reg, val); return i2c_smbus_write_byte_data(chip->cl, reg, val);
...@@ -58,14 +68,16 @@ EXPORT_SYMBOL_GPL(lp55xx_update_bits); ...@@ -58,14 +68,16 @@ EXPORT_SYMBOL_GPL(lp55xx_update_bits);
int lp55xx_init_device(struct lp55xx_chip *chip) int lp55xx_init_device(struct lp55xx_chip *chip)
{ {
struct lp55xx_platform_data *pdata; struct lp55xx_platform_data *pdata;
struct lp55xx_device_config *cfg;
struct device *dev = &chip->cl->dev; struct device *dev = &chip->cl->dev;
int ret = 0; int ret = 0;
WARN_ON(!chip); WARN_ON(!chip);
pdata = chip->pdata; pdata = chip->pdata;
cfg = chip->cfg;
if (!pdata) if (!pdata || !cfg)
return -EINVAL; return -EINVAL;
if (pdata->setup_resources) { if (pdata->setup_resources) {
...@@ -83,6 +95,14 @@ int lp55xx_init_device(struct lp55xx_chip *chip) ...@@ -83,6 +95,14 @@ int lp55xx_init_device(struct lp55xx_chip *chip)
usleep_range(1000, 2000); /* 500us abs min. */ 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: err:
return ret; return ret;
} }
......
...@@ -18,18 +18,38 @@ ...@@ -18,18 +18,38 @@
struct lp55xx_led; struct lp55xx_led;
struct lp55xx_chip; 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 * struct lp55xx_chip
* @cl : I2C communication for access registers * @cl : I2C communication for access registers
* @pdata : Platform specific data * @pdata : Platform specific data
* @lock : Lock for user-space interface * @lock : Lock for user-space interface
* @num_leds : Number of registered LEDs * @num_leds : Number of registered LEDs
* @cfg : Device specific configuration data
*/ */
struct lp55xx_chip { struct lp55xx_chip {
struct i2c_client *cl; struct i2c_client *cl;
struct lp55xx_platform_data *pdata; struct lp55xx_platform_data *pdata;
struct mutex lock; /* lock for user-space interface */ struct mutex lock; /* lock for user-space interface */
int num_leds; int num_leds;
struct lp55xx_device_config *cfg;
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment