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