#ifndef _DRIVERS_LEDS_RGB_LP5860_H
#define _DRIVERS_LEDS_RGB_LP5860_H
#include <linux/led-class-multicolor.h>
#include <linux/regmap.h>
#define LP5860_REG_CHIP_EN 0x00
#define LP5860_REG_DEV_INITIAL 0x01
#define LP5860_REG_DEV_CONFIG1 0x02
#define LP5860_REG_DEV_CONFIG2 0x03
#define LP5860_REG_DEV_CONFIG3 0x04
#define LP5860_REG_GLOBAL_BRI 0x05
#define LP5860_REG_GROUP0_BRI 0x06
#define LP5860_REG_GROUP1_BRI 0x07
#define LP5860_REG_GROUP2_BRI 0x08
#define LP5860_REG_R_CURRENT_SET 0x09
#define LP5860_REG_G_CURRENT_SET 0x0A
#define LP5860_REG_B_CURRENT_SET 0x0B
#define LP5860_REG_GRP_SEL_START 0x0C
#define LP5860_REG_DOT_ONOFF_START 0x43
#define LP5860_REG_DOT_ONOFF_MAX 0x63
#define LP5860_REG_FAULT_STATE 0x64
#define LP5860_REG_DOT_LOD_START 0x65
#define LP5860_REG_DOT_LSD_START 0x86
#define LP5860_REG_LOD_CLEAR 0xA7
#define LP5860_REG_LSD_CLEAR 0xA8
#define LP5860_REG_RESET 0xA9
#define LP5860_REG_DC_START 0x0100
#define LP5860_REG_PWM_BRI_START 0x0200
#define LP5860_MAX_REG 0x038B
#define LP5860_CHIP_SHIFT 0
#define LP5860_CHIP_MASK BIT(0)
#define LP5860_CHIP_DISABLE false
#define LP5860_CHIP_ENABLE true
#define LP5860_MAX_LINE_SHIFT 3
#define LP5860_MAX_LINE_MASK GENMASK(6, 3)
#define LP5860_MAX_LINE_11 0x0B
#define LP5860_MAX_LINE_10 0x0A
#define LP5860_MAX_LINE_9 0x09
#define LP5860_MAX_LINE_8 0x08
#define LP5860_MAX_LINE_7 0x07
#define LP5860_MAX_LINE_6 0x06
#define LP5860_MAX_LINE_5 0x05
#define LP5860_MAX_LINE_4 0x04
#define LP5860_MAX_LINE_3 0x03
#define LP5860_MAX_LINE_2 0x02
#define LP5860_MAX_LINE_1 0x01
#define LP5860_MODE_SHIFT 1
#define LP5860_MODE_MASK GENMASK(2, 1)
#define LP5860_MODE_3_1 0x03
#define LP5860_MODE_3 0x02
#define LP5860_MODE_2 0x01
#define LP5860_MODE_1 0x00
#define LP5860_PWM_FREQUENCY_SHIFT 0
#define LP5860_PWM_FREQUENCY_MASK BIT(0)
#define LP5860_PWM_FREQUENCY_62_5K 0x01
#define LP5860_PWM_FREQUENCY_125K 0x00
#define LP5860_SW_BLK_SHIFT 3
#define LP5860_SW_BLK_MASK BIT(3)
#define LP5860_SW_BLK_05US 0x01
#define LP5860_SW_BLK_1US 0x00
#define LP5860_PWM_SCALE_MODE_SHIFT 2
#define LP5860_PWM_SCALE_MODE_MASK BIT(2)
#define LP5860_PWM_SCALE_EXPONENTIAL 0x01
#define LP5860_PWM_SCALE_LINEAR 0x00
#define LP5860_PWM_PHASESHIFT_SHIFT 1
#define LP5860_PWM_PHASESHIFT_MASK BIT(1)
#define LP5860_PWM_PHASESHIFT_ON 0x01
#define LP5860_PWM_PHASESHIFT_OFF 0x00
#define LP5860_CS_ON_SHIFT_SHIFT 0
#define LP5860_CS_ON_SHIFT_MASK BIT(0)
#define LP5860_CS_DELAY_ON 0x01
#define LP5860_CS_DELAY_OFF 0x00
#define LP5860_COMP_GROUP3_SHIFT 6
#define LP5860_COMP_GROUP3_MASK GENMASK(7, 6)
#define LP5860_COMP_GROUP3_3CLOCK 0x03
#define LP5860_COMP_GROUP3_2CLOCK 0x02
#define LP5860_COMP_GROUP3_1CLOCK 0x01
#define LP5860_COMP_GROUP3_OFF 0x00
#define LP5860_COMP_GROUP2_SHIFT 4
#define LP5860_COMP_GROUP2_MASK GENMASK(5, 4)
#define LP5860_COMP_GROUP2_3CLOCK 0x03
#define LP5860_COMP_GROUP2_2CLOCK 0x02
#define LP5860_COMP_GROUP2_1CLOCK 0x01
#define LP5860_COMP_GROUP2_OFF 0x00
#define LP5860_COMP_GROUP1_SHIFT 2
#define LP5860_COMP_GROUP1_MASK GENMASK(3, 2)
#define LP5860_COMP_GROUP1_3CLOCK 0x03
#define LP5860_COMP_GROUP1_2CLOCK 0x02
#define LP5860_COMP_GROUP1_1CLOCK 0x01
#define LP5860_COMP_GROUP1_OFF 0x00
#define LP5860_LOD_REMOVAL_SHIFT 1
#define LP5860_LOD_REMOVAL_MASK BIT(1)
#define LP5860_LOD_REMOVAL_EN 0x01
#define LP5860_LOD_REMOVAL_OFF 0x00
#define LP5860_LSD_REMOVAL_SHIFT 0
#define LP5860_LSD_REMOVAL_MASK BIT(0)
#define LP5860_LSD_REMOVAL_EN 0x01
#define LP5860_LSD_REMOVAL_OFF 0x00
#define LP5860_DOWN_DEGHOST_SHIFT 6
#define LP5860_DOWN_DEGHOST_MASK GENMASK(7, 6)
#define LP5860_DOWN_DEGHOST_STRONG 0x03
#define LP5860_DOWN_DEGHOST_MEDIUM 0x02
#define LP5860_DOWN_DEGHOST_WEAK 0x01
#define LP5860_DOWN_DEGHOST_OFF 0x00
#define LP5860_UP_DEGHOST_SHIFT 4
#define LP5860_UP_DEGHOST_MASK GENMASK(5, 4)
#define LP5860_UP_DEGHOST_GND 0x03
#define LP5860_UP_DEGHOST_3 0x02
#define LP5860_UP_DEGHOST_2_5 0x01
#define LP5860_UP_DEGHOST_2 0x00
#define LP5860_MAXIMUM_CURRENT_SHIFT 1
#define LP5860_MAXIMUM_CURRENT_MASK GENMASK(3, 1)
#define LP5860_MAXIMUM_CURRENT_50 0x07
#define LP5860_MAXIMUM_CURRENT_40 0x06
#define LP5860_MAXIMUM_CURRENT_30 0x05
#define LP5860_MAXIMUM_CURRENT_20 0x04
#define LP5860_MAXIMUM_CURRENT_15 0x03
#define LP5860_MAXIMUM_CURRENT_10 0x02
#define LP5860_MAXIMUM_CURRENT_5 0x01
#define LP5860_MAXIMUM_CURRENT_3 0x00
#define LP5860_UP_DEGHOST_ENABLE_SHIFT 0
#define LP5860_UP_DEGHOST_ENABLE_MASK BIT(0)
#define LP5860_UP_DEGHOST_ENABLE_EN 0x01
#define LP5860_UP_DEGHOST_ENABLE_OFF 0x00
#define LP5860_PWM_GLOBAL_MAX 0xff
#define LP5860_PWM_GROUP_MAX 0xff
#define LP5860_CC_GROUP_MASK GENMASK(7, 0)
#define LP5860_CC_GROUP_MAX 0x7F
#define LP5860_DOT_0_SHIFT 0
#define LP5860_DOT_1_SHIFT 2
#define LP5860_DOT_2_SHIFT 4
#define LP5860_DOT_3_SHIFT 6
#define LP5860_DOT_GROUP3 0x03
#define LP5860_DOT_GROUP2 0x02
#define LP5860_DOT_GROUP1 0x01
#define LP5860_DOT_GROUP_NONE 0x00
#define LP5860_DOT_ALL_ON 0xff
#define LP5860_DOT_ALL_OFF 0x0
#define LP5860_PWM_DOT_MAX 0xff
#define LP5860_DOT_CS0_SHIFT 0
#define LP5860_DOT_CS1_SHIFT 1
#define LP5860_DOT_CS2_SHIFT 2
#define LP5860_DOT_CS3_SHIFT 3
#define LP5860_DOT_CS4_SHIFT 4
#define LP5860_DOT_CS5_SHIFT 5
#define LP5860_DOT_CS6_SHIFT 6
#define LP5860_DOT_CS7_SHIFT 7
#define LP5860_DOT_CS_ON 0x01
#define LP5860_DOT_CS_OFF 0x00
#define LP5860_DOT_LOD0_SHIFT 0
#define LP5860_DOT_LOD1_SHIFT 1
#define LP5860_DOT_LOD2_SHIFT 2
#define LP5860_DOT_LOD3_SHIFT 3
#define LP5860_DOT_LOD4_SHIFT 4
#define LP5860_DOT_LOD5_SHIFT 5
#define LP5860_DOT_LOD6_SHIFT 6
#define LP5860_DOT_LOD7_SHIFT 7
#define LP5860_DOT_LOD_ON 0x01
#define LP5860_DOT_LOD_OFF 0x00
#define LP5860_DOT_LSD0_SHIFT 0
#define LP5860_DOT_LSD1_SHIFT 1
#define LP5860_DOT_LSD2_SHIFT 2
#define LP5860_DOT_LSD3_SHIFT 3
#define LP5860_DOT_LSD4_SHIFT 4
#define LP5860_DOT_LSD5_SHIFT 5
#define LP5860_DOT_LSD6_SHIFT 6
#define LP5860_DOT_LSD7_SHIFT 7
#define LP5860_DOT_LSD_ON 0x01
#define LP5860_DOT_LSD_OFF 0x00
#define LP5860_GLOBAL_LOD_SHIFT 1
#define LP5860_GLOBAL_LOD_STATE BIT(1)
#define LP5860_GLOBAL_LSD_SHIFT 0
#define LP5860_GLOBAL_LSD_STATE BIT(0)
#define LP5860_FAULT_STATE_ON 0x01
#define LP5860_FAULT_STATE_OFF 0x00
#define LP5860_GLOBAL_LOD_CLEAR 0x00
#define LP5860_GLOBAL_LSD_CLEAR 0x00
#define LP5860_LOD_CLEAR_EN 0xff
#define LP5860_LSD_CLEAR_EN 0xff
#define LP5860_RESET_EN 0xff
#define LP5860_MAX_BRIGHTNESS 255
#define LP5860_REG_R_PWM 0x0
#define LP5860_REG_G_PWM 0x1
#define LP5860_REG_B_PWM 0x2
#define LP5860_MAX_LED_CONSTANT 18
#define LP5860_MAX_LED_SCAN 11
#define LP5860_MAX_LED (LP5860_MAX_LED_CONSTANT * LP5860_MAX_LED_SCAN)
#define LP5860_MAX_DOT_ONOFF_GROUP_NUM 8
#define LP5860_MAX_LED_CHANNELS 4
struct lp5860_led {
struct lp5860 *chip;
struct led_classdev_mc mc_cdev;
u8 brightness;
};
struct lp5860 {
struct device *dev;
struct regmap *regmap;
struct mutex lock;
DECLARE_FLEX_ARRAY(struct lp5860_led, leds);
};
int lp5860_device_init(struct device *dev);
void lp5860_device_remove(struct device *dev);
#endif