xref: /linux/drivers/leds/rgb/leds-lp5812.h (revision 2228d9cf7a562d1b0ca86bd529f6acb94f4bb80f)
1*a0309dc6SNam Tran /* SPDX-License-Identifier: GPL-2.0-only */
2*a0309dc6SNam Tran /*
3*a0309dc6SNam Tran  * LP5812 Driver Header
4*a0309dc6SNam Tran  *
5*a0309dc6SNam Tran  * Copyright (C) 2025 Texas Instruments
6*a0309dc6SNam Tran  *
7*a0309dc6SNam Tran  * Author: Jared Zhou <jared-zhou@ti.com>
8*a0309dc6SNam Tran  */
9*a0309dc6SNam Tran 
10*a0309dc6SNam Tran #ifndef _LP5812_H_
11*a0309dc6SNam Tran #define _LP5812_H_
12*a0309dc6SNam Tran 
13*a0309dc6SNam Tran #include <linux/delay.h>
14*a0309dc6SNam Tran #include <linux/i2c.h>
15*a0309dc6SNam Tran #include <linux/kernel.h>
16*a0309dc6SNam Tran #include <linux/led-class-multicolor.h>
17*a0309dc6SNam Tran #include <linux/leds.h>
18*a0309dc6SNam Tran #include <linux/mutex.h>
19*a0309dc6SNam Tran #include <linux/sysfs.h>
20*a0309dc6SNam Tran #include <linux/types.h>
21*a0309dc6SNam Tran 
22*a0309dc6SNam Tran #define LP5812_REG_ENABLE				0x0000
23*a0309dc6SNam Tran #define LP5812_REG_RESET				0x0023
24*a0309dc6SNam Tran #define LP5812_DEV_CONFIG0				0x0001
25*a0309dc6SNam Tran #define LP5812_DEV_CONFIG1				0x0002
26*a0309dc6SNam Tran #define LP5812_DEV_CONFIG2				0x0003
27*a0309dc6SNam Tran #define LP5812_DEV_CONFIG3				0x0004
28*a0309dc6SNam Tran #define LP5812_DEV_CONFIG4				0x0005
29*a0309dc6SNam Tran #define LP5812_DEV_CONFIG5				0x0006
30*a0309dc6SNam Tran #define LP5812_DEV_CONFIG6				0x0007
31*a0309dc6SNam Tran #define LP5812_DEV_CONFIG7				0x0008
32*a0309dc6SNam Tran #define LP5812_DEV_CONFIG8				0x0009
33*a0309dc6SNam Tran #define LP5812_DEV_CONFIG9				0x000A
34*a0309dc6SNam Tran #define LP5812_DEV_CONFIG10				0x000B
35*a0309dc6SNam Tran #define LP5812_DEV_CONFIG11				0x000c
36*a0309dc6SNam Tran #define LP5812_DEV_CONFIG12				0x000D
37*a0309dc6SNam Tran #define LP5812_CMD_UPDATE				0x0010
38*a0309dc6SNam Tran #define LP5812_LED_EN_1					0x0020
39*a0309dc6SNam Tran #define LP5812_LED_EN_2					0x0021
40*a0309dc6SNam Tran #define LP5812_FAULT_CLEAR				0x0022
41*a0309dc6SNam Tran #define LP5812_MANUAL_DC_BASE				0x0030
42*a0309dc6SNam Tran #define LP5812_AUTO_DC_BASE				0x0050
43*a0309dc6SNam Tran #define LP5812_MANUAL_PWM_BASE				0x0040
44*a0309dc6SNam Tran 
45*a0309dc6SNam Tran #define LP5812_TSD_CONFIG_STATUS			0x0300
46*a0309dc6SNam Tran #define LP5812_LOD_STATUS				0x0301
47*a0309dc6SNam Tran #define LP5812_LSD_STATUS				0x0303
48*a0309dc6SNam Tran 
49*a0309dc6SNam Tran #define LP5812_ENABLE					0x01
50*a0309dc6SNam Tran #define LP5812_DISABLE					0x00
51*a0309dc6SNam Tran #define FAULT_CLEAR_ALL					0x07
52*a0309dc6SNam Tran #define TSD_CLEAR_VAL					0x04
53*a0309dc6SNam Tran #define LSD_CLEAR_VAL					0x02
54*a0309dc6SNam Tran #define LOD_CLEAR_VAL					0x01
55*a0309dc6SNam Tran #define LP5812_RESET					0x66
56*a0309dc6SNam Tran #define LP5812_DEV_CONFIG12_DEFAULT			0x08
57*a0309dc6SNam Tran 
58*a0309dc6SNam Tran #define LP5812_UPDATE_CMD_VAL				0x55
59*a0309dc6SNam Tran #define LP5812_REG_ADDR_HIGH_SHIFT			8
60*a0309dc6SNam Tran #define LP5812_REG_ADDR_BIT_8_9_MASK			0x03
61*a0309dc6SNam Tran #define LP5812_REG_ADDR_LOW_MASK			0xFF
62*a0309dc6SNam Tran #define LP5812_CHIP_ADDR_SHIFT				2
63*a0309dc6SNam Tran #define LP5812_DATA_LENGTH				2
64*a0309dc6SNam Tran #define LP5812_DATA_BYTE_0_IDX				0
65*a0309dc6SNam Tran #define LP5812_DATA_BYTE_1_IDX				1
66*a0309dc6SNam Tran 
67*a0309dc6SNam Tran #define LP5812_READ_MSG_LENGTH				2
68*a0309dc6SNam Tran #define LP5812_MSG_0_IDX				0
69*a0309dc6SNam Tran #define LP5812_MSG_1_IDX				1
70*a0309dc6SNam Tran #define LP5812_CFG_ERR_STATUS_MASK			0x01
71*a0309dc6SNam Tran #define LP5812_CFG_TSD_STATUS_SHIFT			1
72*a0309dc6SNam Tran #define LP5812_CFG_TSD_STATUS_MASK			0x01
73*a0309dc6SNam Tran 
74*a0309dc6SNam Tran #define LP5812_FAULT_CLEAR_LOD				0
75*a0309dc6SNam Tran #define LP5812_FAULT_CLEAR_LSD				1
76*a0309dc6SNam Tran #define LP5812_FAULT_CLEAR_TSD				2
77*a0309dc6SNam Tran #define LP5812_FAULT_CLEAR_ALL				3
78*a0309dc6SNam Tran #define LP5812_NUMBER_LED_IN_REG			8
79*a0309dc6SNam Tran 
80*a0309dc6SNam Tran #define LP5812_WAIT_DEVICE_STABLE_MIN			1000
81*a0309dc6SNam Tran #define LP5812_WAIT_DEVICE_STABLE_MAX			1100
82*a0309dc6SNam Tran 
83*a0309dc6SNam Tran #define LP5812_LSD_LOD_START_UP				0x0B
84*a0309dc6SNam Tran #define LP5812_MODE_NAME_MAX_LEN			20
85*a0309dc6SNam Tran #define LP5812_MODE_DIRECT_NAME				"direct_mode"
86*a0309dc6SNam Tran #define LP5812_MODE_DIRECT_VALUE			0
87*a0309dc6SNam Tran #define LP5812_MODE_MIX_SELECT_LED_0			0
88*a0309dc6SNam Tran #define LP5812_MODE_MIX_SELECT_LED_1			1
89*a0309dc6SNam Tran #define LP5812_MODE_MIX_SELECT_LED_2			2
90*a0309dc6SNam Tran #define LP5812_MODE_MIX_SELECT_LED_3			3
91*a0309dc6SNam Tran 
92*a0309dc6SNam Tran enum control_mode {
93*a0309dc6SNam Tran 	LP5812_MODE_MANUAL = 0,
94*a0309dc6SNam Tran 	LP5812_MODE_AUTONOMOUS
95*a0309dc6SNam Tran };
96*a0309dc6SNam Tran 
97*a0309dc6SNam Tran enum dimming_type {
98*a0309dc6SNam Tran 	LP5812_DIMMING_ANALOG,
99*a0309dc6SNam Tran 	LP5812_DIMMING_PWM
100*a0309dc6SNam Tran };
101*a0309dc6SNam Tran 
102*a0309dc6SNam Tran union lp5812_scan_order {
103*a0309dc6SNam Tran 	struct {
104*a0309dc6SNam Tran 		u8 order0:2;
105*a0309dc6SNam Tran 		u8 order1:2;
106*a0309dc6SNam Tran 		u8 order2:2;
107*a0309dc6SNam Tran 		u8 order3:2;
108*a0309dc6SNam Tran 	} bits;
109*a0309dc6SNam Tran 	u8 val;
110*a0309dc6SNam Tran };
111*a0309dc6SNam Tran 
112*a0309dc6SNam Tran union lp5812_drive_mode {
113*a0309dc6SNam Tran 	struct {
114*a0309dc6SNam Tran 		u8 mix_sel_led_0:1;
115*a0309dc6SNam Tran 		u8 mix_sel_led_1:1;
116*a0309dc6SNam Tran 		u8 mix_sel_led_2:1;
117*a0309dc6SNam Tran 		u8 mix_sel_led_3:1;
118*a0309dc6SNam Tran 		u8 led_mode:3;
119*a0309dc6SNam Tran 		u8 pwm_fre:1;
120*a0309dc6SNam Tran 	} bits;
121*a0309dc6SNam Tran 	u8 val;
122*a0309dc6SNam Tran };
123*a0309dc6SNam Tran 
124*a0309dc6SNam Tran struct lp5812_reg {
125*a0309dc6SNam Tran 	u16 addr;
126*a0309dc6SNam Tran 	union {
127*a0309dc6SNam Tran 		u8 val;
128*a0309dc6SNam Tran 		u8 mask;
129*a0309dc6SNam Tran 		u8 shift;
130*a0309dc6SNam Tran 	};
131*a0309dc6SNam Tran };
132*a0309dc6SNam Tran 
133*a0309dc6SNam Tran struct lp5812_mode_mapping {
134*a0309dc6SNam Tran 	char mode_name[LP5812_MODE_NAME_MAX_LEN];
135*a0309dc6SNam Tran 	u8 mode;
136*a0309dc6SNam Tran 	u8 scan_order_0;
137*a0309dc6SNam Tran 	u8 scan_order_1;
138*a0309dc6SNam Tran 	u8 scan_order_2;
139*a0309dc6SNam Tran 	u8 scan_order_3;
140*a0309dc6SNam Tran 	u8 selection_led;
141*a0309dc6SNam Tran };
142*a0309dc6SNam Tran 
143*a0309dc6SNam Tran struct lp5812_led_config {
144*a0309dc6SNam Tran 	bool is_sc_led;
145*a0309dc6SNam Tran 	const char *name;
146*a0309dc6SNam Tran 	u8 color_id[LED_COLOR_ID_MAX];
147*a0309dc6SNam Tran 	u32 max_current[LED_COLOR_ID_MAX];
148*a0309dc6SNam Tran 	int chan_nr;
149*a0309dc6SNam Tran 	int num_colors;
150*a0309dc6SNam Tran 	int led_id[LED_COLOR_ID_MAX];
151*a0309dc6SNam Tran };
152*a0309dc6SNam Tran 
153*a0309dc6SNam Tran struct lp5812_chip {
154*a0309dc6SNam Tran 	u8 num_channels;
155*a0309dc6SNam Tran 	struct i2c_client *client;
156*a0309dc6SNam Tran 	struct mutex lock; /* Protects register access */
157*a0309dc6SNam Tran 	struct lp5812_led_config *led_config;
158*a0309dc6SNam Tran 	const char *label;
159*a0309dc6SNam Tran 	const char *scan_mode;
160*a0309dc6SNam Tran 	union lp5812_scan_order scan_order;
161*a0309dc6SNam Tran 	union lp5812_drive_mode drive_mode;
162*a0309dc6SNam Tran };
163*a0309dc6SNam Tran 
164*a0309dc6SNam Tran struct lp5812_led {
165*a0309dc6SNam Tran 	u8 brightness;
166*a0309dc6SNam Tran 	int chan_nr;
167*a0309dc6SNam Tran 	struct led_classdev cdev;
168*a0309dc6SNam Tran 	struct led_classdev_mc mc_cdev;
169*a0309dc6SNam Tran 	struct lp5812_chip *chip;
170*a0309dc6SNam Tran };
171*a0309dc6SNam Tran 
172*a0309dc6SNam Tran #endif /*_LP5812_H_*/
173