aboutsummaryrefslogtreecommitdiff
path: root/drivers/leds
diff options
context:
space:
mode:
authorShreshtha Kumar Sahu <shreshthakumar.sahu@stericsson.com>2011-01-24 15:42:53 +0530
committerLinus WALLEIJ <linus.walleij@stericsson.com>2011-01-25 13:52:43 +0100
commita4fff495ba3113942d6f7a11d1892a7634881a36 (patch)
treeccedab474071f3602ae192672125bf2191b231e0 /drivers/leds
parent019d31f7e9b89cf25ed4bbe31728654c48a22728 (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.c131
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;