root/drivers/leds/rgb/leds-lp5812.h
/* 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_*/