root/include/linux/leds-lp3952.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 *      LED driver for TI lp3952 controller
 *
 *      Copyright (C) 2016, DAQRI, LLC.
 *      Author: Tony Makkiel <tony.makkiel@daqri.com>
 */

#ifndef LEDS_LP3952_H_
#define LEDS_LP3952_H_

#define LP3952_NAME                         "lp3952"
#define LP3952_CMD_REG_COUNT                8
#define LP3952_BRIGHT_MAX                   4
#define LP3952_LABEL_MAX_LEN                15

#define LP3952_REG_LED_CTRL                 0x00
#define LP3952_REG_R1_BLNK_TIME_CTRL        0x01
#define LP3952_REG_R1_BLNK_CYCLE_CTRL       0x02
#define LP3952_REG_G1_BLNK_TIME_CTRL        0x03
#define LP3952_REG_G1_BLNK_CYCLE_CTRL       0x04
#define LP3952_REG_B1_BLNK_TIME_CTRL        0x05
#define LP3952_REG_B1_BLNK_CYCLE_CTRL       0x06
#define LP3952_REG_ENABLES                  0x0B
#define LP3952_REG_PAT_GEN_CTRL             0x11
#define LP3952_REG_RGB1_MAX_I_CTRL          0x12
#define LP3952_REG_RGB2_MAX_I_CTRL          0x13
#define LP3952_REG_CMD_0                    0x50
#define LP3952_REG_RESET                    0x60
#define REG_MAX                             LP3952_REG_RESET

#define LP3952_PATRN_LOOP                   BIT(1)
#define LP3952_PATRN_GEN_EN                 BIT(2)
#define LP3952_INT_B00ST_LDR                BIT(2)
#define LP3952_ACTIVE_MODE                  BIT(6)
#define LP3952_LED_MASK_ALL                 0x3f

/* Transition Time in ms */
enum lp3952_tt {
        TT0,
        TT55,
        TT110,
        TT221,
        TT422,
        TT885,
        TT1770,
        TT3539
};

/* Command Execution Time in ms */
enum lp3952_cet {
        CET197,
        CET393,
        CET590,
        CET786,
        CET1180,
        CET1376,
        CET1573,
        CET1769,
        CET1966,
        CET2163,
        CET2359,
        CET2556,
        CET2763,
        CET2949,
        CET3146
};

/* Max Current in % */
enum lp3952_colour_I_log_0 {
        I0,
        I7,
        I14,
        I21,
        I32,
        I46,
        I71,
        I100
};

enum lp3952_leds {
        LP3952_BLUE_2,
        LP3952_GREEN_2,
        LP3952_RED_2,
        LP3952_BLUE_1,
        LP3952_GREEN_1,
        LP3952_RED_1,
        LP3952_LED_ALL
};

struct lp3952_ctrl_hdl {
        struct led_classdev cdev;
        char name[LP3952_LABEL_MAX_LEN];
        enum lp3952_leds channel;
        void *priv;
};

struct ptrn_gen_cmd {
        union {
                struct {
                        u16 tt:3;
                        u16 b:3;
                        u16 cet:4;
                        u16 g:3;
                        u16 r:3;
                };
                struct {
                        u8 lsb;
                        u8 msb;
                } bytes;
        };
} __packed;

struct lp3952_led_array {
        struct regmap *regmap;
        struct i2c_client *client;
        struct gpio_desc *enable_gpio;
        struct lp3952_ctrl_hdl leds[LP3952_LED_ALL];
};

#endif /* LEDS_LP3952_H_ */