unplugged-kernel/drivers/misc/mediatek/leds/mt6785/mtk_leds_sw.h

192 lines
4.5 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (C) 2016 MediaTek Inc.
*/
#ifndef _LEDS_SW_H
#define _LEDS_SW_H
/******************************************************************************
* LED & Backlight type defination
*****************************************************************************/
enum mt65xx_led_type {
MT65XX_LED_TYPE_RED = 0,
MT65XX_LED_TYPE_GREEN,
MT65XX_LED_TYPE_BLUE,
MT65XX_LED_TYPE_JOGBALL,
MT65XX_LED_TYPE_KEYBOARD,
MT65XX_LED_TYPE_BUTTON,
MT65XX_LED_TYPE_LCD,
MT65XX_LED_TYPE_TOTAL,
};
enum mt65xx_led_mode {
MT65XX_LED_MODE_NONE,
MT65XX_LED_MODE_PWM,
MT65XX_LED_MODE_GPIO,
MT65XX_LED_MODE_PMIC,
MT65XX_LED_MODE_CUST_LCM,
MT65XX_LED_MODE_CUST_BLS_PWM
};
/******************************************************************************
* for backlight
*****************************************************************************/
/* backlight call back function */
typedef int (*cust_brightness_set) (int level, int div);
typedef int (*cust_set_brightness) (int level);
/* 10bit backlight level */
#define LED_INCREASE_LED_LEVEL_MTKPATCH
#ifdef LED_INCREASE_LED_LEVEL_MTKPATCH
#define MT_LED_INTERNAL_LEVEL_BIT_CNT 10
#endif
/******************************************************************************
* for PMIC
*****************************************************************************/
enum mt65xx_led_pmic {
MT65XX_LED_PMIC_LCD_ISINK = 0,
MT65XX_LED_PMIC_NLED_ISINK_MIN = MT65XX_LED_PMIC_LCD_ISINK,
MT65XX_LED_PMIC_NLED_ISINK0,
MT65XX_LED_PMIC_NLED_ISINK1,
MT65XX_LED_PMIC_NLED_ISINK2,
MT65XX_LED_PMIC_NLED_ISINK3,
MT65XX_LED_PMIC_NLED_ISINK_MAX,
};
enum MT65XX_PMIC_ISINK_MODE {
ISINK_PWM_MODE = 0,
ISINK_BREATH_MODE = 1,
ISINK_REGISTER_MODE = 2
};
enum MT65XX_PMIC_ISINK_STEP {
ISINK_0 = 0, /* 4mA */
ISINK_1 = 1, /* 8mA */
ISINK_2 = 2, /* 12mA */
ISINK_3 = 3, /* 16mA */
ISINK_4 = 4, /* 20mA */
ISINK_5 = 5 /* 24mA */
};
enum MT65XX_PMIC_ISINK_FSEL {
/* 32K clock */
ISINK_1KHZ = 0,
ISINK_200HZ = 4,
ISINK_5HZ = 199,
ISINK_2HZ = 499,
ISINK_1HZ = 999,
ISINK_05HZ = 1999,
ISINK_02HZ = 4999,
ISINK_01HZ = 9999,
/* 2M clock */
ISINK_2M_20KHZ = 2,
ISINK_2M_1KHZ = 61,
ISINK_2M_200HZ = 311,
ISINK_2M_5HZ = 12499,
ISINK_2M_2HZ = 31249,
ISINK_2M_1HZ = 62499,
/* 128K clock */
ISINK_128K_500HZ = 0,
ISINK_128K_256HZ = 1,
ISINK_128K_167HZ = 2,
ISINK_128K_128HZ = 3,
ISINK_128K_100HZ = 4,
ISINK_128K_83HZ = 5,
ISINK_128K_50HZ = 9,
ISINK_128K_17HZ = 28,
};
/******************************************************************************
* for PWM
*****************************************************************************/
/* the min frequence when use old mode pwm by kHz */
#define MIN_FRE_OLD_PWM 32
#define BACKLIGHT_LEVEL_PWM_64_FIFO_MODE_SUPPORT 64
#define BACKLIGHT_LEVEL_PWM_256_SUPPORT 256
#define BACKLIGHT_LEVEL_PWM_MODE_CONFIG BACKLIGHT_LEVEL_PWM_256_SUPPORT
static inline unsigned int Cust_GetBacklightLevelSupport_byPWM(void)
{
return BACKLIGHT_LEVEL_PWM_MODE_CONFIG;
}
static inline unsigned int brightness_mapping(unsigned int level)
{
unsigned int mapped_level;
mapped_level = level;
return mapped_level;
}
struct PWM_config {
int clock_source;
int div;
int low_duration;
int High_duration;
bool pmic_pad;
};
/****************************************************************************
* sw data structures
***************************************************************************/
/**
* led customization data structure
* name : must the same as lights HAL
* mode : control mode
* data :
* PWM: pwm number
* GPIO: gpio id
* PMIC: enum mt65xx_led_pmic
* CUST: custom set brightness function pointer
* config_data: pwm config data
*/
struct cust_mt65xx_led {
char *name;
enum mt65xx_led_mode mode;
long data;
struct PWM_config config_data;
};
/**
* led device node structure with mtk extentions
* cdev: common led device structure
* cust: customization data from device tree
* work: workqueue for specialfied led device
* level: brightness level
* delay_on: on time if led is blinking
* delay_off: off time if led is blinking
*/
struct mt65xx_led_data {
struct led_classdev cdev;
struct cust_mt65xx_led cust;
struct work_struct work;
int level;
int delay_on;
int delay_off;
};
/**
* LED Variable Settings
* nled_mode: 0, off; 1, on; 2, blink
* blink_on_time: on time if led is blinking
* blink_off_time: off time if led is blinking
*/
#define NLED_OFF 0
#define NLED_ON 1
#define NLED_BLINK 2
struct nled_setting {
u8 nled_mode;
u32 blink_on_time;
u32 blink_off_time;
};
#endif /* _LEDS_SW_H */