cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

lp8788.h (8424B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * TI LP8788 MFD Device
      4 *
      5 * Copyright 2012 Texas Instruments
      6 *
      7 * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
      8 */
      9
     10#ifndef __MFD_LP8788_H__
     11#define __MFD_LP8788_H__
     12
     13#include <linux/gpio.h>
     14#include <linux/irqdomain.h>
     15#include <linux/pwm.h>
     16#include <linux/regmap.h>
     17
     18#define LP8788_DEV_BUCK		"lp8788-buck"
     19#define LP8788_DEV_DLDO		"lp8788-dldo"
     20#define LP8788_DEV_ALDO		"lp8788-aldo"
     21#define LP8788_DEV_CHARGER	"lp8788-charger"
     22#define LP8788_DEV_RTC		"lp8788-rtc"
     23#define LP8788_DEV_BACKLIGHT	"lp8788-backlight"
     24#define LP8788_DEV_VIBRATOR	"lp8788-vibrator"
     25#define LP8788_DEV_KEYLED	"lp8788-keyled"
     26#define LP8788_DEV_ADC		"lp8788-adc"
     27
     28#define LP8788_NUM_BUCKS	4
     29#define LP8788_NUM_DLDOS	12
     30#define LP8788_NUM_ALDOS	10
     31#define LP8788_NUM_BUCK2_DVS	2
     32
     33#define LP8788_CHG_IRQ		"CHG_IRQ"
     34#define LP8788_PRSW_IRQ		"PRSW_IRQ"
     35#define LP8788_BATT_IRQ		"BATT_IRQ"
     36#define LP8788_ALM_IRQ		"ALARM_IRQ"
     37
     38enum lp8788_int_id {
     39	/* interrup register 1 : Addr 00h */
     40	LP8788_INT_TSDL,
     41	LP8788_INT_TSDH,
     42	LP8788_INT_UVLO,
     43	LP8788_INT_FLAGMON,
     44	LP8788_INT_PWRON_TIME,
     45	LP8788_INT_PWRON,
     46	LP8788_INT_COMP1,
     47	LP8788_INT_COMP2,
     48
     49	/* interrupt register 2 : Addr 01h */
     50	LP8788_INT_CHG_INPUT_STATE,
     51	LP8788_INT_CHG_STATE,
     52	LP8788_INT_EOC,
     53	LP8788_INT_CHG_RESTART,
     54	LP8788_INT_RESTART_TIMEOUT,
     55	LP8788_INT_FULLCHG_TIMEOUT,
     56	LP8788_INT_PRECHG_TIMEOUT,
     57
     58	/* interrupt register 3 : Addr 02h */
     59	LP8788_INT_RTC_ALARM1 = 17,
     60	LP8788_INT_RTC_ALARM2,
     61	LP8788_INT_ENTER_SYS_SUPPORT,
     62	LP8788_INT_EXIT_SYS_SUPPORT,
     63	LP8788_INT_BATT_LOW,
     64	LP8788_INT_NO_BATT,
     65
     66	LP8788_INT_MAX = 24,
     67};
     68
     69enum lp8788_dvs_sel {
     70	DVS_SEL_V0,
     71	DVS_SEL_V1,
     72	DVS_SEL_V2,
     73	DVS_SEL_V3,
     74};
     75
     76enum lp8788_ext_ldo_en_id {
     77	EN_ALDO1,
     78	EN_ALDO234,
     79	EN_ALDO5,
     80	EN_ALDO7,
     81	EN_DLDO7,
     82	EN_DLDO911,
     83	EN_LDOS_MAX,
     84};
     85
     86enum lp8788_charger_event {
     87	NO_CHARGER,
     88	CHARGER_DETECTED,
     89};
     90
     91enum lp8788_bl_ctrl_mode {
     92	LP8788_BL_REGISTER_ONLY,
     93	LP8788_BL_COMB_PWM_BASED,	/* PWM + I2C, changed by PWM input */
     94	LP8788_BL_COMB_REGISTER_BASED,	/* PWM + I2C, changed by I2C */
     95};
     96
     97enum lp8788_bl_dim_mode {
     98	LP8788_DIM_EXPONENTIAL,
     99	LP8788_DIM_LINEAR,
    100};
    101
    102enum lp8788_bl_full_scale_current {
    103	LP8788_FULLSCALE_5000uA,
    104	LP8788_FULLSCALE_8500uA,
    105	LP8788_FULLSCALE_1200uA,
    106	LP8788_FULLSCALE_1550uA,
    107	LP8788_FULLSCALE_1900uA,
    108	LP8788_FULLSCALE_2250uA,
    109	LP8788_FULLSCALE_2600uA,
    110	LP8788_FULLSCALE_2950uA,
    111};
    112
    113enum lp8788_bl_ramp_step {
    114	LP8788_RAMP_8us,
    115	LP8788_RAMP_1024us,
    116	LP8788_RAMP_2048us,
    117	LP8788_RAMP_4096us,
    118	LP8788_RAMP_8192us,
    119	LP8788_RAMP_16384us,
    120	LP8788_RAMP_32768us,
    121	LP8788_RAMP_65538us,
    122};
    123
    124enum lp8788_isink_scale {
    125	LP8788_ISINK_SCALE_100mA,
    126	LP8788_ISINK_SCALE_120mA,
    127};
    128
    129enum lp8788_isink_number {
    130	LP8788_ISINK_1,
    131	LP8788_ISINK_2,
    132	LP8788_ISINK_3,
    133};
    134
    135enum lp8788_alarm_sel {
    136	LP8788_ALARM_1,
    137	LP8788_ALARM_2,
    138	LP8788_ALARM_MAX,
    139};
    140
    141enum lp8788_adc_id {
    142	LPADC_VBATT_5P5,
    143	LPADC_VIN_CHG,
    144	LPADC_IBATT,
    145	LPADC_IC_TEMP,
    146	LPADC_VBATT_6P0,
    147	LPADC_VBATT_5P0,
    148	LPADC_ADC1,
    149	LPADC_ADC2,
    150	LPADC_VDD,
    151	LPADC_VCOIN,
    152	LPADC_VDD_LDO,
    153	LPADC_ADC3,
    154	LPADC_ADC4,
    155	LPADC_MAX,
    156};
    157
    158struct lp8788;
    159
    160/*
    161 * lp8788_buck1_dvs
    162 * @gpio         : gpio pin number for dvs control
    163 * @vsel         : dvs selector for buck v1 register
    164 */
    165struct lp8788_buck1_dvs {
    166	int gpio;
    167	enum lp8788_dvs_sel vsel;
    168};
    169
    170/*
    171 * lp8788_buck2_dvs
    172 * @gpio         : two gpio pin numbers are used for dvs
    173 * @vsel         : dvs selector for buck v2 register
    174 */
    175struct lp8788_buck2_dvs {
    176	int gpio[LP8788_NUM_BUCK2_DVS];
    177	enum lp8788_dvs_sel vsel;
    178};
    179
    180/*
    181 * struct lp8788_chg_param
    182 * @addr         : charging control register address (range : 0x11 ~ 0x1C)
    183 * @val          : charging parameter value
    184 */
    185struct lp8788_chg_param {
    186	u8 addr;
    187	u8 val;
    188};
    189
    190/*
    191 * struct lp8788_charger_platform_data
    192 * @adc_vbatt         : adc channel name for battery voltage
    193 * @adc_batt_temp     : adc channel name for battery temperature
    194 * @max_vbatt_mv      : used for calculating battery capacity
    195 * @chg_params        : initial charging parameters
    196 * @num_chg_params    : numbers of charging parameters
    197 * @charger_event     : the charger event can be reported to the platform side
    198 */
    199struct lp8788_charger_platform_data {
    200	const char *adc_vbatt;
    201	const char *adc_batt_temp;
    202	unsigned int max_vbatt_mv;
    203	struct lp8788_chg_param *chg_params;
    204	int num_chg_params;
    205	void (*charger_event) (struct lp8788 *lp,
    206				enum lp8788_charger_event event);
    207};
    208
    209/*
    210 * struct lp8788_backlight_platform_data
    211 * @name                  : backlight driver name. (default: "lcd-backlight")
    212 * @initial_brightness    : initial value of backlight brightness
    213 * @bl_mode               : brightness control by pwm or lp8788 register
    214 * @dim_mode              : dimming mode selection
    215 * @full_scale            : full scale current setting
    216 * @rise_time             : brightness ramp up step time
    217 * @fall_time             : brightness ramp down step time
    218 * @pwm_pol               : pwm polarity setting when bl_mode is pwm based
    219 * @period_ns             : platform specific pwm period value. unit is nano.
    220			    Only valid when bl_mode is LP8788_BL_COMB_PWM_BASED
    221 */
    222struct lp8788_backlight_platform_data {
    223	char *name;
    224	int initial_brightness;
    225	enum lp8788_bl_ctrl_mode bl_mode;
    226	enum lp8788_bl_dim_mode dim_mode;
    227	enum lp8788_bl_full_scale_current full_scale;
    228	enum lp8788_bl_ramp_step rise_time;
    229	enum lp8788_bl_ramp_step fall_time;
    230	enum pwm_polarity pwm_pol;
    231	unsigned int period_ns;
    232};
    233
    234/*
    235 * struct lp8788_led_platform_data
    236 * @name         : led driver name. (default: "keyboard-backlight")
    237 * @scale        : current scale
    238 * @num          : current sink number
    239 * @iout_code    : current output value (Addr 9Ah ~ 9Bh)
    240 */
    241struct lp8788_led_platform_data {
    242	char *name;
    243	enum lp8788_isink_scale scale;
    244	enum lp8788_isink_number num;
    245	int iout_code;
    246};
    247
    248/*
    249 * struct lp8788_vib_platform_data
    250 * @name         : vibrator driver name
    251 * @scale        : current scale
    252 * @num          : current sink number
    253 * @iout_code    : current output value (Addr 9Ah ~ 9Bh)
    254 * @pwm_code     : PWM code value (Addr 9Ch ~ 9Eh)
    255 */
    256struct lp8788_vib_platform_data {
    257	char *name;
    258	enum lp8788_isink_scale scale;
    259	enum lp8788_isink_number num;
    260	int iout_code;
    261	int pwm_code;
    262};
    263
    264/*
    265 * struct lp8788_platform_data
    266 * @init_func    : used for initializing registers
    267 *                 before mfd driver is registered
    268 * @buck_data    : regulator initial data for buck
    269 * @dldo_data    : regulator initial data for digital ldo
    270 * @aldo_data    : regulator initial data for analog ldo
    271 * @buck1_dvs    : gpio configurations for buck1 dvs
    272 * @buck2_dvs    : gpio configurations for buck2 dvs
    273 * @chg_pdata    : platform data for charger driver
    274 * @alarm_sel    : rtc alarm selection (1 or 2)
    275 * @bl_pdata     : configurable data for backlight driver
    276 * @led_pdata    : configurable data for led driver
    277 * @vib_pdata    : configurable data for vibrator driver
    278 * @adc_pdata    : iio map data for adc driver
    279 */
    280struct lp8788_platform_data {
    281	/* general system information */
    282	int (*init_func) (struct lp8788 *lp);
    283
    284	/* regulators */
    285	struct regulator_init_data *buck_data[LP8788_NUM_BUCKS];
    286	struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS];
    287	struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS];
    288	struct lp8788_buck1_dvs *buck1_dvs;
    289	struct lp8788_buck2_dvs *buck2_dvs;
    290
    291	/* charger */
    292	struct lp8788_charger_platform_data *chg_pdata;
    293
    294	/* rtc alarm */
    295	enum lp8788_alarm_sel alarm_sel;
    296
    297	/* backlight */
    298	struct lp8788_backlight_platform_data *bl_pdata;
    299
    300	/* current sinks */
    301	struct lp8788_led_platform_data *led_pdata;
    302	struct lp8788_vib_platform_data *vib_pdata;
    303
    304	/* adc iio map data */
    305	struct iio_map *adc_pdata;
    306};
    307
    308/*
    309 * struct lp8788
    310 * @dev          : parent device pointer
    311 * @regmap       : used for i2c communcation on accessing registers
    312 * @irqdm        : interrupt domain for handling nested interrupt
    313 * @irq          : pin number of IRQ_N
    314 * @pdata        : lp8788 platform specific data
    315 */
    316struct lp8788 {
    317	struct device *dev;
    318	struct regmap *regmap;
    319	struct irq_domain *irqdm;
    320	int irq;
    321	struct lp8788_platform_data *pdata;
    322};
    323
    324int lp8788_irq_init(struct lp8788 *lp, int chip_irq);
    325void lp8788_irq_exit(struct lp8788 *lp);
    326int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data);
    327int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count);
    328int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data);
    329int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data);
    330#endif