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