static int lm3559_torch(unsigned char brightness) { unsigned char value; if (brightness > 0x1F) brightness = 0x1F; lm3559_write(TORCH_BRIGHTNESS_REG_INDEX, brightness);//set torch brightness value = lm3559_read(ENABLE_REG_INDEX); clrbits(value, 0x01); setbits(value, 0x02); lm3559_write(ENABLE_REG_INDEX,value); return 0; }
static int lm3559_set_duration(struct lm3559 *flash) { u8 val; val = (flash->timeout << LM3559_FLASH_TIMEOUT_SHIFT) | (flash->pdata->current_limit << LM3559_CURRENT_LIMIT_SHIFT); return lm3559_write(flash, LM3559_FLASH_DURATION_REG, val); }
static int lm3559_set_flash(struct lm3559 *flash) { u8 val; val = (flash->flash_current << LM3559_FLASH_LED1_CURRENT_SHIFT) | (flash->flash_current << LM3559_FLASH_LED2_CURRENT_SHIFT); return lm3559_write(flash, LM3559_FLASH_BRIGHTNESS_REG, val); }
static int lm3559_set_indicator(struct lm3559 *flash) { int ret; u8 val; val = (flash->indicator.indicator_current << LM3559_INDICATOR_CURRENT_SHIFT) | (flash->indicator.led1_enable << LM3559_INDICATOR_LED1_SHIFT) | (flash->indicator.led2_enable << LM3559_INDICATOR_LED2_SHIFT) | (flash->indicator.back_on << LM3559_INDICATOR_BACK_ON) | (flash->indicator.blinking_period << LM3559_INDICATOR_BLINKING_PERIOD_SHIFT); ret = lm3559_write(flash, LM3559_INDICATOR_PRIVACY_REG, val); if (ret) return ret; val = flash->indicator.pwm_period << LM3559_INDICATOR_PWM_PERIOD_SHIFT; ret = lm3559_write(flash, LM3559_INDICATOR_PWM_PERIOD_REG, val); return ret; }
static int lm3559_set_config(struct lm3559 *flash) { int ret; u8 val; val = LM3559_CONFIG_REG_1_INIT_SETTING & ~LM3559_TX2_POLARITY_MASK; val |= flash->pdata->tx2_polarity << LM3559_TX2_POLARITY_SHIFT; ret = lm3559_write(flash, LM3559_CONFIG_REG_1, val); if (ret) return ret; val = LM3559_CONFIG_REG_2_INIT_SETTING & ~LM3559_ENVM_TX2_MASK; val |= flash->pdata->envm_tx2 << LM3559_ENVM_TX2_SHIFT; ret = lm3559_write(flash, LM3559_CONFIG_REG_2, val); if (ret) return ret; val = LM3559_GPIO_REG_INIT_SETTING & ~LM3559_GPIO_DISABLE_TX2_MASK; val |= flash->pdata->disable_tx2 << LM3559_GPIO_DISABLE_TX2_SHIFT; return lm3559_write(flash, LM3559_GPIO_REG, val); }
static int lm3559_flash(unsigned char timeout) { unsigned char value; if (timeout > 0x1f) return -1; // Set flash brightness lm3559_write(FLASH_BRIGHTNESS_REG_INDEX, (flash_brightness << 4) | flash_brightness); value = lm3559_read(FLASH_DURATION_REG_INDEX); clrbits(value, 0x1F); setbits(value, timeout); lm3559_write(FLASH_DURATION_REG_INDEX, value); value = lm3559_read(ENABLE_REG_INDEX); setbits(value, 0x03); lm3559_write(ENABLE_REG_INDEX, value); return 0; }
static int lm3559_hw_strobe(struct i2c_client *client, bool strobe) { int ret, timer_pending; struct v4l2_subdev *sd = i2c_get_clientdata(client); struct lm3559 *flash = to_lm3559(sd); struct lm3559_platform_data *pdata = flash->pdata; /* * An abnormal high flash current is observed on lm3554 when * strobe off the flash. Workaround here is firstly set flash * current to lower level, wait a short moment, and then strobe * off the flash. * FIXME: The same issue exists with lm3559? */ timer_pending = del_timer_sync(&flash->flash_off_delay); /* Flash off */ if (!strobe) { /* set current to 70mA and wait a while */ ret = lm3559_write(flash, LM3559_FLASH_BRIGHTNESS_REG, 0); if (ret < 0) goto err; mod_timer(&flash->flash_off_delay, jiffies + msecs_to_jiffies(LM3559_TIMER_DELAY)); return 0; } /* Flash on */ /* * If timer is killed before run, flash is not strobe off, * so must strobe off here */ if (timer_pending) gpio_set_value(pdata->gpio_strobe, 0); /* Restore flash current settings */ ret = lm3559_set_flash(flash); if (ret < 0) goto err; /* Strobe on Flash */ gpio_set_value(pdata->gpio_strobe, 1); return 0; err: dev_err(&client->dev, "failed to %s flash strobe (%d)\n", strobe ? "on" : "off", ret); return ret; }
static int lm3559_set_mode(struct lm3559 *flash, unsigned int mode) { u8 val; int ret; val = lm3559_read(flash, LM3559_ENABLE_REG); val &= ~LM3559_MODE_MASK; val |= (mode & LM3559_MODE_MASK) << LM3559_MODE_SHIFT; ret = lm3559_write(flash, LM3559_ENABLE_REG, val); if (ret == 0) flash->mode = mode; return ret; }