173 lines
4.0 KiB
C
173 lines
4.0 KiB
C
/* 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_*/
|