0001
0002
0003
0004
0005
0006
0007
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
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
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
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,
0094 LP8788_BL_COMB_REGISTER_BASED,
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
0162
0163
0164
0165 struct lp8788_buck1_dvs {
0166 int gpio;
0167 enum lp8788_dvs_sel vsel;
0168 };
0169
0170
0171
0172
0173
0174
0175 struct lp8788_buck2_dvs {
0176 int gpio[LP8788_NUM_BUCK2_DVS];
0177 enum lp8788_dvs_sel vsel;
0178 };
0179
0180
0181
0182
0183
0184
0185 struct lp8788_chg_param {
0186 u8 addr;
0187 u8 val;
0188 };
0189
0190
0191
0192
0193
0194
0195
0196
0197
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
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
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
0236
0237
0238
0239
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
0250
0251
0252
0253
0254
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
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 struct lp8788_platform_data {
0281
0282 int (*init_func) (struct lp8788 *lp);
0283
0284
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
0292 struct lp8788_charger_platform_data *chg_pdata;
0293
0294
0295 enum lp8788_alarm_sel alarm_sel;
0296
0297
0298 struct lp8788_backlight_platform_data *bl_pdata;
0299
0300
0301 struct lp8788_led_platform_data *led_pdata;
0302 struct lp8788_vib_platform_data *vib_pdata;
0303
0304
0305 struct iio_map *adc_pdata;
0306 };
0307
0308
0309
0310
0311
0312
0313
0314
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