Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * TI LP8788 MFD Device
0004  *
0005  * Copyright 2012 Texas Instruments
0006  *
0007  * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
0008  */
0009 
0010 #ifndef __MFD_LP8788_H__
0011 #define __MFD_LP8788_H__
0012 
0013 #include <linux/gpio.h>
0014 #include <linux/irqdomain.h>
0015 #include <linux/pwm.h>
0016 #include <linux/regmap.h>
0017 
0018 #define LP8788_DEV_BUCK     "lp8788-buck"
0019 #define LP8788_DEV_DLDO     "lp8788-dldo"
0020 #define LP8788_DEV_ALDO     "lp8788-aldo"
0021 #define LP8788_DEV_CHARGER  "lp8788-charger"
0022 #define LP8788_DEV_RTC      "lp8788-rtc"
0023 #define LP8788_DEV_BACKLIGHT    "lp8788-backlight"
0024 #define LP8788_DEV_VIBRATOR "lp8788-vibrator"
0025 #define LP8788_DEV_KEYLED   "lp8788-keyled"
0026 #define LP8788_DEV_ADC      "lp8788-adc"
0027 
0028 #define LP8788_NUM_BUCKS    4
0029 #define LP8788_NUM_DLDOS    12
0030 #define LP8788_NUM_ALDOS    10
0031 #define LP8788_NUM_BUCK2_DVS    2
0032 
0033 #define LP8788_CHG_IRQ      "CHG_IRQ"
0034 #define LP8788_PRSW_IRQ     "PRSW_IRQ"
0035 #define LP8788_BATT_IRQ     "BATT_IRQ"
0036 #define LP8788_ALM_IRQ      "ALARM_IRQ"
0037 
0038 enum lp8788_int_id {
0039     /* interrup register 1 : Addr 00h */
0040     LP8788_INT_TSDL,
0041     LP8788_INT_TSDH,
0042     LP8788_INT_UVLO,
0043     LP8788_INT_FLAGMON,
0044     LP8788_INT_PWRON_TIME,
0045     LP8788_INT_PWRON,
0046     LP8788_INT_COMP1,
0047     LP8788_INT_COMP2,
0048 
0049     /* interrupt register 2 : Addr 01h */
0050     LP8788_INT_CHG_INPUT_STATE,
0051     LP8788_INT_CHG_STATE,
0052     LP8788_INT_EOC,
0053     LP8788_INT_CHG_RESTART,
0054     LP8788_INT_RESTART_TIMEOUT,
0055     LP8788_INT_FULLCHG_TIMEOUT,
0056     LP8788_INT_PRECHG_TIMEOUT,
0057 
0058     /* interrupt register 3 : Addr 02h */
0059     LP8788_INT_RTC_ALARM1 = 17,
0060     LP8788_INT_RTC_ALARM2,
0061     LP8788_INT_ENTER_SYS_SUPPORT,
0062     LP8788_INT_EXIT_SYS_SUPPORT,
0063     LP8788_INT_BATT_LOW,
0064     LP8788_INT_NO_BATT,
0065 
0066     LP8788_INT_MAX = 24,
0067 };
0068 
0069 enum lp8788_dvs_sel {
0070     DVS_SEL_V0,
0071     DVS_SEL_V1,
0072     DVS_SEL_V2,
0073     DVS_SEL_V3,
0074 };
0075 
0076 enum lp8788_ext_ldo_en_id {
0077     EN_ALDO1,
0078     EN_ALDO234,
0079     EN_ALDO5,
0080     EN_ALDO7,
0081     EN_DLDO7,
0082     EN_DLDO911,
0083     EN_LDOS_MAX,
0084 };
0085 
0086 enum lp8788_charger_event {
0087     NO_CHARGER,
0088     CHARGER_DETECTED,
0089 };
0090 
0091 enum lp8788_bl_ctrl_mode {
0092     LP8788_BL_REGISTER_ONLY,
0093     LP8788_BL_COMB_PWM_BASED,   /* PWM + I2C, changed by PWM input */
0094     LP8788_BL_COMB_REGISTER_BASED,  /* PWM + I2C, changed by I2C */
0095 };
0096 
0097 enum lp8788_bl_dim_mode {
0098     LP8788_DIM_EXPONENTIAL,
0099     LP8788_DIM_LINEAR,
0100 };
0101 
0102 enum lp8788_bl_full_scale_current {
0103     LP8788_FULLSCALE_5000uA,
0104     LP8788_FULLSCALE_8500uA,
0105     LP8788_FULLSCALE_1200uA,
0106     LP8788_FULLSCALE_1550uA,
0107     LP8788_FULLSCALE_1900uA,
0108     LP8788_FULLSCALE_2250uA,
0109     LP8788_FULLSCALE_2600uA,
0110     LP8788_FULLSCALE_2950uA,
0111 };
0112 
0113 enum lp8788_bl_ramp_step {
0114     LP8788_RAMP_8us,
0115     LP8788_RAMP_1024us,
0116     LP8788_RAMP_2048us,
0117     LP8788_RAMP_4096us,
0118     LP8788_RAMP_8192us,
0119     LP8788_RAMP_16384us,
0120     LP8788_RAMP_32768us,
0121     LP8788_RAMP_65538us,
0122 };
0123 
0124 enum lp8788_isink_scale {
0125     LP8788_ISINK_SCALE_100mA,
0126     LP8788_ISINK_SCALE_120mA,
0127 };
0128 
0129 enum lp8788_isink_number {
0130     LP8788_ISINK_1,
0131     LP8788_ISINK_2,
0132     LP8788_ISINK_3,
0133 };
0134 
0135 enum lp8788_alarm_sel {
0136     LP8788_ALARM_1,
0137     LP8788_ALARM_2,
0138     LP8788_ALARM_MAX,
0139 };
0140 
0141 enum lp8788_adc_id {
0142     LPADC_VBATT_5P5,
0143     LPADC_VIN_CHG,
0144     LPADC_IBATT,
0145     LPADC_IC_TEMP,
0146     LPADC_VBATT_6P0,
0147     LPADC_VBATT_5P0,
0148     LPADC_ADC1,
0149     LPADC_ADC2,
0150     LPADC_VDD,
0151     LPADC_VCOIN,
0152     LPADC_VDD_LDO,
0153     LPADC_ADC3,
0154     LPADC_ADC4,
0155     LPADC_MAX,
0156 };
0157 
0158 struct lp8788;
0159 
0160 /*
0161  * lp8788_buck1_dvs
0162  * @gpio         : gpio pin number for dvs control
0163  * @vsel         : dvs selector for buck v1 register
0164  */
0165 struct lp8788_buck1_dvs {
0166     int gpio;
0167     enum lp8788_dvs_sel vsel;
0168 };
0169 
0170 /*
0171  * lp8788_buck2_dvs
0172  * @gpio         : two gpio pin numbers are used for dvs
0173  * @vsel         : dvs selector for buck v2 register
0174  */
0175 struct lp8788_buck2_dvs {
0176     int gpio[LP8788_NUM_BUCK2_DVS];
0177     enum lp8788_dvs_sel vsel;
0178 };
0179 
0180 /*
0181  * struct lp8788_chg_param
0182  * @addr         : charging control register address (range : 0x11 ~ 0x1C)
0183  * @val          : charging parameter value
0184  */
0185 struct lp8788_chg_param {
0186     u8 addr;
0187     u8 val;
0188 };
0189 
0190 /*
0191  * struct lp8788_charger_platform_data
0192  * @adc_vbatt         : adc channel name for battery voltage
0193  * @adc_batt_temp     : adc channel name for battery temperature
0194  * @max_vbatt_mv      : used for calculating battery capacity
0195  * @chg_params        : initial charging parameters
0196  * @num_chg_params    : numbers of charging parameters
0197  * @charger_event     : the charger event can be reported to the platform side
0198  */
0199 struct lp8788_charger_platform_data {
0200     const char *adc_vbatt;
0201     const char *adc_batt_temp;
0202     unsigned int max_vbatt_mv;
0203     struct lp8788_chg_param *chg_params;
0204     int num_chg_params;
0205     void (*charger_event) (struct lp8788 *lp,
0206                 enum lp8788_charger_event event);
0207 };
0208 
0209 /*
0210  * struct lp8788_backlight_platform_data
0211  * @name                  : backlight driver name. (default: "lcd-backlight")
0212  * @initial_brightness    : initial value of backlight brightness
0213  * @bl_mode               : brightness control by pwm or lp8788 register
0214  * @dim_mode              : dimming mode selection
0215  * @full_scale            : full scale current setting
0216  * @rise_time             : brightness ramp up step time
0217  * @fall_time             : brightness ramp down step time
0218  * @pwm_pol               : pwm polarity setting when bl_mode is pwm based
0219  * @period_ns             : platform specific pwm period value. unit is nano.
0220                 Only valid when bl_mode is LP8788_BL_COMB_PWM_BASED
0221  */
0222 struct lp8788_backlight_platform_data {
0223     char *name;
0224     int initial_brightness;
0225     enum lp8788_bl_ctrl_mode bl_mode;
0226     enum lp8788_bl_dim_mode dim_mode;
0227     enum lp8788_bl_full_scale_current full_scale;
0228     enum lp8788_bl_ramp_step rise_time;
0229     enum lp8788_bl_ramp_step fall_time;
0230     enum pwm_polarity pwm_pol;
0231     unsigned int period_ns;
0232 };
0233 
0234 /*
0235  * struct lp8788_led_platform_data
0236  * @name         : led driver name. (default: "keyboard-backlight")
0237  * @scale        : current scale
0238  * @num          : current sink number
0239  * @iout_code    : current output value (Addr 9Ah ~ 9Bh)
0240  */
0241 struct lp8788_led_platform_data {
0242     char *name;
0243     enum lp8788_isink_scale scale;
0244     enum lp8788_isink_number num;
0245     int iout_code;
0246 };
0247 
0248 /*
0249  * struct lp8788_vib_platform_data
0250  * @name         : vibrator driver name
0251  * @scale        : current scale
0252  * @num          : current sink number
0253  * @iout_code    : current output value (Addr 9Ah ~ 9Bh)
0254  * @pwm_code     : PWM code value (Addr 9Ch ~ 9Eh)
0255  */
0256 struct lp8788_vib_platform_data {
0257     char *name;
0258     enum lp8788_isink_scale scale;
0259     enum lp8788_isink_number num;
0260     int iout_code;
0261     int pwm_code;
0262 };
0263 
0264 /*
0265  * struct lp8788_platform_data
0266  * @init_func    : used for initializing registers
0267  *                 before mfd driver is registered
0268  * @buck_data    : regulator initial data for buck
0269  * @dldo_data    : regulator initial data for digital ldo
0270  * @aldo_data    : regulator initial data for analog ldo
0271  * @buck1_dvs    : gpio configurations for buck1 dvs
0272  * @buck2_dvs    : gpio configurations for buck2 dvs
0273  * @chg_pdata    : platform data for charger driver
0274  * @alarm_sel    : rtc alarm selection (1 or 2)
0275  * @bl_pdata     : configurable data for backlight driver
0276  * @led_pdata    : configurable data for led driver
0277  * @vib_pdata    : configurable data for vibrator driver
0278  * @adc_pdata    : iio map data for adc driver
0279  */
0280 struct lp8788_platform_data {
0281     /* general system information */
0282     int (*init_func) (struct lp8788 *lp);
0283 
0284     /* regulators */
0285     struct regulator_init_data *buck_data[LP8788_NUM_BUCKS];
0286     struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS];
0287     struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS];
0288     struct lp8788_buck1_dvs *buck1_dvs;
0289     struct lp8788_buck2_dvs *buck2_dvs;
0290 
0291     /* charger */
0292     struct lp8788_charger_platform_data *chg_pdata;
0293 
0294     /* rtc alarm */
0295     enum lp8788_alarm_sel alarm_sel;
0296 
0297     /* backlight */
0298     struct lp8788_backlight_platform_data *bl_pdata;
0299 
0300     /* current sinks */
0301     struct lp8788_led_platform_data *led_pdata;
0302     struct lp8788_vib_platform_data *vib_pdata;
0303 
0304     /* adc iio map data */
0305     struct iio_map *adc_pdata;
0306 };
0307 
0308 /*
0309  * struct lp8788
0310  * @dev          : parent device pointer
0311  * @regmap       : used for i2c communcation on accessing registers
0312  * @irqdm        : interrupt domain for handling nested interrupt
0313  * @irq          : pin number of IRQ_N
0314  * @pdata        : lp8788 platform specific data
0315  */
0316 struct lp8788 {
0317     struct device *dev;
0318     struct regmap *regmap;
0319     struct irq_domain *irqdm;
0320     int irq;
0321     struct lp8788_platform_data *pdata;
0322 };
0323 
0324 int lp8788_irq_init(struct lp8788 *lp, int chip_irq);
0325 void lp8788_irq_exit(struct lp8788 *lp);
0326 int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data);
0327 int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count);
0328 int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data);
0329 int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data);
0330 #endif