Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 358600
b: refs/heads/master
c: 48068d5
h: refs/heads/master
v: v3
  • Loading branch information
Milo(Woogyom) Kim authored and Bryan Wu committed Feb 6, 2013
1 parent 24e6921 commit 5fe8cda
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a85908dd7799e4fa242812ce27a8f774c721d1fb
refs/heads/master: 48068d5de16c23c256c085b2cd3ff03bec393900
26 changes: 12 additions & 14 deletions trunk/drivers/leds/leds-lp5521.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@
/* Pattern Mode */
#define PATTERN_OFF 0

/* Reset register value */
#define LP5521_RESET 0xFF

struct lp5521_engine {
int id;
u8 mode;
Expand Down Expand Up @@ -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");
Expand Down Expand Up @@ -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)
{
Expand All @@ -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);

Expand Down
23 changes: 10 additions & 13 deletions trunk/drivers/leds/leds-lp5523.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)
{
Expand All @@ -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);

Expand Down
22 changes: 21 additions & 1 deletion trunk/drivers/leds/leds-lp55xx-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,16 @@

#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);
Expand Down Expand Up @@ -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) {
Expand All @@ -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;
}
Expand Down
20 changes: 20 additions & 0 deletions trunk/drivers/leds/leds-lp55xx-common.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,38 @@
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;
};

/*
Expand Down

0 comments on commit 5fe8cda

Please sign in to comment.