input: Enable touch on 88pm860x
[safe/jmp/linux-2.6] / include / linux / mfd / 88pm860x.h
index 5845ae4..80bc82a 100644 (file)
 #ifndef __LINUX_MFD_88PM860X_H
 #define __LINUX_MFD_88PM860X_H
 
+#include <linux/interrupt.h>
+
+#define MFD_NAME_SIZE          (40)
+
 enum {
        CHIP_INVALID = 0,
        CHIP_PM8606,
@@ -20,6 +24,99 @@ enum {
 };
 
 enum {
+       PM8606_ID_INVALID,
+       PM8606_ID_BACKLIGHT,
+       PM8606_ID_LED,
+       PM8606_ID_VIBRATOR,
+       PM8606_ID_TOUCH,
+       PM8606_ID_SOUND,
+       PM8606_ID_CHARGER,
+       PM8606_ID_MAX,
+};
+
+enum {
+       PM8606_BACKLIGHT1 = 0,
+       PM8606_BACKLIGHT2,
+       PM8606_BACKLIGHT3,
+};
+
+enum {
+       PM8606_LED1_RED = 0,
+       PM8606_LED1_GREEN,
+       PM8606_LED1_BLUE,
+       PM8606_LED2_RED,
+       PM8606_LED2_GREEN,
+       PM8606_LED2_BLUE,
+       PM8607_LED_VIBRATOR,
+};
+
+
+/* 8606 Registers */
+#define PM8606_DCM_BOOST               (0x00)
+#define PM8606_PWM                     (0x01)
+
+/* Backlight Registers */
+#define PM8606_WLED1A                  (0x02)
+#define PM8606_WLED1B                  (0x03)
+#define PM8606_WLED2A                  (0x04)
+#define PM8606_WLED2B                  (0x05)
+#define PM8606_WLED3A                  (0x06)
+#define PM8606_WLED3B                  (0x07)
+
+/* LED Registers */
+#define PM8606_RGB2A                   (0x08)
+#define PM8606_RGB2B                   (0x09)
+#define PM8606_RGB2C                   (0x0A)
+#define PM8606_RGB2D                   (0x0B)
+#define PM8606_RGB1A                   (0x0C)
+#define PM8606_RGB1B                   (0x0D)
+#define PM8606_RGB1C                   (0x0E)
+#define PM8606_RGB1D                   (0x0F)
+
+#define PM8606_PREREGULATORA           (0x10)
+#define PM8606_PREREGULATORB           (0x11)
+#define PM8606_VIBRATORA               (0x12)
+#define PM8606_VIBRATORB               (0x13)
+#define PM8606_VCHG                    (0x14)
+#define PM8606_VSYS                    (0x15)
+#define PM8606_MISC                    (0x16)
+#define PM8606_CHIP_ID                 (0x17)
+#define PM8606_STATUS                  (0x18)
+#define PM8606_FLAGS                   (0x19)
+#define PM8606_PROTECTA                        (0x1A)
+#define PM8606_PROTECTB                        (0x1B)
+#define PM8606_PROTECTC                        (0x1C)
+
+/* Bit definitions of PM8606 registers */
+#define PM8606_DCM_500MA               (0x0)   /* current limit */
+#define PM8606_DCM_750MA               (0x1)
+#define PM8606_DCM_1000MA              (0x2)
+#define PM8606_DCM_1250MA              (0x3)
+#define PM8606_DCM_250MV               (0x0 << 2)
+#define PM8606_DCM_300MV               (0x1 << 2)
+#define PM8606_DCM_350MV               (0x2 << 2)
+#define PM8606_DCM_400MV               (0x3 << 2)
+
+#define PM8606_PWM_31200HZ             (0x0)
+#define PM8606_PWM_15600HZ             (0x1)
+#define PM8606_PWM_7800HZ              (0x2)
+#define PM8606_PWM_3900HZ              (0x3)
+#define PM8606_PWM_1950HZ              (0x4)
+#define PM8606_PWM_976HZ               (0x5)
+#define PM8606_PWM_488HZ               (0x6)
+#define PM8606_PWM_244HZ               (0x7)
+#define PM8606_PWM_FREQ_MASK           (0x7)
+
+#define PM8606_WLED_ON                 (1 << 0)
+#define PM8606_WLED_CURRENT(x)         ((x & 0x1F) << 1)
+
+#define PM8606_LED_CURRENT(x)          (((x >> 2) & 0x07) << 5)
+
+#define PM8606_VSYS_EN                 (1 << 1)
+
+#define PM8606_MISC_OSC_EN             (1 << 4)
+
+enum {
        PM8607_ID_BUCK1 = 0,
        PM8607_ID_BUCK2,
        PM8607_ID_BUCK3,
@@ -89,6 +186,21 @@ enum {
 #define PM8607_SUPPLIES_EN21           (0x33)
 #define PM8607_SUPPLIES_EN22           (0x34)
 
+/* Vibrator Control Registers */
+#define PM8607_VIBRATOR_SET            (0x28)
+#define PM8607_VIBRATOR_PWM            (0x29)
+
+/* GPADC Registers */
+#define PM8607_GP_BIAS1                        (0x4F)
+#define PM8607_MEAS_EN1                        (0x50)
+#define PM8607_MEAS_EN2                        (0x51)
+#define PM8607_MEAS_EN3                        (0x52)
+#define PM8607_MEAS_OFF_TIME1          (0x53)
+#define PM8607_MEAS_OFF_TIME2          (0x54)
+#define PM8607_TSI_PREBIAS             (0x55)  /* prebias time */
+#define PM8607_PD_PREBIAS              (0x56)  /* prebias time */
+#define PM8607_GPADC_MISC1             (0x57)
+
 /* RTC Control Registers */
 #define PM8607_RTC1                    (0xA0)
 #define PM8607_RTC_COUNTER1            (0xA1)
@@ -109,33 +221,10 @@ enum {
 
 /* Misc Registers */
 #define PM8607_CHIP_ID                 (0x00)
+#define PM8607_B0_MISC1                        (0x0C)
 #define PM8607_LDO1                    (0x10)
 #define PM8607_DVC3                    (0x26)
-#define PM8607_MISC1                   (0x40)
-
-/* bit definitions for PM8607 events */
-#define PM8607_EVENT_ONKEY             (1 << 0)
-#define PM8607_EVENT_EXTON             (1 << 1)
-#define PM8607_EVENT_CHG               (1 << 2)
-#define PM8607_EVENT_BAT               (1 << 3)
-#define PM8607_EVENT_RTC               (1 << 4)
-#define PM8607_EVENT_CC                        (1 << 5)
-#define PM8607_EVENT_VBAT              (1 << 8)
-#define PM8607_EVENT_VCHG              (1 << 9)
-#define PM8607_EVENT_VSYS              (1 << 10)
-#define PM8607_EVENT_TINT              (1 << 11)
-#define PM8607_EVENT_GPADC0            (1 << 12)
-#define PM8607_EVENT_GPADC1            (1 << 13)
-#define PM8607_EVENT_GPADC2            (1 << 14)
-#define PM8607_EVENT_GPADC3            (1 << 15)
-#define PM8607_EVENT_AUDIO_SHORT       (1 << 16)
-#define PM8607_EVENT_PEN               (1 << 17)
-#define PM8607_EVENT_HEADSET           (1 << 18)
-#define PM8607_EVENT_HOOK              (1 << 19)
-#define PM8607_EVENT_MICIN             (1 << 20)
-#define PM8607_EVENT_CHG_TIMEOUT       (1 << 21)
-#define PM8607_EVENT_CHG_DONE          (1 << 22)
-#define PM8607_EVENT_CHG_FAULT         (1 << 23)
+#define PM8607_A1_MISC1                        (0x40)
 
 /* bit definitions of Status Query Interface */
 #define PM8607_STATUS_CC               (1 << 3)
@@ -154,7 +243,22 @@ enum {
 #define PM8607_BUCK3_DOUBLE            (1 << 6)
 
 /* bit definitions of Misc1 */
-#define PM8607_MISC1_PI2C              (1 << 0)
+#define PM8607_A1_MISC1_PI2C           (1 << 0)
+#define PM8607_B0_MISC1_INV_INT                (1 << 0)
+#define PM8607_B0_MISC1_INT_CLEAR      (1 << 1)
+#define PM8607_B0_MISC1_INT_MASK       (1 << 2)
+#define PM8607_B0_MISC1_PI2C           (1 << 3)
+#define PM8607_B0_MISC1_RESET          (1 << 6)
+
+/* bits definitions of GPADC */
+#define PM8607_GPADC_EN                        (1 << 0)
+#define PM8607_GPADC_PREBIAS_MASK      (3 << 1)
+#define PM8607_GPADC_SLOT_CYCLE_MASK   (3 << 3)        /* slow mode */
+#define PM8607_GPADC_OFF_SCALE_MASK    (3 << 5)        /* GP sleep mode */
+#define PM8607_GPADC_SW_CAL_MASK       (1 << 7)
+
+#define PM8607_PD_PREBIAS_MASK         (0x1F << 0)
+#define PM8607_PD_PRECHG_MASK          (7 << 5)
 
 /* Interrupt Number in 88PM8607 */
 enum {
@@ -187,15 +291,26 @@ enum {
        PM8607_CHIP_B0 = 0x48,
 };
 
+#define PM860X_NUM_IRQ         24
+
+struct pm860x_irq {
+       irq_handler_t           handler;
+       void                    *data;
+};
+
 struct pm860x_chip {
        struct device           *dev;
        struct mutex            io_lock;
+       struct mutex            irq_lock;
        struct i2c_client       *client;
        struct i2c_client       *companion;     /* companion chip client */
+       struct pm860x_irq       irq[PM860X_NUM_IRQ];
 
        int                     buck3_double;   /* DVC ramp slope double */
        unsigned short          companion_addr;
        int                     id;
+       int                     irq_mode;
+       int                     chip_irq;
        unsigned char           chip_version;
 
 };
@@ -207,12 +322,45 @@ enum {
        PI2C_PORT,
 };
 
+struct pm860x_backlight_pdata {
+       int             id;
+       int             pwm;
+       int             iset;
+       unsigned long   flags;
+};
+
+struct pm860x_led_pdata {
+       int             id;
+       int             iset;
+       unsigned long   flags;
+};
+
+struct pm860x_touch_pdata {
+       int             gpadc_prebias;
+       int             slot_cycle;
+       int             off_scale;
+       int             sw_cal;
+       int             tsi_prebias;    /* time, slot */
+       int             pen_prebias;    /* time, slot */
+       int             pen_prechg;     /* time, slot */
+       int             res_x;          /* resistor of Xplate */
+       unsigned long   flags;
+};
+
 struct pm860x_platform_data {
+       struct pm860x_backlight_pdata   *backlight;
+       struct pm860x_led_pdata         *led;
+       struct pm860x_touch_pdata       *touch;
+
        unsigned short  companion_addr; /* I2C address of companion chip */
        int             i2c_port;       /* Controlled by GI2C or PI2C */
+       int             irq_mode;       /* Clear interrupt by read/write(0/1) */
        struct regulator_init_data *regulator[PM8607_MAX_REGULATOR];
 };
 
+extern char pm860x_backlight_name[][MFD_NAME_SIZE];
+extern char pm860x_led_name[][MFD_NAME_SIZE];
+
 extern int pm860x_reg_read(struct i2c_client *, int);
 extern int pm860x_reg_write(struct i2c_client *, int, unsigned char);
 extern int pm860x_bulk_read(struct i2c_client *, int, int, unsigned char *);
@@ -220,6 +368,12 @@ extern int pm860x_bulk_write(struct i2c_client *, int, int, unsigned char *);
 extern int pm860x_set_bits(struct i2c_client *, int, unsigned char,
                           unsigned char);
 
+extern int pm860x_mask_irq(struct pm860x_chip *, int);
+extern int pm860x_unmask_irq(struct pm860x_chip *, int);
+extern int pm860x_request_irq(struct pm860x_chip *, int,
+                             irq_handler_t handler, void *);
+extern int pm860x_free_irq(struct pm860x_chip *, int);
+
 extern int pm860x_device_init(struct pm860x_chip *chip,
                              struct pm860x_platform_data *pdata);
 extern void pm860x_device_exit(struct pm860x_chip *chip);