blob: 3e073a8e2b95fc6d85b17b3941e38160d71f3340 [file] [log] [blame]
#ifndef __LEDS_AW210XX_H__
#define __LEDS_AW210XX_H__
#define AW210XX_I2C_NAME "aw210xx_led"
#define AW_DEBUG (1)
#if AW_DEBUG
#define AW_LOG(fmt, args...) pr_info("[%s] %s %d: " fmt, AW210XX_I2C_NAME, \
__func__, __LINE__, ##args)
#else
#define AW_LOG(fmt, args...)
#endif
#define AW_ERR(fmt, args...) pr_err("[%s] %s %d: " fmt, AW210XX_I2C_NAME, \
__func__, __LINE__, ##args)
/*****************************************************
* register about led mode
*****************************************************/
#define AW210XX_REG_GCR (0x20)
#define AW210XX_REG_BR00L (0x21)
#define AW210XX_REG_BR00H (0x22)
#define AW210XX_REG_BR01L (0x23)
#define AW210XX_REG_BR01H (0x24)
#define AW210XX_REG_BR02L (0x25)
#define AW210XX_REG_BR02H (0x26)
#define AW210XX_REG_BR03L (0x27)
#define AW210XX_REG_BR03H (0x28)
#define AW210XX_REG_BR04L (0x29)
#define AW210XX_REG_BR04H (0x2A)
#define AW210XX_REG_BR05L (0x2B)
#define AW210XX_REG_BR05H (0x2C)
#define AW210XX_REG_BR06L (0x2D)
#define AW210XX_REG_BR06H (0x2E)
#define AW210XX_REG_BR07L (0x2F)
#define AW210XX_REG_BR07H (0x30)
#define AW210XX_REG_BR08L (0x31)
#define AW210XX_REG_BR08H (0x32)
#define AW210XX_REG_BR09L (0x33)
#define AW210XX_REG_BR09H (0x34)
#define AW210XX_REG_BR10L (0x35)
#define AW210XX_REG_BR10H (0x36)
#define AW210XX_REG_BR11L (0x37)
#define AW210XX_REG_BR11H (0x38)
#define AW210XX_REG_BR12L (0x39)
#define AW210XX_REG_BR12H (0x3A)
#define AW210XX_REG_BR13L (0x3B)
#define AW210XX_REG_BR13H (0x3C)
#define AW210XX_REG_BR14L (0x3D)
#define AW210XX_REG_BR14H (0x3E)
#define AW210XX_REG_BR15L (0x3F)
#define AW210XX_REG_BR15H (0x40)
#define AW210XX_REG_BR16L (0x41)
#define AW210XX_REG_BR16H (0x42)
#define AW210XX_REG_BR17L (0x43)
#define AW210XX_REG_BR17H (0x44)
#define AW210XX_REG_UPDATE (0x45)
#define AW210XX_REG_SL00 (0x46)
#define AW210XX_REG_SL01 (0x47)
#define AW210XX_REG_SL02 (0x48)
#define AW210XX_REG_SL03 (0x49)
#define AW210XX_REG_SL04 (0x4A)
#define AW210XX_REG_SL05 (0x4B)
#define AW210XX_REG_SL06 (0x4C)
#define AW210XX_REG_SL07 (0x4D)
#define AW210XX_REG_SL08 (0x4E)
#define AW210XX_REG_SL09 (0x4F)
#define AW210XX_REG_SL10 (0x50)
#define AW210XX_REG_SL11 (0x51)
#define AW210XX_REG_SL12 (0x52)
#define AW210XX_REG_SL13 (0x53)
#define AW210XX_REG_SL14 (0x54)
#define AW210XX_REG_SL15 (0x55)
#define AW210XX_REG_SL16 (0x56)
#define AW210XX_REG_SL17 (0x57)
#define AW210XX_REG_GCCR (0x58)
#define AW210XX_REG_PHCR (0x59)
#define AW210XX_REG_OSDCR (0x5A)
#define AW210XX_REG_OSST0 (0x5B)
#define AW210XX_REG_OSST1 (0x5C)
#define AW210XX_REG_OSST2 (0x5D)
#define AW210XX_REG_OTCR (0x5E)
#define AW210XX_REG_SSCR (0x5F)
#define AW210XX_REG_UVCR (0x60)
#define AW210XX_REG_GCR2 (0x61)
#define AW210XX_REG_GCR3 (0x62)
#define AW210XX_REG_RESET (0x70)
#define AW210XX_REG_ABMCFG (0x80)
#define AW210XX_REG_ABMGO (0x81)
#define AW210XX_REG_ABMT0 (0x82)
#define AW210XX_REG_ABMT1 (0x83)
#define AW210XX_REG_ABMT2 (0x84)
#define AW210XX_REG_ABMT3 (0x85)
#define AW210XX_REG_GBRH (0x86)
#define AW210XX_REG_GBRL (0x87)
#define AW210XX_REG_GSLR (0x88)
#define AW210XX_REG_GSLG (0x89)
#define AW210XX_REG_GSLB (0x8A)
#define AW210XX_REG_GCFG (0x8B)
/*****************************************************
* define register Detail
*****************************************************/
#define AW210XX_BIT_APSE_MASK (~(1 << 7))
#define AW210XX_BIT_APSE_ENABLE (1 << 7)
#define AW210XX_BIT_APSE_DISENA (0 << 7)
#define AW210XX_BIT_CHIPEN_MASK (~(1 << 0))
#define AW210XX_BIT_CHIPEN_ENABLE (1 << 0)
#define AW210XX_BIT_CHIPEN_DISENA (0 << 0)
#define AW210XX_BIT_UVPD_MASK (~(1 << 1))
#define AW210XX_BIT_UVPD_ENABLE (0 << 1)
#define AW210XX_BIT_UVPD_DISENA (1 << 1)
#define AW210XX_BIT_UVDIS_MASK (~(1 << 0))
#define AW210XX_BIT_UVDIS_ENABLE (0 << 0)
#define AW210XX_BIT_UVDIS_DISENA (1 << 0)
#define AW210XX_BIT_ABME_MASK (~(1 << 0))
#define AW210XX_BIT_ABME_ENABLE (1 << 0)
#define AW210XX_BIT_ABME_DISENA (0 << 0)
#define AW210XX_BIT_GSLDIS_MASK (~(1 << 6))
#define AW210XX_BIT_GSLDIS_ENABLE (0 << 6)
#define AW210XX_BIT_GSLDIS_DISENA (1 << 6)
#define AW210XX_BIT_RGBMD_MASK (~(1 << 0))
#define AW210XX_BIT_RGBMD_ENABLE (1 << 0)
#define AW210XX_BIT_RGBMD_DISENA (0 << 0)
#define AW210XX_BIT_SBMD_MASK (~(1 << 1))
#define AW210XX_BIT_SBMD_ENABLE (1 << 1)
#define AW210XX_BIT_SBMD_DISENA (0 << 1)
#define AW210XX_BIT_CLKFRQ_MASK (~(7 << 4))
#define AW210XX_BIT_CLKFRQ_16MHz (0 << 4)
#define AW210XX_BIT_CLKFRQ_8MHz (1 << 4)
#define AW210XX_BIT_CLKFRQ_1MHz (2 << 4)
#define AW210XX_BIT_CLKFRQ_512kHz (3 << 4)
#define AW210XX_BIT_CLKFRQ_256kHz (4 << 4)
#define AW210XX_BIT_CLKFRQ_125kHz (5 << 4)
#define AW210XX_BIT_CLKFRQ_62_5kHz (6 << 4)
#define AW210XX_BIT_CLKFRQ_31_25kHz (7 << 4)
#define AW210XX_BIT_PWMRES_MASK (~(3 << 1))
#define AW210XX_BIT_PWMRES_8BIT (0 << 1)
#define AW210XX_BIT_PWMRES_9BIT (1 << 1)
#define AW210XX_BIT_PWMRES_12BIT (2 << 1)
#define AW210XX_BIT_PWMRES_9_AND_3_BIT (3 << 1)
#define AW210XX_DCPWM_SET (7 << 5)
#define AW210XX_DCPWM_CLEAN (0x00)
#define AW210XX_DCPWM_SET_MASK ~(7 << 5)
#define AW210XX_OPEN_THRESHOLD_SET (1 << 3)
#define AW210XX_OPEN_THRESHOLD_SET_MASK ~(1 << 3)
#define AW210XX_SHORT_THRESHOLD_SET (1 << 2)
#define AW210XX_SHORT_THRESHOLD_SET_MASK ~(1 << 2)
#define AW210XX_BIT_PDE_MASK (~(1 << 7))
#define AW210XX_BIT_PDE_ENABLE (0 << 7)
#define AW210XX_BIT_PDE_DISABLE (1 << 7)
/*****************************************************
* define register data
*****************************************************/
#define AW210XX_RESET_CHIP (0x00)
#define AW210XX_UPDATE_BR_SL (0x00)
#define AW21018_GROUP_ENABLE (0x3F)
#define AW21018_GROUP_DISABLE (0x40)
#define AW21012_GROUP_ENABLE (0x3C)
#define AW21012_GROUP_DISABLE (0x40)
#define AW21009_GROUP_ENABLE (0x38)
#define AW21009_GROUP_DISABLE (0x40)
#define AW210XX_GLOBAL_DEFAULT_SET (0x66)
#define AW210XX_GBRH_DEFAULT_SET (0x60)
#define AW210XX_GBRL_DEFAULT_SET (0x00)
#define AW210XX_ABMT0_SET (0x99)
#define AW210XX_ABMT1_SET (0x99)
#define AW210XX_ABMT2_SET (0x00)
#define AW210XX_ABMT3_SET (0x00)
#define AW210XX_ABMCFG_SET (0x03)
#define AW210XX_ABMGO_SET (0x01)
/*****************************************************
* define chipid info
*****************************************************/
#define AW95016_CHIPID (0x00)
#define AW95016A_CHIPID (0x80)
#define AW21018_CHIPID (0x02)
#define AW21012_CHIPID (0x22)
#define AW21009_CHIPID (0x12)
#define AW21018_LED_NUM (0x11)
#define AW21012_LED_NUM (0x0b)
#define AW21009_LED_NUM (0x08)
#define AW210XX_OPEN_DETECT_EN (0x03)
#define AW210XX_SHORT_DETECT_EN (0x02)
#define AW210XX_OPEN_SHORT_DIS (0x00)
/*****************************************************
* define return value
*****************************************************/
#define AW210XX_RETURN_OK (0)
#define AW210XX_CHIPID_FAILD (1)
#define AW210XX_DATA_ERROR (2)
#define AW210XX_INPUT_ERROR (3)
#define AW210XX_NO_DECTECT (4)
#define AW210XX_NO_GPIO_INFO (5)
#define AW210XX_NO_ACCESS (6)
#define AW210XX_WRITE_FAIL (7)
#define AW210XX_EFFECT_MODE_UNSUPPORT (8)
#define AW210XX_CLK_MODE_UNSUPPORT (9)
#define AW210XX_MALLOC_FAILEDT (10)
#define AW210XX_OPEN_DETECT (1)
#define AW210XX_SHORT_DETECT (0)
/***********************************************
* define register Detail
***********************************************/
#define REG_NONE_ACCESS (0)
#define REG_RD_ACCESS (1<<0)
#define REG_WR_ACCESS (1<<1)
#define AW210XX_REG_MAX (0x8C)
/***********************************************
* define Google Specific
***********************************************/
#define AW21018_MAX_LED_CHANNELS (18)
#define AW21018_MAX_RGB_LED (6)
static uint8_t aw210xx_reg_access[AW210XX_REG_MAX] = {
[AW210XX_REG_GCR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR00L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR00H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR01L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR01H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR02L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR02H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR03L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR03H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR04L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR04H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR05L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR05H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR06L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR06H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR07L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR07H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR08L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR08H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR09L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR09H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR10L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR10H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR11L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR11H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR12L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR12H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR13L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR13H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR14L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR14H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR15L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR15H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR16L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR16H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR17L] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_BR17H] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_UPDATE] = REG_WR_ACCESS,
[AW210XX_REG_SL00] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL01] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL02] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL03] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL04] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL05] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL06] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL07] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL08] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL09] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL10] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL11] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL12] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL13] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL14] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL15] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL16] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SL17] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GCCR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_PHCR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_OSDCR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_OSST0] = REG_RD_ACCESS,
[AW210XX_REG_OSST1] = REG_RD_ACCESS,
[AW210XX_REG_OSST2] = REG_RD_ACCESS,
[AW210XX_REG_OTCR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_SSCR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_UVCR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GCR2] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GCR3] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_RESET] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_ABMCFG] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_ABMGO] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_ABMT0] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_ABMT1] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_ABMT2] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_ABMT3] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GBRH] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GBRL] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GSLR] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GSLG] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GSLB] = REG_RD_ACCESS | REG_WR_ACCESS,
[AW210XX_REG_GCFG] = REG_RD_ACCESS | REG_WR_ACCESS,
};
typedef enum {
CLK_FRQ_16M = 1,
CLK_FRQ_8M,
CLK_FRQ_1M,
CLK_FRQ_512k,
CLK_FRQ_256k,
CLK_FRQ_125K,
CLK_FRQ_62_5K,
CLK_FRQ_31_25K,
} clk_pwm_t;
typedef enum {
BR_RESOLUTION_8BIT = 1,
BR_RESOLUTION_9BIT,
BR_RESOLUTION_12BIT,
BR_RESOLUTION_9_AND_3_BIT,
} br_pwm_t;
typedef enum {
AW21018_GENERIC_DISABLE = 0,
AW21018_GENERIC_ENABLE,
} aw210xx_ed_t;
typedef enum {
GROUP_ALL_LED_OFF = 0,
AW21018_GROUP_ALL_LEDS_ON,
AW21018_GROUP_RED_LEDS_ON,
AW21018_GROUP_GREEN_LEDS_ON,
AW21018_GROUP_BLUE_LEDS_ON,
AW21018_GROUP_BREATH_LEDS_ON,
AW21012_GROUP_ALL_LEDS_ON,
AW21012_GROUP_RED_LEDS_ON,
AW21012_GROUP_GREEN_LEDS_ON,
AW21012_GROUP_BLUE_LEDS_ON,
AW21012_GROUP_BREATH_LEDS_ON,
AW21009_GROUP_ALL_LEDS_ON,
AW21009_GROUP_RED_LEDS_ON,
AW21009_GROUP_GREEN_LEDS_ON,
AW21009_GROUP_BLUE_LEDS_ON,
AW21009_GROUP_BREATH_LEDS_ON,
} effect_select_t;
typedef struct aw210xx_cfg {
unsigned char *p;
uint32_t count;
} aw210xx_cfg_t;
/*********************************************************
*
* struct
*
********************************************************/
struct aw210xx {
struct i2c_client *i2c;
struct device *dev;
struct led_classdev cdev;
struct work_struct brightness_work;
struct work_struct cfg_work;
uint8_t sdmd_flag;
uint8_t rgbmd_flag;
br_pwm_t br_res;
clk_pwm_t osc_clk;
aw210xx_ed_t pde;
uint8_t chipid;
uint8_t effect;
int enable_gpio;
uint32_t rgbcolor;
uint32_t glo_current;
uint32_t set_current;
unsigned int imax;
/*The following values are to achieve interface parity with LP5018*/
uint32_t current_limit;
uint32_t pwm_scale;
uint32_t global_dimming;
uint32_t num_leds;
/*The following are to reduce i2c traffic*/
int force_sync;
unsigned char saved_value[AW21018_MAX_LED_CHANNELS];
};
#endif