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