blob: 44eb9ffc4692105d3960d3a4f7929a583d3890c8 [file] [log] [blame]
/*
* leds-s2mu106.h - Flash-led driver for Samsung S2MU106
*
* Copyright (C) 2020 Samsung Electronics
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#ifndef __LEDS_S2MU106_FLASH_H__
#define __LEDS_S2MU106_FLASH_H__
#include <linux/leds.h>
#define MASK(width, shift) (((0x1 << (width)) - 1) << shift)
#define FLED_EN 0
#define S2MU106_CH_MAX 3
#define S2MU106_FLASH_LIGHT_MAX 5
/* Interrupt register */
#define S2MU106_FLED_INT1 0x04
#define S2MU106_FLED_INT2 0x05
#define S2MU106_FLED_INT1_MASK 0x0B
#define S2MU106_FLED_INT2_MASK 0x0C
/* Status register */
#define S2MU106_FLED_STATUS1 0x14
#define S2MU106_FLED_STATUS2 0x15
/* Mask for status register */
#define S2MU106_CH1_FLASH_ON MASK(1,7)
#define S2MU106_CH1_TORCH_ON MASK(1,6)
#define S2MU106_CH2_FLASH_ON MASK(1,5)
#define S2MU106_CH2_TORCH_ON MASK(1,4)
#define S2MU106_CH3_FLASH_ON MASK(1,3)
#define S2MU106_CH3_TORCH_ON MASK(1,2)
#define S2MU106_FLED_ON_CHECK MASK(6,2)
/* Channel control */
#define S2MU106_FLED_CH1_CTRL0 0x53
#define S2MU106_FLED_CH1_CTRL1 0x54
#define S2MU106_FLED_CH1_CTRL2 0x55
#define S2MU106_FLED_CH2_CTRL0 0x56
#define S2MU106_FLED_CH2_CTRL1 0x57
#define S2MU106_FLED_CH2_CTRL2 0x58
#define S2MU106_FLED_CH3_CTRL0 0x59
#define S2MU106_FLED_CH3_CTRL1 0x5A
#define S2MU106_FLED_CH3_CTRL2 0x5B
/* Mask for channel control register */
#define S2MU106_CHX_OPEN_PROT_EN MASK(1,7)
#define S2MU106_CHX_SHORT_PROT_EN MASK(1,6)
#define S2MU106_CHX_FLASH_IOUT MASK(5,0)
#define S2MU106_CHX_TORCH_TMR_MODE MASK(1,7)
#define S2MU106_CHX_DIS_TORCH_TMR MASK(1,6)
#define S2MU106_CHX_FLASH_TMR_MODE MASK(1,5)
#define S2MU106_CHX_TORCH_IOUT MASK(5,0)
#define S2MU106_CHX_FLASH_TMR_DUR MASK(4,4)
#define S2MU106_CHX_TORCH_TMR_DUR MASK(4,0)
/* Mode control */
#define S2MU106_FLED_CTRL0 0x5C
#define S2MU106_FLED_CTRL1 0x5D
#define S2MU106_FLED_CTRL2 0x5E
#define S2MU106_FLED_CTRL3 0x5F
#define S2MU106_FLED_CTRL4 0x60
#define S2MU106_FLED_CTRL5 0x61
#define S2MU106_FLED_CTRL6 0x62
#define S2MU106_FLED_CTRL7 0x63
#define S2MU106_FLED_TEST3 0x66
#define S2MU106_FLED_TEST4 0x67
/* Mask for channel control register */
#define S2MU106_CHX_FLASH_FLED_EN MASK(3,3)
#define S2MU106_CHX_TORCH_FLED_EN MASK(3,0)
#define S2MU106_EN_FLED_PRE MASK(1,5)
#define S2MU106_FLED_EN 0x5
#define S2MU106_FLED_GPIO_EN1 0x01
#define S2MU106_FLED_GPIO_EN2 0x02
#define S2MU106_FLED_GPIO_EN3 0x03
#define S2MU106_FLED_GPIO_EN4 0x04
/* Mask for Mode control register */
#define S2MU106_FLED_MODE MASK(2,6)
#define S2MU106_EN_FLED_PRE MASK(1,5)
#define S2MU106_FLED_SOFT_ON_TIME MASK(3,1)
#define S2MU106_FLED_REG_RESET MASK(1,0)
#define S2MU106_CHX_FLASH_FLED_EN MASK(3,3)
#define S2MU106_CHX_TORCH_FLED_EN MASK(3,0)
#define S2MU106_FLED_ADAPTIVE_MODE_EN MASK(1,5)
#define S2MU106_SET_BOOST_VOUT_FLASH MASK(5,0)
#define S2MU106_READ_BOOST_VOUT_FLASH MASK(5,0)
#define S2MU106_F2C_LC_IBAT MASK(6,0)
#define S2MU106_F2C_SYS_MIN_REG MASK(3,0)
/* FLED operating mode enable */
enum operating_mode {
AUTO_MODE = 0,
BOOST_MODE,
TA_MODE,
SYS_MODE,
};
enum cam_flash_mode{
CAM_FLASH_MODE_NONE=0,
CAM_FLASH_MODE_OFF,
CAM_FLASH_MODE_SINGLE,
CAM_FLASH_MODE_TORCH,
};
enum s2mu106_fled_mode {
S2MU106_FLED_MODE_OFF,
S2MU106_FLED_MODE_TORCH,
S2MU106_FLED_MODE_FLASH,
S2MU106_FLED_MODE_MOVIE,
S2MU106_FLED_MODE_FACTORY,
S2MU106_FLED_MODE_MAX,
};
struct s2mu106_fled_chan {
int id;
u32 curr;
u32 timer;
u8 mode;
};
struct s2mu106_fled_platform_data {
struct s2mu106_fled_chan *channel;
int chan_num;
int flash_gpio;
int torch_gpio;
u32 default_current;
u32 max_current;
u8 default_mode;
u32 default_timer;
unsigned int flash_current;
unsigned int torch_current;
unsigned int preflash_current;
unsigned int movie_current;
unsigned int factory_current;
unsigned int flashlight_current[S2MU106_FLASH_LIGHT_MAX];
};
struct s2mu106_fled_data {
struct s2mu106_fled_platform_data *pdata;
struct s2mu106_fled_chan channel[S2MU106_CH_MAX];
struct led_classdev cdev;
struct device *dev;
int set_on_factory;
int flash_gpio;
int torch_gpio;
int sysfs_input_data;
int control_mode; /* 0 : I2C, 1 : GPIO */
/* charger mode control */
bool is_en_flash;
struct power_supply *psy_chg;
struct i2c_client *i2c;
struct mutex lock;
u32 default_current;
unsigned int flash_current;
unsigned int torch_current;
unsigned int preflash_current;
unsigned int movie_current;
unsigned int factory_current;
unsigned int flashlight_current[S2MU106_FLASH_LIGHT_MAX];
};
int s2mu106_fled_set_mode_ctrl(int chan, enum cam_flash_mode cam_mode);
int s2mu106_fled_set_curr(int chan, enum cam_flash_mode cam_mode, int curr);
int s2mu106_fled_get_curr(int chan, enum cam_flash_mode cam_mode);
int s2mu106_led_mode_ctrl(int state);
void s2mu106_fled_set_operation_mode(int val);
#endif