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