root/include/linux/mfd/lp8788.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 
  38 enum 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 
  69 enum lp8788_dvs_sel {
  70         DVS_SEL_V0,
  71         DVS_SEL_V1,
  72         DVS_SEL_V2,
  73         DVS_SEL_V3,
  74 };
  75 
  76 enum 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 
  86 enum lp8788_charger_event {
  87         NO_CHARGER,
  88         CHARGER_DETECTED,
  89 };
  90 
  91 enum 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 
  97 enum lp8788_bl_dim_mode {
  98         LP8788_DIM_EXPONENTIAL,
  99         LP8788_DIM_LINEAR,
 100 };
 101 
 102 enum 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 
 113 enum 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 
 124 enum lp8788_isink_scale {
 125         LP8788_ISINK_SCALE_100mA,
 126         LP8788_ISINK_SCALE_120mA,
 127 };
 128 
 129 enum lp8788_isink_number {
 130         LP8788_ISINK_1,
 131         LP8788_ISINK_2,
 132         LP8788_ISINK_3,
 133 };
 134 
 135 enum lp8788_alarm_sel {
 136         LP8788_ALARM_1,
 137         LP8788_ALARM_2,
 138         LP8788_ALARM_MAX,
 139 };
 140 
 141 enum 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 
 158 struct lp8788;
 159 
 160 /*
 161  * lp8788_buck1_dvs
 162  * @gpio         : gpio pin number for dvs control
 163  * @vsel         : dvs selector for buck v1 register
 164  */
 165 struct 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  */
 175 struct 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  */
 185 struct 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  */
 199 struct 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  */
 222 struct 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  */
 241 struct 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  */
 256 struct 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  */
 280 struct 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  */
 316 struct 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 
 324 int lp8788_irq_init(struct lp8788 *lp, int chip_irq);
 325 void lp8788_irq_exit(struct lp8788 *lp);
 326 int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data);
 327 int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count);
 328 int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data);
 329 int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data);
 330 #endif

/* [<][>][^][v][top][bottom][index][help] */