aboutsummaryrefslogtreecommitdiff
path: root/drivers/leds/rgb/leds-lp5812.h
blob: d8728ecd90b3ff903a36b9c9f8e9d1c57f1eaa2b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * LP5812 Driver Header
 *
 * Copyright (C) 2025 Texas Instruments
 *
 * Author: Jared Zhou <jared-zhou@ti.com>
 */

#ifndef _LP5812_H_
#define _LP5812_H_

#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/kernel.h>
#include <linux/led-class-multicolor.h>
#include <linux/leds.h>
#include <linux/mutex.h>
#include <linux/sysfs.h>
#include <linux/types.h>

#define LP5812_REG_ENABLE				0x0000
#define LP5812_REG_RESET				0x0023
#define LP5812_DEV_CONFIG0				0x0001
#define LP5812_DEV_CONFIG1				0x0002
#define LP5812_DEV_CONFIG2				0x0003
#define LP5812_DEV_CONFIG3				0x0004
#define LP5812_DEV_CONFIG4				0x0005
#define LP5812_DEV_CONFIG5				0x0006
#define LP5812_DEV_CONFIG6				0x0007
#define LP5812_DEV_CONFIG7				0x0008
#define LP5812_DEV_CONFIG8				0x0009
#define LP5812_DEV_CONFIG9				0x000A
#define LP5812_DEV_CONFIG10				0x000B
#define LP5812_DEV_CONFIG11				0x000c
#define LP5812_DEV_CONFIG12				0x000D
#define LP5812_CMD_UPDATE				0x0010
#define LP5812_LED_EN_1					0x0020
#define LP5812_LED_EN_2					0x0021
#define LP5812_FAULT_CLEAR				0x0022
#define LP5812_MANUAL_DC_BASE				0x0030
#define LP5812_AUTO_DC_BASE				0x0050
#define LP5812_MANUAL_PWM_BASE				0x0040

#define LP5812_TSD_CONFIG_STATUS			0x0300
#define LP5812_LOD_STATUS				0x0301
#define LP5812_LSD_STATUS				0x0303

#define LP5812_ENABLE					0x01
#define LP5812_DISABLE					0x00
#define FAULT_CLEAR_ALL					0x07
#define TSD_CLEAR_VAL					0x04
#define LSD_CLEAR_VAL					0x02
#define LOD_CLEAR_VAL					0x01
#define LP5812_RESET					0x66
#define LP5812_DEV_CONFIG12_DEFAULT			0x08

#define LP5812_UPDATE_CMD_VAL				0x55
#define LP5812_REG_ADDR_HIGH_SHIFT			8
#define LP5812_REG_ADDR_BIT_8_9_MASK			0x03
#define LP5812_REG_ADDR_LOW_MASK			0xFF
#define LP5812_CHIP_ADDR_SHIFT				2
#define LP5812_DATA_LENGTH				2
#define LP5812_DATA_BYTE_0_IDX				0
#define LP5812_DATA_BYTE_1_IDX				1

#define LP5812_READ_MSG_LENGTH				2
#define LP5812_MSG_0_IDX				0
#define LP5812_MSG_1_IDX				1
#define LP5812_CFG_ERR_STATUS_MASK			0x01
#define LP5812_CFG_TSD_STATUS_SHIFT			1
#define LP5812_CFG_TSD_STATUS_MASK			0x01

#define LP5812_FAULT_CLEAR_LOD				0
#define LP5812_FAULT_CLEAR_LSD				1
#define LP5812_FAULT_CLEAR_TSD				2
#define LP5812_FAULT_CLEAR_ALL				3
#define LP5812_NUMBER_LED_IN_REG			8

#define LP5812_WAIT_DEVICE_STABLE_MIN			1000
#define LP5812_WAIT_DEVICE_STABLE_MAX			1100

#define LP5812_LSD_LOD_START_UP				0x0B
#define LP5812_MODE_NAME_MAX_LEN			20
#define LP5812_MODE_DIRECT_NAME				"direct_mode"
#define LP5812_MODE_DIRECT_VALUE			0
#define LP5812_MODE_MIX_SELECT_LED_0			0
#define LP5812_MODE_MIX_SELECT_LED_1			1
#define LP5812_MODE_MIX_SELECT_LED_2			2
#define LP5812_MODE_MIX_SELECT_LED_3			3

enum control_mode {
	LP5812_MODE_MANUAL = 0,
	LP5812_MODE_AUTONOMOUS
};

enum dimming_type {
	LP5812_DIMMING_ANALOG,
	LP5812_DIMMING_PWM
};

union lp5812_scan_order {
	struct {
		u8 order0:2;
		u8 order1:2;
		u8 order2:2;
		u8 order3:2;
	} bits;
	u8 val;
};

union lp5812_drive_mode {
	struct {
		u8 mix_sel_led_0:1;
		u8 mix_sel_led_1:1;
		u8 mix_sel_led_2:1;
		u8 mix_sel_led_3:1;
		u8 led_mode:3;
		u8 pwm_fre:1;
	} bits;
	u8 val;
};

struct lp5812_reg {
	u16 addr;
	union {
		u8 val;
		u8 mask;
		u8 shift;
	};
};

struct lp5812_mode_mapping {
	char mode_name[LP5812_MODE_NAME_MAX_LEN];
	u8 mode;
	u8 scan_order_0;
	u8 scan_order_1;
	u8 scan_order_2;
	u8 scan_order_3;
	u8 selection_led;
};

struct lp5812_led_config {
	bool is_sc_led;
	const char *name;
	u8 color_id[LED_COLOR_ID_MAX];
	u32 max_current[LED_COLOR_ID_MAX];
	int chan_nr;
	int num_colors;
	int led_id[LED_COLOR_ID_MAX];
};

struct lp5812_chip {
	u8 num_channels;
	struct i2c_client *client;
	struct mutex lock; /* Protects register access */
	struct lp5812_led_config *led_config;
	const char *label;
	const char *scan_mode;
	union lp5812_scan_order scan_order;
	union lp5812_drive_mode drive_mode;
};

struct lp5812_led {
	u8 brightness;
	int chan_nr;
	struct led_classdev cdev;
	struct led_classdev_mc mc_cdev;
	struct lp5812_chip *chip;
};

#endif /*_LP5812_H_*/