diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/leds/leds-lm3530.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/drivers/leds/leds-lm3530.c b/drivers/leds/leds-lm3530.c index ce79523a4d10..a889311eead1 100644 --- a/drivers/leds/leds-lm3530.c +++ b/drivers/leds/leds-lm3530.c | |||
@@ -157,6 +157,7 @@ static int lm3530_init_registers(struct lm3530_data *drvdata) | |||
157 | u32 als_vmin, als_vmax, als_vstep; | 157 | u32 als_vmin, als_vmax, als_vstep; |
158 | struct lm3530_platform_data *pltfm = drvdata->pdata; | 158 | struct lm3530_platform_data *pltfm = drvdata->pdata; |
159 | struct i2c_client *client = drvdata->client; | 159 | struct i2c_client *client = drvdata->client; |
160 | struct lm3530_pwm_data *pwm = &pltfm->pwm_data; | ||
160 | 161 | ||
161 | gen_config = (pltfm->brt_ramp_law << LM3530_RAMP_LAW_SHIFT) | | 162 | gen_config = (pltfm->brt_ramp_law << LM3530_RAMP_LAW_SHIFT) | |
162 | ((pltfm->max_current & 7) << LM3530_MAX_CURR_SHIFT); | 163 | ((pltfm->max_current & 7) << LM3530_MAX_CURR_SHIFT); |
@@ -240,6 +241,15 @@ static int lm3530_init_registers(struct lm3530_data *drvdata) | |||
240 | } | 241 | } |
241 | 242 | ||
242 | for (i = 0; i < LM3530_REG_MAX; i++) { | 243 | for (i = 0; i < LM3530_REG_MAX; i++) { |
244 | /* do not update brightness register when pwm mode */ | ||
245 | if (lm3530_reg[i] == LM3530_BRT_CTRL_REG && | ||
246 | drvdata->mode == LM3530_BL_MODE_PWM) { | ||
247 | if (pwm->pwm_set_intensity) | ||
248 | pwm->pwm_set_intensity(reg_val[i], | ||
249 | drvdata->led_dev.max_brightness); | ||
250 | continue; | ||
251 | } | ||
252 | |||
243 | ret = i2c_smbus_write_byte_data(client, | 253 | ret = i2c_smbus_write_byte_data(client, |
244 | lm3530_reg[i], reg_val[i]); | 254 | lm3530_reg[i], reg_val[i]); |
245 | if (ret) | 255 | if (ret) |
@@ -255,6 +265,9 @@ static void lm3530_brightness_set(struct led_classdev *led_cdev, | |||
255 | int err; | 265 | int err; |
256 | struct lm3530_data *drvdata = | 266 | struct lm3530_data *drvdata = |
257 | container_of(led_cdev, struct lm3530_data, led_dev); | 267 | container_of(led_cdev, struct lm3530_data, led_dev); |
268 | struct lm3530_platform_data *pdata = drvdata->pdata; | ||
269 | struct lm3530_pwm_data *pwm = &pdata->pwm_data; | ||
270 | u8 max_brightness = led_cdev->max_brightness; | ||
258 | 271 | ||
259 | switch (drvdata->mode) { | 272 | switch (drvdata->mode) { |
260 | case LM3530_BL_MODE_MANUAL: | 273 | case LM3530_BL_MODE_MANUAL: |
@@ -288,6 +301,8 @@ static void lm3530_brightness_set(struct led_classdev *led_cdev, | |||
288 | case LM3530_BL_MODE_ALS: | 301 | case LM3530_BL_MODE_ALS: |
289 | break; | 302 | break; |
290 | case LM3530_BL_MODE_PWM: | 303 | case LM3530_BL_MODE_PWM: |
304 | if (pwm->pwm_set_intensity) | ||
305 | pwm->pwm_set_intensity(brt_val, max_brightness); | ||
291 | break; | 306 | break; |
292 | default: | 307 | default: |
293 | break; | 308 | break; |
@@ -318,23 +333,24 @@ static ssize_t lm3530_mode_set(struct device *dev, struct device_attribute | |||
318 | { | 333 | { |
319 | struct led_classdev *led_cdev = dev_get_drvdata(dev); | 334 | struct led_classdev *led_cdev = dev_get_drvdata(dev); |
320 | struct lm3530_data *drvdata; | 335 | struct lm3530_data *drvdata; |
336 | struct lm3530_pwm_data *pwm; | ||
337 | u8 max_brightness; | ||
321 | int mode, err; | 338 | int mode, err; |
322 | 339 | ||
323 | drvdata = container_of(led_cdev, struct lm3530_data, led_dev); | 340 | drvdata = container_of(led_cdev, struct lm3530_data, led_dev); |
341 | pwm = &drvdata->pdata->pwm_data; | ||
342 | max_brightness = led_cdev->max_brightness; | ||
324 | mode = lm3530_get_mode_from_str(buf); | 343 | mode = lm3530_get_mode_from_str(buf); |
325 | if (mode < 0) { | 344 | if (mode < 0) { |
326 | dev_err(dev, "Invalid mode\n"); | 345 | dev_err(dev, "Invalid mode\n"); |
327 | return -EINVAL; | 346 | return -EINVAL; |
328 | } | 347 | } |
329 | 348 | ||
330 | if (mode == LM3530_BL_MODE_MANUAL) | 349 | drvdata->mode = mode; |
331 | drvdata->mode = LM3530_BL_MODE_MANUAL; | 350 | |
332 | else if (mode == LM3530_BL_MODE_ALS) | 351 | /* set pwm to low if unnecessary */ |
333 | drvdata->mode = LM3530_BL_MODE_ALS; | 352 | if (mode != LM3530_BL_MODE_PWM && pwm->pwm_set_intensity) |
334 | else if (mode == LM3530_BL_MODE_PWM) { | 353 | pwm->pwm_set_intensity(0, max_brightness); |
335 | dev_err(dev, "PWM mode not supported\n"); | ||
336 | return -EINVAL; | ||
337 | } | ||
338 | 354 | ||
339 | err = lm3530_init_registers(drvdata); | 355 | err = lm3530_init_registers(drvdata); |
340 | if (err) { | 356 | if (err) { |