static int max77693_set_mode_reg(struct max77693_led_device *led, u8 mode) { struct regmap *rmap = led->regmap; int ret, v = 0, i; for (i = FLED1; i <= FLED2; ++i) { if (mode & MODE_TORCH(i)) v |= FLASH_EN_ON << TORCH_EN_SHIFT(i); if (mode & MODE_FLASH(i)) { v |= FLASH_EN_ON << FLASH_EN_SHIFT(i); } else if (mode & MODE_FLASH_EXTERNAL(i)) { v |= FLASH_EN_FLASH << FLASH_EN_SHIFT(i); /* * Enable hw triggering also for torch mode, as some * camera sensors use torch led to fathom ambient light * conditions before strobing the flash. */ v |= FLASH_EN_TORCH << TORCH_EN_SHIFT(i); } } /* Reset the register only prior setting flash modes */ if (mode & ~(MODE_TORCH(FLED1) | MODE_TORCH(FLED2))) { ret = regmap_write(rmap, MAX77693_LED_REG_FLASH_EN, 0); if (ret < 0) return ret; } return regmap_write(rmap, MAX77693_LED_REG_FLASH_EN, v); }
static int __max77693_led_brightness_set(struct max77693_led_device *led, int fled_id, enum led_brightness value) { int ret; mutex_lock(&led->lock); if (value == 0) { ret = max77693_clear_mode(led, MODE_TORCH(fled_id)); if (ret < 0) dev_dbg(&led->pdev->dev, "Failed to clear torch mode (%d)\n", ret); goto unlock; } ret = max77693_set_torch_current(led, fled_id, value * TORCH_IOUT_STEP); if (ret < 0) { dev_dbg(&led->pdev->dev, "Failed to set torch current (%d)\n", ret); goto unlock; } ret = max77693_add_mode(led, MODE_TORCH(fled_id)); if (ret < 0) dev_dbg(&led->pdev->dev, "Failed to set torch mode (%d)\n", ret); unlock: mutex_unlock(&led->lock); return ret; }
static void max77693_add_allowed_modes(struct max77693_led_device *led, int fled_id, enum max77693_led_mode mode) { if (mode == FLASH) led->allowed_modes |= (MODE_FLASH(fled_id) | MODE_FLASH_EXTERNAL(fled_id)); else led->allowed_modes |= MODE_TORCH(fled_id); }
/* LED subsystem callbacks */ static int max77693_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness value) { struct led_classdev_flash *fled_cdev = lcdev_to_flcdev(led_cdev); struct max77693_sub_led *sub_led = flcdev_to_sub_led(fled_cdev); struct max77693_led_device *led = sub_led_to_led(sub_led); int fled_id = sub_led->fled_id, ret; mutex_lock(&led->lock); if (value == 0) { ret = max77693_clear_mode(led, MODE_TORCH(fled_id)); if (ret < 0) dev_dbg(&led->pdev->dev, "Failed to clear torch mode (%d)\n", ret); goto unlock; } ret = max77693_set_torch_current(led, fled_id, value * TORCH_IOUT_STEP); if (ret < 0) { dev_dbg(&led->pdev->dev, "Failed to set torch current (%d)\n", ret); goto unlock; } ret = max77693_add_mode(led, MODE_TORCH(fled_id)); if (ret < 0) dev_dbg(&led->pdev->dev, "Failed to set torch mode (%d)\n", ret); unlock: mutex_unlock(&led->lock); return ret; }