/* * 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 #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