diff options
author | Shreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com> | 2011-01-24 15:42:53 +0530 |
---|---|---|
committer | Linus WALLEIJ <linus.walleij@stericsson.com> | 2011-01-25 13:52:43 +0100 |
commit | a4fff495ba3113942d6f7a11d1892a7634881a36 (patch) | |
tree | ccedab474071f3602ae192672125bf2191b231e0 /drivers/leds | |
parent | 019d31f7e9b89cf25ed4bbe31728654c48a22728 (diff) |
leds: LM3530: meaningful values to sysfs input
sysfs interface to take meaningful values from user
i.e. "mod", "als", "pwm" instead of values like 0, 1 etc.
Also made the lm3530_init_registers() cleaner.
ST-Ericsson ID: WP 319076
Signed-off-by: Shreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com>
Change-Id: Ie2052f3f465452b0bdbe1567821eaee49a701808
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/13275
Reviewed-by: QATOOLS
Reviewed-by: Arun MURTHY <arun.murthy@stericsson.com>
Reviewed-by: Linus WALLEIJ <linus.walleij@stericsson.com>
Diffstat (limited to 'drivers/leds')
-rw-r--r-- | drivers/leds/leds-lm3530.c | 131 |
1 files changed, 72 insertions, 59 deletions
diff --git a/drivers/leds/leds-lm3530.c b/drivers/leds/leds-lm3530.c index 41a1e4c2e38..e7089a1f6cb 100644 --- a/drivers/leds/leds-lm3530.c +++ b/drivers/leds/leds-lm3530.c @@ -36,6 +36,7 @@ #define LM3530_ALS_Z2T_REG 0x72 #define LM3530_ALS_Z3T_REG 0x73 #define LM3530_ALS_Z4T_REG 0x74 +#define LM3530_REG_MAX 15 /* General Control Register */ #define LM3530_EN_I2C_SHIFT (0) @@ -78,6 +79,17 @@ #define LM3530_DEF_ZT_3 (0x66) #define LM3530_DEF_ZT_4 (0x7F) +struct lm3530_mode_map { + const char *mode; + enum lm3530_mode mode_val; +}; + +static struct lm3530_mode_map mode_map[] = { + { "man", LM3530_BL_MODE_MANUAL }, + { "als", LM3530_BL_MODE_ALS }, + { "pwm", LM3530_BL_MODE_PWM }, +}; + /** * struct lm3530_data * @led_dev: led class device @@ -92,14 +104,45 @@ struct lm3530_data { enum lm3530_mode mode; }; +static const u8 lm3530_reg[LM3530_REG_MAX] = { + LM3530_GEN_CONFIG, + LM3530_ALS_CONFIG, + LM3530_BRT_RAMP_RATE, + LM3530_ALS_ZONE_REG, + LM3530_ALS_IMP_SELECT, + LM3530_BRT_CTRL_REG, + LM3530_ALS_ZB0_REG, + LM3530_ALS_ZB1_REG, + LM3530_ALS_ZB2_REG, + LM3530_ALS_ZB3_REG, + LM3530_ALS_Z0T_REG, + LM3530_ALS_Z1T_REG, + LM3530_ALS_Z2T_REG, + LM3530_ALS_Z3T_REG, + LM3530_ALS_Z4T_REG, +}; + +static int lm3530_get_mode_from_str(const char *str) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(mode_map); i++) + if (sysfs_streq(str, mode_map[i].mode)) + return mode_map[i].mode_val; + + return -1; +} + static int lm3530_init_registers(struct lm3530_data *drvdata) { int ret = 0; + int i; u8 gen_config; u8 als_config = 0; u8 brt_ramp; u8 als_imp_sel = 0; u8 brightness; + u8 reg_val[LM3530_REG_MAX]; struct lm3530_platform_data *pltfm = drvdata->pdata; struct i2c_client *client = drvdata->client; @@ -131,62 +174,28 @@ static int lm3530_init_registers(struct lm3530_data *drvdata) brightness = pltfm->brt_val; - ret = i2c_smbus_write_byte_data(client, - LM3530_GEN_CONFIG, gen_config); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_CONFIG, als_config); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_BRT_RAMP_RATE, brt_ramp); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_IMP_SELECT, als_imp_sel); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_BRT_CTRL_REG, brightness); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_ZB0_REG, LM3530_DEF_ZB_0); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_ZB1_REG, LM3530_DEF_ZB_1); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_ZB2_REG, LM3530_DEF_ZB_2); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_ZB3_REG, LM3530_DEF_ZB_3); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_Z0T_REG, LM3530_DEF_ZT_0); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_Z1T_REG, LM3530_DEF_ZT_1); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_Z2T_REG, LM3530_DEF_ZT_2); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_Z3T_REG, LM3530_DEF_ZT_3); - if (ret) - return ret; - ret = i2c_smbus_write_byte_data(client, - LM3530_ALS_Z4T_REG, LM3530_DEF_ZT_4); - if (ret) - return ret; + reg_val[0] = gen_config; /* LM3530_GEN_CONFIG */ + reg_val[1] = als_config; /* LM3530_ALS_CONFIG */ + reg_val[2] = brt_ramp; /* LM3530_BRT_RAMP_RATE */ + reg_val[3] = 0x00; /* LM3530_ALS_ZONE_REG */ + reg_val[4] = als_imp_sel; /* LM3530_ALS_IMP_SELECT */ + reg_val[5] = brightness; /* LM3530_BRT_CTRL_REG */ + reg_val[6] = LM3530_DEF_ZB_0; /* LM3530_ALS_ZB0_REG */ + reg_val[7] = LM3530_DEF_ZB_1; /* LM3530_ALS_ZB1_REG */ + reg_val[8] = LM3530_DEF_ZB_2; /* LM3530_ALS_ZB2_REG */ + reg_val[9] = LM3530_DEF_ZB_3; /* LM3530_ALS_ZB3_REG */ + reg_val[10] = LM3530_DEF_ZT_0; /* LM3530_ALS_Z0T_REG */ + reg_val[11] = LM3530_DEF_ZT_1; /* LM3530_ALS_Z1T_REG */ + reg_val[12] = LM3530_DEF_ZT_2; /* LM3530_ALS_Z2T_REG */ + reg_val[13] = LM3530_DEF_ZT_3; /* LM3530_ALS_Z3T_REG */ + reg_val[14] = LM3530_DEF_ZT_4; /* LM3530_ALS_Z4T_REG */ + + for (i = 0; i < LM3530_REG_MAX; i++) { + ret = i2c_smbus_write_byte_data(client, + lm3530_reg[i], reg_val[i]); + if (ret) + break; + } return ret; } @@ -212,6 +221,8 @@ static void lm3530_brightness_set(struct led_classdev *led_cdev, break; case LM3530_BL_MODE_PWM: break; + default: + break; } } @@ -223,11 +234,13 @@ static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute struct i2c_client *client = container_of( dev->parent, struct i2c_client, dev); struct lm3530_data *drvdata = i2c_get_clientdata(client); - unsigned long mode; + int mode; - err = strict_strtoul(buf, 10, &mode); - if (err < 0) + mode = lm3530_get_mode_from_str(buf); + if (mode < 0) { + dev_err(dev, "Invalid mode\n"); return -EINVAL; + } if (mode == LM3530_BL_MODE_MANUAL) drvdata->mode = LM3530_BL_MODE_MANUAL; |