linux/include/linux/mfd/lp8788.h
<<
>>
Prefs
   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
 331