1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Definitions and platform data for Analog Devices 4*4882a593Smuzhiyun * ADP5520/ADP5501 MFD PMICs (Backlight, LED, GPIO and Keys) 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright 2009 Analog Devices Inc. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __LINUX_MFD_ADP5520_H 11*4882a593Smuzhiyun #define __LINUX_MFD_ADP5520_H 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define ID_ADP5520 5520 14*4882a593Smuzhiyun #define ID_ADP5501 5501 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /* 17*4882a593Smuzhiyun * ADP5520/ADP5501 Register Map 18*4882a593Smuzhiyun */ 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #define ADP5520_MODE_STATUS 0x00 21*4882a593Smuzhiyun #define ADP5520_INTERRUPT_ENABLE 0x01 22*4882a593Smuzhiyun #define ADP5520_BL_CONTROL 0x02 23*4882a593Smuzhiyun #define ADP5520_BL_TIME 0x03 24*4882a593Smuzhiyun #define ADP5520_BL_FADE 0x04 25*4882a593Smuzhiyun #define ADP5520_DAYLIGHT_MAX 0x05 26*4882a593Smuzhiyun #define ADP5520_DAYLIGHT_DIM 0x06 27*4882a593Smuzhiyun #define ADP5520_OFFICE_MAX 0x07 28*4882a593Smuzhiyun #define ADP5520_OFFICE_DIM 0x08 29*4882a593Smuzhiyun #define ADP5520_DARK_MAX 0x09 30*4882a593Smuzhiyun #define ADP5520_DARK_DIM 0x0A 31*4882a593Smuzhiyun #define ADP5520_BL_VALUE 0x0B 32*4882a593Smuzhiyun #define ADP5520_ALS_CMPR_CFG 0x0C 33*4882a593Smuzhiyun #define ADP5520_L2_TRIP 0x0D 34*4882a593Smuzhiyun #define ADP5520_L2_HYS 0x0E 35*4882a593Smuzhiyun #define ADP5520_L3_TRIP 0x0F 36*4882a593Smuzhiyun #define ADP5520_L3_HYS 0x10 37*4882a593Smuzhiyun #define ADP5520_LED_CONTROL 0x11 38*4882a593Smuzhiyun #define ADP5520_LED_TIME 0x12 39*4882a593Smuzhiyun #define ADP5520_LED_FADE 0x13 40*4882a593Smuzhiyun #define ADP5520_LED1_CURRENT 0x14 41*4882a593Smuzhiyun #define ADP5520_LED2_CURRENT 0x15 42*4882a593Smuzhiyun #define ADP5520_LED3_CURRENT 0x16 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * ADP5520 Register Map 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define ADP5520_GPIO_CFG_1 0x17 49*4882a593Smuzhiyun #define ADP5520_GPIO_CFG_2 0x18 50*4882a593Smuzhiyun #define ADP5520_GPIO_IN 0x19 51*4882a593Smuzhiyun #define ADP5520_GPIO_OUT 0x1A 52*4882a593Smuzhiyun #define ADP5520_GPIO_INT_EN 0x1B 53*4882a593Smuzhiyun #define ADP5520_GPIO_INT_STAT 0x1C 54*4882a593Smuzhiyun #define ADP5520_GPIO_INT_LVL 0x1D 55*4882a593Smuzhiyun #define ADP5520_GPIO_DEBOUNCE 0x1E 56*4882a593Smuzhiyun #define ADP5520_GPIO_PULLUP 0x1F 57*4882a593Smuzhiyun #define ADP5520_KP_INT_STAT_1 0x20 58*4882a593Smuzhiyun #define ADP5520_KP_INT_STAT_2 0x21 59*4882a593Smuzhiyun #define ADP5520_KR_INT_STAT_1 0x22 60*4882a593Smuzhiyun #define ADP5520_KR_INT_STAT_2 0x23 61*4882a593Smuzhiyun #define ADP5520_KEY_STAT_1 0x24 62*4882a593Smuzhiyun #define ADP5520_KEY_STAT_2 0x25 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* 65*4882a593Smuzhiyun * MODE_STATUS bits 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun #define ADP5520_nSTNBY (1 << 7) 69*4882a593Smuzhiyun #define ADP5520_BL_EN (1 << 6) 70*4882a593Smuzhiyun #define ADP5520_DIM_EN (1 << 5) 71*4882a593Smuzhiyun #define ADP5520_OVP_INT (1 << 4) 72*4882a593Smuzhiyun #define ADP5520_CMPR_INT (1 << 3) 73*4882a593Smuzhiyun #define ADP5520_GPI_INT (1 << 2) 74*4882a593Smuzhiyun #define ADP5520_KR_INT (1 << 1) 75*4882a593Smuzhiyun #define ADP5520_KP_INT (1 << 0) 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun /* 78*4882a593Smuzhiyun * INTERRUPT_ENABLE bits 79*4882a593Smuzhiyun */ 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #define ADP5520_AUTO_LD_EN (1 << 4) 82*4882a593Smuzhiyun #define ADP5520_CMPR_IEN (1 << 3) 83*4882a593Smuzhiyun #define ADP5520_OVP_IEN (1 << 2) 84*4882a593Smuzhiyun #define ADP5520_KR_IEN (1 << 1) 85*4882a593Smuzhiyun #define ADP5520_KP_IEN (1 << 0) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun /* 88*4882a593Smuzhiyun * BL_CONTROL bits 89*4882a593Smuzhiyun */ 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #define ADP5520_BL_LVL ((x) << 5) 92*4882a593Smuzhiyun #define ADP5520_BL_LAW ((x) << 4) 93*4882a593Smuzhiyun #define ADP5520_BL_AUTO_ADJ (1 << 3) 94*4882a593Smuzhiyun #define ADP5520_OVP_EN (1 << 2) 95*4882a593Smuzhiyun #define ADP5520_FOVR (1 << 1) 96*4882a593Smuzhiyun #define ADP5520_KP_BL_EN (1 << 0) 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* 99*4882a593Smuzhiyun * ALS_CMPR_CFG bits 100*4882a593Smuzhiyun */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #define ADP5520_L3_OUT (1 << 3) 103*4882a593Smuzhiyun #define ADP5520_L2_OUT (1 << 2) 104*4882a593Smuzhiyun #define ADP5520_L3_EN (1 << 1) 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun #define ADP5020_MAX_BRIGHTNESS 0x7F 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun #define FADE_VAL(in, out) ((0xF & (in)) | ((0xF & (out)) << 4)) 109*4882a593Smuzhiyun #define BL_CTRL_VAL(law, auto) (((1 & (auto)) << 3) | ((0x3 & (law)) << 4)) 110*4882a593Smuzhiyun #define ALS_CMPR_CFG_VAL(filt, l3_en) (((0x7 & filt) << 5) | l3_en) 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun /* 113*4882a593Smuzhiyun * LEDs subdevice bits and masks 114*4882a593Smuzhiyun */ 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun #define ADP5520_01_MAXLEDS 3 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define ADP5520_FLAG_LED_MASK 0x3 119*4882a593Smuzhiyun #define ADP5520_FLAG_OFFT_SHIFT 8 120*4882a593Smuzhiyun #define ADP5520_FLAG_OFFT_MASK 0x3 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun #define ADP5520_R3_MODE (1 << 5) 123*4882a593Smuzhiyun #define ADP5520_C3_MODE (1 << 4) 124*4882a593Smuzhiyun #define ADP5520_LED_LAW (1 << 3) 125*4882a593Smuzhiyun #define ADP5520_LED3_EN (1 << 2) 126*4882a593Smuzhiyun #define ADP5520_LED2_EN (1 << 1) 127*4882a593Smuzhiyun #define ADP5520_LED1_EN (1 << 0) 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /* 130*4882a593Smuzhiyun * GPIO subdevice bits and masks 131*4882a593Smuzhiyun */ 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun #define ADP5520_MAXGPIOS 8 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #define ADP5520_GPIO_C3 (1 << 7) /* LED2 or GPIO7 aka C3 */ 136*4882a593Smuzhiyun #define ADP5520_GPIO_C2 (1 << 6) 137*4882a593Smuzhiyun #define ADP5520_GPIO_C1 (1 << 5) 138*4882a593Smuzhiyun #define ADP5520_GPIO_C0 (1 << 4) 139*4882a593Smuzhiyun #define ADP5520_GPIO_R3 (1 << 3) /* LED3 or GPIO3 aka R3 */ 140*4882a593Smuzhiyun #define ADP5520_GPIO_R2 (1 << 2) 141*4882a593Smuzhiyun #define ADP5520_GPIO_R1 (1 << 1) 142*4882a593Smuzhiyun #define ADP5520_GPIO_R0 (1 << 0) 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun struct adp5520_gpio_platform_data { 145*4882a593Smuzhiyun unsigned gpio_start; 146*4882a593Smuzhiyun u8 gpio_en_mask; 147*4882a593Smuzhiyun u8 gpio_pullup_mask; 148*4882a593Smuzhiyun }; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* 151*4882a593Smuzhiyun * Keypad subdevice bits and masks 152*4882a593Smuzhiyun */ 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define ADP5520_MAXKEYS 16 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun #define ADP5520_COL_C3 (1 << 7) /* LED2 or GPIO7 aka C3 */ 157*4882a593Smuzhiyun #define ADP5520_COL_C2 (1 << 6) 158*4882a593Smuzhiyun #define ADP5520_COL_C1 (1 << 5) 159*4882a593Smuzhiyun #define ADP5520_COL_C0 (1 << 4) 160*4882a593Smuzhiyun #define ADP5520_ROW_R3 (1 << 3) /* LED3 or GPIO3 aka R3 */ 161*4882a593Smuzhiyun #define ADP5520_ROW_R2 (1 << 2) 162*4882a593Smuzhiyun #define ADP5520_ROW_R1 (1 << 1) 163*4882a593Smuzhiyun #define ADP5520_ROW_R0 (1 << 0) 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun #define ADP5520_KEY(row, col) (col + row * 4) 166*4882a593Smuzhiyun #define ADP5520_KEYMAPSIZE ADP5520_MAXKEYS 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun struct adp5520_keys_platform_data { 169*4882a593Smuzhiyun int rows_en_mask; /* Number of rows */ 170*4882a593Smuzhiyun int cols_en_mask; /* Number of columns */ 171*4882a593Smuzhiyun const unsigned short *keymap; /* Pointer to keymap */ 172*4882a593Smuzhiyun unsigned short keymapsize; /* Keymap size */ 173*4882a593Smuzhiyun unsigned repeat:1; /* Enable key repeat */ 174*4882a593Smuzhiyun }; 175*4882a593Smuzhiyun 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /* 178*4882a593Smuzhiyun * LEDs subdevice platform data 179*4882a593Smuzhiyun */ 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun #define FLAG_ID_ADP5520_LED1_ADP5501_LED0 1 /* ADP5520 PIN ILED */ 182*4882a593Smuzhiyun #define FLAG_ID_ADP5520_LED2_ADP5501_LED1 2 /* ADP5520 PIN C3 */ 183*4882a593Smuzhiyun #define FLAG_ID_ADP5520_LED3_ADP5501_LED2 3 /* ADP5520 PIN R3 */ 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #define ADP5520_LED_DIS_BLINK (0 << ADP5520_FLAG_OFFT_SHIFT) 186*4882a593Smuzhiyun #define ADP5520_LED_OFFT_600ms (1 << ADP5520_FLAG_OFFT_SHIFT) 187*4882a593Smuzhiyun #define ADP5520_LED_OFFT_800ms (2 << ADP5520_FLAG_OFFT_SHIFT) 188*4882a593Smuzhiyun #define ADP5520_LED_OFFT_1200ms (3 << ADP5520_FLAG_OFFT_SHIFT) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #define ADP5520_LED_ONT_200ms 0 191*4882a593Smuzhiyun #define ADP5520_LED_ONT_600ms 1 192*4882a593Smuzhiyun #define ADP5520_LED_ONT_800ms 2 193*4882a593Smuzhiyun #define ADP5520_LED_ONT_1200ms 3 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun struct adp5520_leds_platform_data { 196*4882a593Smuzhiyun int num_leds; 197*4882a593Smuzhiyun struct led_info *leds; 198*4882a593Smuzhiyun u8 fade_in; /* Backlight Fade-In Timer */ 199*4882a593Smuzhiyun u8 fade_out; /* Backlight Fade-Out Timer */ 200*4882a593Smuzhiyun u8 led_on_time; 201*4882a593Smuzhiyun }; 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun /* 204*4882a593Smuzhiyun * Backlight subdevice platform data 205*4882a593Smuzhiyun */ 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun #define ADP5520_FADE_T_DIS 0 /* Fade Timer Disabled */ 208*4882a593Smuzhiyun #define ADP5520_FADE_T_300ms 1 /* 0.3 Sec */ 209*4882a593Smuzhiyun #define ADP5520_FADE_T_600ms 2 210*4882a593Smuzhiyun #define ADP5520_FADE_T_900ms 3 211*4882a593Smuzhiyun #define ADP5520_FADE_T_1200ms 4 212*4882a593Smuzhiyun #define ADP5520_FADE_T_1500ms 5 213*4882a593Smuzhiyun #define ADP5520_FADE_T_1800ms 6 214*4882a593Smuzhiyun #define ADP5520_FADE_T_2100ms 7 215*4882a593Smuzhiyun #define ADP5520_FADE_T_2400ms 8 216*4882a593Smuzhiyun #define ADP5520_FADE_T_2700ms 9 217*4882a593Smuzhiyun #define ADP5520_FADE_T_3000ms 10 218*4882a593Smuzhiyun #define ADP5520_FADE_T_3500ms 11 219*4882a593Smuzhiyun #define ADP5520_FADE_T_4000ms 12 220*4882a593Smuzhiyun #define ADP5520_FADE_T_4500ms 13 221*4882a593Smuzhiyun #define ADP5520_FADE_T_5000ms 14 222*4882a593Smuzhiyun #define ADP5520_FADE_T_5500ms 15 /* 5.5 Sec */ 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun #define ADP5520_BL_LAW_LINEAR 0 225*4882a593Smuzhiyun #define ADP5520_BL_LAW_SQUARE 1 226*4882a593Smuzhiyun #define ADP5520_BL_LAW_CUBIC1 2 227*4882a593Smuzhiyun #define ADP5520_BL_LAW_CUBIC2 3 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_80ms 0 /* Light sensor filter time */ 230*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_160ms 1 231*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_320ms 2 232*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_640ms 3 233*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_1280ms 4 234*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_2560ms 5 235*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_5120ms 6 236*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_10240ms 7 /* 10.24 sec */ 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun /* 239*4882a593Smuzhiyun * Blacklight current 0..30mA 240*4882a593Smuzhiyun */ 241*4882a593Smuzhiyun #define ADP5520_BL_CUR_mA(I) ((I * 127) / 30) 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun /* 244*4882a593Smuzhiyun * L2 comparator current 0..1000uA 245*4882a593Smuzhiyun */ 246*4882a593Smuzhiyun #define ADP5520_L2_COMP_CURR_uA(I) ((I * 255) / 1000) 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun /* 249*4882a593Smuzhiyun * L3 comparator current 0..127uA 250*4882a593Smuzhiyun */ 251*4882a593Smuzhiyun #define ADP5520_L3_COMP_CURR_uA(I) ((I * 255) / 127) 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun struct adp5520_backlight_platform_data { 254*4882a593Smuzhiyun u8 fade_in; /* Backlight Fade-In Timer */ 255*4882a593Smuzhiyun u8 fade_out; /* Backlight Fade-Out Timer */ 256*4882a593Smuzhiyun u8 fade_led_law; /* fade-on/fade-off transfer characteristic */ 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun u8 en_ambl_sens; /* 1 = enable ambient light sensor */ 259*4882a593Smuzhiyun u8 abml_filt; /* Light sensor filter time */ 260*4882a593Smuzhiyun u8 l1_daylight_max; /* use BL_CUR_mA(I) 0 <= I <= 30 mA */ 261*4882a593Smuzhiyun u8 l1_daylight_dim; /* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */ 262*4882a593Smuzhiyun u8 l2_office_max; /* use BL_CUR_mA(I) 0 <= I <= 30 mA */ 263*4882a593Smuzhiyun u8 l2_office_dim; /* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */ 264*4882a593Smuzhiyun u8 l3_dark_max; /* use BL_CUR_mA(I) 0 <= I <= 30 mA */ 265*4882a593Smuzhiyun u8 l3_dark_dim; /* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */ 266*4882a593Smuzhiyun u8 l2_trip; /* use L2_COMP_CURR_uA(I) 0 <= I <= 1000 uA */ 267*4882a593Smuzhiyun u8 l2_hyst; /* use L2_COMP_CURR_uA(I) 0 <= I <= 1000 uA */ 268*4882a593Smuzhiyun u8 l3_trip; /* use L3_COMP_CURR_uA(I) 0 <= I <= 127 uA */ 269*4882a593Smuzhiyun u8 l3_hyst; /* use L3_COMP_CURR_uA(I) 0 <= I <= 127 uA */ 270*4882a593Smuzhiyun }; 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun /* 273*4882a593Smuzhiyun * MFD chip platform data 274*4882a593Smuzhiyun */ 275*4882a593Smuzhiyun 276*4882a593Smuzhiyun struct adp5520_platform_data { 277*4882a593Smuzhiyun struct adp5520_keys_platform_data *keys; 278*4882a593Smuzhiyun struct adp5520_gpio_platform_data *gpio; 279*4882a593Smuzhiyun struct adp5520_leds_platform_data *leds; 280*4882a593Smuzhiyun struct adp5520_backlight_platform_data *backlight; 281*4882a593Smuzhiyun }; 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun /* 284*4882a593Smuzhiyun * MFD chip functions 285*4882a593Smuzhiyun */ 286*4882a593Smuzhiyun 287*4882a593Smuzhiyun extern int adp5520_read(struct device *dev, int reg, uint8_t *val); 288*4882a593Smuzhiyun extern int adp5520_write(struct device *dev, int reg, u8 val); 289*4882a593Smuzhiyun extern int adp5520_clr_bits(struct device *dev, int reg, uint8_t bit_mask); 290*4882a593Smuzhiyun extern int adp5520_set_bits(struct device *dev, int reg, uint8_t bit_mask); 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun extern int adp5520_register_notifier(struct device *dev, 293*4882a593Smuzhiyun struct notifier_block *nb, unsigned int events); 294*4882a593Smuzhiyun 295*4882a593Smuzhiyun extern int adp5520_unregister_notifier(struct device *dev, 296*4882a593Smuzhiyun struct notifier_block *nb, unsigned int events); 297*4882a593Smuzhiyun 298*4882a593Smuzhiyun #endif /* __LINUX_MFD_ADP5520_H */ 299