linux/include/linux/mfd/88pm860x.h
<<
>>
Prefs
   1/*
   2 * Marvell 88PM860x Interface
   3 *
   4 * Copyright (C) 2009 Marvell International Ltd.
   5 *      Haojian Zhuang <haojian.zhuang@marvell.com>
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11
  12#ifndef __LINUX_MFD_88PM860X_H
  13#define __LINUX_MFD_88PM860X_H
  14
  15#include <linux/interrupt.h>
  16
  17#define MFD_NAME_SIZE           (40)
  18
  19enum {
  20        CHIP_INVALID = 0,
  21        CHIP_PM8606,
  22        CHIP_PM8607,
  23        CHIP_MAX,
  24};
  25
  26enum {
  27        PM8606_ID_INVALID,
  28        PM8606_ID_BACKLIGHT,
  29        PM8606_ID_LED,
  30        PM8606_ID_VIBRATOR,
  31        PM8606_ID_TOUCH,
  32        PM8606_ID_SOUND,
  33        PM8606_ID_CHARGER,
  34        PM8606_ID_MAX,
  35};
  36
  37enum {
  38        PM8606_BACKLIGHT1 = 0,
  39        PM8606_BACKLIGHT2,
  40        PM8606_BACKLIGHT3,
  41};
  42
  43enum {
  44        PM8606_LED1_RED = 0,
  45        PM8606_LED1_GREEN,
  46        PM8606_LED1_BLUE,
  47        PM8606_LED2_RED,
  48        PM8606_LED2_GREEN,
  49        PM8606_LED2_BLUE,
  50        PM8607_LED_VIBRATOR,
  51};
  52
  53
  54/* 8606 Registers */
  55#define PM8606_DCM_BOOST                (0x00)
  56#define PM8606_PWM                      (0x01)
  57
  58/* Backlight Registers */
  59#define PM8606_WLED1A                   (0x02)
  60#define PM8606_WLED1B                   (0x03)
  61#define PM8606_WLED2A                   (0x04)
  62#define PM8606_WLED2B                   (0x05)
  63#define PM8606_WLED3A                   (0x06)
  64#define PM8606_WLED3B                   (0x07)
  65
  66/* LED Registers */
  67#define PM8606_RGB2A                    (0x08)
  68#define PM8606_RGB2B                    (0x09)
  69#define PM8606_RGB2C                    (0x0A)
  70#define PM8606_RGB2D                    (0x0B)
  71#define PM8606_RGB1A                    (0x0C)
  72#define PM8606_RGB1B                    (0x0D)
  73#define PM8606_RGB1C                    (0x0E)
  74#define PM8606_RGB1D                    (0x0F)
  75
  76#define PM8606_PREREGULATORA            (0x10)
  77#define PM8606_PREREGULATORB            (0x11)
  78#define PM8606_VIBRATORA                (0x12)
  79#define PM8606_VIBRATORB                (0x13)
  80#define PM8606_VCHG                     (0x14)
  81#define PM8606_VSYS                     (0x15)
  82#define PM8606_MISC                     (0x16)
  83#define PM8606_CHIP_ID                  (0x17)
  84#define PM8606_STATUS                   (0x18)
  85#define PM8606_FLAGS                    (0x19)
  86#define PM8606_PROTECTA                 (0x1A)
  87#define PM8606_PROTECTB                 (0x1B)
  88#define PM8606_PROTECTC                 (0x1C)
  89
  90/* Bit definitions of PM8606 registers */
  91#define PM8606_DCM_500MA                (0x0)   /* current limit */
  92#define PM8606_DCM_750MA                (0x1)
  93#define PM8606_DCM_1000MA               (0x2)
  94#define PM8606_DCM_1250MA               (0x3)
  95#define PM8606_DCM_250MV                (0x0 << 2)
  96#define PM8606_DCM_300MV                (0x1 << 2)
  97#define PM8606_DCM_350MV                (0x2 << 2)
  98#define PM8606_DCM_400MV                (0x3 << 2)
  99
 100#define PM8606_PWM_31200HZ              (0x0)
 101#define PM8606_PWM_15600HZ              (0x1)
 102#define PM8606_PWM_7800HZ               (0x2)
 103#define PM8606_PWM_3900HZ               (0x3)
 104#define PM8606_PWM_1950HZ               (0x4)
 105#define PM8606_PWM_976HZ                (0x5)
 106#define PM8606_PWM_488HZ                (0x6)
 107#define PM8606_PWM_244HZ                (0x7)
 108#define PM8606_PWM_FREQ_MASK            (0x7)
 109
 110#define PM8606_WLED_ON                  (1 << 0)
 111#define PM8606_WLED_CURRENT(x)          ((x & 0x1F) << 1)
 112
 113#define PM8606_LED_CURRENT(x)           (((x >> 2) & 0x07) << 5)
 114
 115#define PM8606_VSYS_EN                  (1 << 1)
 116
 117#define PM8606_MISC_OSC_EN              (1 << 4)
 118
 119enum {
 120        PM8607_ID_BUCK1 = 0,
 121        PM8607_ID_BUCK2,
 122        PM8607_ID_BUCK3,
 123
 124        PM8607_ID_LDO1,
 125        PM8607_ID_LDO2,
 126        PM8607_ID_LDO3,
 127        PM8607_ID_LDO4,
 128        PM8607_ID_LDO5,
 129        PM8607_ID_LDO6,
 130        PM8607_ID_LDO7,
 131        PM8607_ID_LDO8,
 132        PM8607_ID_LDO9,
 133        PM8607_ID_LDO10,
 134        PM8607_ID_LDO11,
 135        PM8607_ID_LDO12,
 136        PM8607_ID_LDO13,
 137        PM8607_ID_LDO14,
 138        PM8607_ID_LDO15,
 139
 140        PM8607_ID_RG_MAX,
 141};
 142
 143/* 8607 chip ID is 0x40 or 0x50 */
 144#define PM8607_VERSION_MASK             (0xF0)  /* 8607 chip ID mask */
 145
 146/* Interrupt Registers */
 147#define PM8607_STATUS_1                 (0x01)
 148#define PM8607_STATUS_2                 (0x02)
 149#define PM8607_INT_STATUS1              (0x03)
 150#define PM8607_INT_STATUS2              (0x04)
 151#define PM8607_INT_STATUS3              (0x05)
 152#define PM8607_INT_MASK_1               (0x06)
 153#define PM8607_INT_MASK_2               (0x07)
 154#define PM8607_INT_MASK_3               (0x08)
 155
 156/* Regulator Control Registers */
 157#define PM8607_LDO1                     (0x10)
 158#define PM8607_LDO2                     (0x11)
 159#define PM8607_LDO3                     (0x12)
 160#define PM8607_LDO4                     (0x13)
 161#define PM8607_LDO5                     (0x14)
 162#define PM8607_LDO6                     (0x15)
 163#define PM8607_LDO7                     (0x16)
 164#define PM8607_LDO8                     (0x17)
 165#define PM8607_LDO9                     (0x18)
 166#define PM8607_LDO10                    (0x19)
 167#define PM8607_LDO12                    (0x1A)
 168#define PM8607_LDO14                    (0x1B)
 169#define PM8607_SLEEP_MODE1              (0x1C)
 170#define PM8607_SLEEP_MODE2              (0x1D)
 171#define PM8607_SLEEP_MODE3              (0x1E)
 172#define PM8607_SLEEP_MODE4              (0x1F)
 173#define PM8607_GO                       (0x20)
 174#define PM8607_SLEEP_BUCK1              (0x21)
 175#define PM8607_SLEEP_BUCK2              (0x22)
 176#define PM8607_SLEEP_BUCK3              (0x23)
 177#define PM8607_BUCK1                    (0x24)
 178#define PM8607_BUCK2                    (0x25)
 179#define PM8607_BUCK3                    (0x26)
 180#define PM8607_BUCK_CONTROLS            (0x27)
 181#define PM8607_SUPPLIES_EN11            (0x2B)
 182#define PM8607_SUPPLIES_EN12            (0x2C)
 183#define PM8607_GROUP1                   (0x2D)
 184#define PM8607_GROUP2                   (0x2E)
 185#define PM8607_GROUP3                   (0x2F)
 186#define PM8607_GROUP4                   (0x30)
 187#define PM8607_GROUP5                   (0x31)
 188#define PM8607_GROUP6                   (0x32)
 189#define PM8607_SUPPLIES_EN21            (0x33)
 190#define PM8607_SUPPLIES_EN22            (0x34)
 191
 192/* Vibrator Control Registers */
 193#define PM8607_VIBRATOR_SET             (0x28)
 194#define PM8607_VIBRATOR_PWM             (0x29)
 195
 196/* GPADC Registers */
 197#define PM8607_GP_BIAS1                 (0x4F)
 198#define PM8607_MEAS_EN1                 (0x50)
 199#define PM8607_MEAS_EN2                 (0x51)
 200#define PM8607_MEAS_EN3                 (0x52)
 201#define PM8607_MEAS_OFF_TIME1           (0x53)
 202#define PM8607_MEAS_OFF_TIME2           (0x54)
 203#define PM8607_TSI_PREBIAS              (0x55)  /* prebias time */
 204#define PM8607_PD_PREBIAS               (0x56)  /* prebias time */
 205#define PM8607_GPADC_MISC1              (0x57)
 206
 207/* RTC Control Registers */
 208#define PM8607_RTC1                     (0xA0)
 209#define PM8607_RTC_COUNTER1             (0xA1)
 210#define PM8607_RTC_COUNTER2             (0xA2)
 211#define PM8607_RTC_COUNTER3             (0xA3)
 212#define PM8607_RTC_COUNTER4             (0xA4)
 213#define PM8607_RTC_EXPIRE1              (0xA5)
 214#define PM8607_RTC_EXPIRE2              (0xA6)
 215#define PM8607_RTC_EXPIRE3              (0xA7)
 216#define PM8607_RTC_EXPIRE4              (0xA8)
 217#define PM8607_RTC_TRIM1                (0xA9)
 218#define PM8607_RTC_TRIM2                (0xAA)
 219#define PM8607_RTC_TRIM3                (0xAB)
 220#define PM8607_RTC_TRIM4                (0xAC)
 221#define PM8607_RTC_MISC1                (0xAD)
 222#define PM8607_RTC_MISC2                (0xAE)
 223#define PM8607_RTC_MISC3                (0xAF)
 224
 225/* Misc Registers */
 226#define PM8607_CHIP_ID                  (0x00)
 227#define PM8607_B0_MISC1                 (0x0C)
 228#define PM8607_LDO1                     (0x10)
 229#define PM8607_DVC3                     (0x26)
 230#define PM8607_A1_MISC1                 (0x40)
 231
 232/* bit definitions of Status Query Interface */
 233#define PM8607_STATUS_CC                (1 << 3)
 234#define PM8607_STATUS_PEN               (1 << 4)
 235#define PM8607_STATUS_HEADSET           (1 << 5)
 236#define PM8607_STATUS_HOOK              (1 << 6)
 237#define PM8607_STATUS_MICIN             (1 << 7)
 238#define PM8607_STATUS_ONKEY             (1 << 8)
 239#define PM8607_STATUS_EXTON             (1 << 9)
 240#define PM8607_STATUS_CHG               (1 << 10)
 241#define PM8607_STATUS_BAT               (1 << 11)
 242#define PM8607_STATUS_VBUS              (1 << 12)
 243#define PM8607_STATUS_OV                (1 << 13)
 244
 245/* bit definitions of BUCK3 */
 246#define PM8607_BUCK3_DOUBLE             (1 << 6)
 247
 248/* bit definitions of Misc1 */
 249#define PM8607_A1_MISC1_PI2C            (1 << 0)
 250#define PM8607_B0_MISC1_INV_INT         (1 << 0)
 251#define PM8607_B0_MISC1_INT_CLEAR       (1 << 1)
 252#define PM8607_B0_MISC1_INT_MASK        (1 << 2)
 253#define PM8607_B0_MISC1_PI2C            (1 << 3)
 254#define PM8607_B0_MISC1_RESET           (1 << 6)
 255
 256/* bits definitions of GPADC */
 257#define PM8607_GPADC_EN                 (1 << 0)
 258#define PM8607_GPADC_PREBIAS_MASK       (3 << 1)
 259#define PM8607_GPADC_SLOT_CYCLE_MASK    (3 << 3)        /* slow mode */
 260#define PM8607_GPADC_OFF_SCALE_MASK     (3 << 5)        /* GP sleep mode */
 261#define PM8607_GPADC_SW_CAL_MASK        (1 << 7)
 262
 263#define PM8607_PD_PREBIAS_MASK          (0x1F << 0)
 264#define PM8607_PD_PRECHG_MASK           (7 << 5)
 265
 266/* Interrupt Number in 88PM8607 */
 267enum {
 268        PM8607_IRQ_ONKEY,
 269        PM8607_IRQ_EXTON,
 270        PM8607_IRQ_CHG,
 271        PM8607_IRQ_BAT,
 272        PM8607_IRQ_RTC,
 273        PM8607_IRQ_CC,
 274        PM8607_IRQ_VBAT,
 275        PM8607_IRQ_VCHG,
 276        PM8607_IRQ_VSYS,
 277        PM8607_IRQ_TINT,
 278        PM8607_IRQ_GPADC0,
 279        PM8607_IRQ_GPADC1,
 280        PM8607_IRQ_GPADC2,
 281        PM8607_IRQ_GPADC3,
 282        PM8607_IRQ_AUDIO_SHORT,
 283        PM8607_IRQ_PEN,
 284        PM8607_IRQ_HEADSET,
 285        PM8607_IRQ_HOOK,
 286        PM8607_IRQ_MICIN,
 287        PM8607_IRQ_CHG_FAIL,
 288        PM8607_IRQ_CHG_DONE,
 289        PM8607_IRQ_CHG_FAULT,
 290};
 291
 292enum {
 293        PM8607_CHIP_A0 = 0x40,
 294        PM8607_CHIP_A1 = 0x41,
 295        PM8607_CHIP_B0 = 0x48,
 296};
 297
 298struct pm860x_chip {
 299        struct device           *dev;
 300        struct mutex            io_lock;
 301        struct mutex            irq_lock;
 302        struct i2c_client       *client;
 303        struct i2c_client       *companion;     /* companion chip client */
 304
 305        int                     buck3_double;   /* DVC ramp slope double */
 306        unsigned short          companion_addr;
 307        int                     id;
 308        int                     irq_mode;
 309        int                     irq_base;
 310        int                     core_irq;
 311        unsigned char           chip_version;
 312
 313};
 314
 315enum {
 316        GI2C_PORT = 0,
 317        PI2C_PORT,
 318};
 319
 320struct pm860x_backlight_pdata {
 321        int             id;
 322        int             pwm;
 323        int             iset;
 324        unsigned long   flags;
 325};
 326
 327struct pm860x_led_pdata {
 328        int             id;
 329        int             iset;
 330        unsigned long   flags;
 331};
 332
 333struct pm860x_rtc_pdata {
 334        int             (*sync)(unsigned int ticks);
 335        int             vrtc;
 336};
 337
 338struct pm860x_touch_pdata {
 339        int             gpadc_prebias;
 340        int             slot_cycle;
 341        int             off_scale;
 342        int             sw_cal;
 343        int             tsi_prebias;    /* time, slot */
 344        int             pen_prebias;    /* time, slot */
 345        int             pen_prechg;     /* time, slot */
 346        int             res_x;          /* resistor of Xplate */
 347        unsigned long   flags;
 348};
 349
 350struct pm860x_power_pdata {
 351        unsigned        fast_charge;    /* charge current */
 352};
 353
 354struct pm860x_platform_data {
 355        struct pm860x_backlight_pdata   *backlight;
 356        struct pm860x_led_pdata         *led;
 357        struct pm860x_rtc_pdata         *rtc;
 358        struct pm860x_touch_pdata       *touch;
 359        struct pm860x_power_pdata       *power;
 360        struct regulator_init_data      *regulator;
 361
 362        unsigned short  companion_addr; /* I2C address of companion chip */
 363        int             i2c_port;       /* Controlled by GI2C or PI2C */
 364        int             irq_mode;       /* Clear interrupt by read/write(0/1) */
 365        int             irq_base;       /* IRQ base number of 88pm860x */
 366        int             num_leds;
 367        int             num_backlights;
 368        int             num_regulators;
 369};
 370
 371extern int pm860x_reg_read(struct i2c_client *, int);
 372extern int pm860x_reg_write(struct i2c_client *, int, unsigned char);
 373extern int pm860x_bulk_read(struct i2c_client *, int, int, unsigned char *);
 374extern int pm860x_bulk_write(struct i2c_client *, int, int, unsigned char *);
 375extern int pm860x_set_bits(struct i2c_client *, int, unsigned char,
 376                           unsigned char);
 377extern int pm860x_page_reg_read(struct i2c_client *, int);
 378extern int pm860x_page_reg_write(struct i2c_client *, int, unsigned char);
 379extern int pm860x_page_bulk_read(struct i2c_client *, int, int,
 380                                 unsigned char *);
 381extern int pm860x_page_bulk_write(struct i2c_client *, int, int,
 382                                  unsigned char *);
 383extern int pm860x_page_set_bits(struct i2c_client *, int, unsigned char,
 384                                unsigned char);
 385
 386extern int pm860x_device_init(struct pm860x_chip *chip,
 387                              struct pm860x_platform_data *pdata) __devinit ;
 388extern void pm860x_device_exit(struct pm860x_chip *chip) __devexit ;
 389
 390#endif /* __LINUX_MFD_88PM860X_H */
 391