269 lines
7.6 KiB
C
269 lines
7.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2025 Pengutronix
|
|
*
|
|
* Author: Steffen Trumtrar <kernel@pengutronix.de>
|
|
*/
|
|
|
|
#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
|
|
|
|
/* Register chip_enable value */
|
|
#define LP5860_CHIP_SHIFT 0
|
|
#define LP5860_CHIP_MASK BIT(0)
|
|
#define LP5860_CHIP_DISABLE false
|
|
#define LP5860_CHIP_ENABLE true
|
|
|
|
/* Register dev_initial value */
|
|
#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
|
|
|
|
/* Register dev_config1 value */
|
|
#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
|
|
|
|
/* Register dev_config2 value */
|
|
#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
|
|
|
|
/* Register dev_config3 value */
|
|
#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
|
|
|
|
/* Register PWM */
|
|
#define LP5860_PWM_GLOBAL_MAX 0xff
|
|
#define LP5860_PWM_GROUP_MAX 0xff
|
|
|
|
/* Register CC group select */
|
|
#define LP5860_CC_GROUP_MASK GENMASK(7, 0)
|
|
#define LP5860_CC_GROUP_MAX 0x7F
|
|
|
|
/* Register dot group select */
|
|
#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
|
|
/* Dot onoff value */
|
|
#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
|
|
|
|
/* Dot lod value */
|
|
#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
|
|
|
|
/* dot lsd value */
|
|
#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
|
|
|
|
/* Register lod state */
|
|
#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
|
|
|
|
/*
|
|
* Theoretically, there is no max channel per LED,
|
|
* limit this to a reasonable value for RGBW LEDs
|
|
*/
|
|
#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 /* _DRIVERS_LEDS_RGB_LP5860_H */
|