rk31:linux3.10:pmic:support dc&ldo suspend en/disable,add rk808 pre_init
[firefly-linux-kernel-4.4.55.git] / include / linux / mfd / max8998-private.h
index 6dc75b3e2d33a8b73936284ddba50ae890f2577e..effa5d3b96ae8f524d4fdce7b744ac8f4bd9f977 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * max8698.h - Voltage regulator driver for the Maxim 8998
+ * max8998.h - Voltage regulator driver for the Maxim 8998
  *
  *  Copyright (C) 2009-2010 Samsung Electrnoics
  *  Kyungmin Park <kyungmin.park@samsung.com>
@@ -23,6 +23,8 @@
 #ifndef __LINUX_MFD_MAX8998_PRIV_H
 #define __LINUX_MFD_MAX8998_PRIV_H
 
+#define MAX8998_NUM_IRQ_REGS   4
+
 /* MAX 8998 registers */
 enum {
        MAX8998_REG_IRQ1,
@@ -46,12 +48,12 @@ enum {
        MAX8998_REG_ONOFF2,
        MAX8998_REG_ONOFF3,
        MAX8998_REG_ONOFF4,
-       MAX8998_REG_BUCK1_DVSARM1,
-       MAX8998_REG_BUCK1_DVSARM2,
-       MAX8998_REG_BUCK1_DVSARM3,
-       MAX8998_REG_BUCK1_DVSARM4,
-       MAX8998_REG_BUCK2_DVSINT1,
-       MAX8998_REG_BUCK2_DVSINT2,
+       MAX8998_REG_BUCK1_VOLTAGE1,
+       MAX8998_REG_BUCK1_VOLTAGE2,
+       MAX8998_REG_BUCK1_VOLTAGE3,
+       MAX8998_REG_BUCK1_VOLTAGE4,
+       MAX8998_REG_BUCK2_VOLTAGE1,
+       MAX8998_REG_BUCK2_VOLTAGE2,
        MAX8998_REG_BUCK3,
        MAX8998_REG_BUCK4,
        MAX8998_REG_LDO2_LDO3,
@@ -72,41 +74,104 @@ enum {
        MAX8998_REG_LBCNFG2,
 };
 
+/* IRQ definitions */
+enum {
+       MAX8998_IRQ_DCINF,
+       MAX8998_IRQ_DCINR,
+       MAX8998_IRQ_JIGF,
+       MAX8998_IRQ_JIGR,
+       MAX8998_IRQ_PWRONF,
+       MAX8998_IRQ_PWRONR,
+
+       MAX8998_IRQ_WTSREVNT,
+       MAX8998_IRQ_SMPLEVNT,
+       MAX8998_IRQ_ALARM1,
+       MAX8998_IRQ_ALARM0,
+
+       MAX8998_IRQ_ONKEY1S,
+       MAX8998_IRQ_TOPOFFR,
+       MAX8998_IRQ_DCINOVPR,
+       MAX8998_IRQ_CHGRSTF,
+       MAX8998_IRQ_DONER,
+       MAX8998_IRQ_CHGFAULT,
+
+       MAX8998_IRQ_LOBAT1,
+       MAX8998_IRQ_LOBAT2,
+
+       MAX8998_IRQ_NR,
+};
+
+/* MAX8998 various variants */
+enum {
+       TYPE_MAX8998 = 0, /* Default */
+       TYPE_LP3974,    /* National version of MAX8998 */
+       TYPE_LP3979,    /* Added AVS */
+};
+
+#define MAX8998_IRQ_DCINF_MASK         (1 << 2)
+#define MAX8998_IRQ_DCINR_MASK         (1 << 3)
+#define MAX8998_IRQ_JIGF_MASK          (1 << 4)
+#define MAX8998_IRQ_JIGR_MASK          (1 << 5)
+#define MAX8998_IRQ_PWRONF_MASK                (1 << 6)
+#define MAX8998_IRQ_PWRONR_MASK                (1 << 7)
+
+#define MAX8998_IRQ_WTSREVNT_MASK      (1 << 0)
+#define MAX8998_IRQ_SMPLEVNT_MASK      (1 << 1)
+#define MAX8998_IRQ_ALARM1_MASK                (1 << 2)
+#define MAX8998_IRQ_ALARM0_MASK                (1 << 3)
+
+#define MAX8998_IRQ_ONKEY1S_MASK       (1 << 0)
+#define MAX8998_IRQ_TOPOFFR_MASK       (1 << 2)
+#define MAX8998_IRQ_DCINOVPR_MASK      (1 << 3)
+#define MAX8998_IRQ_CHGRSTF_MASK       (1 << 4)
+#define MAX8998_IRQ_DONER_MASK         (1 << 5)
+#define MAX8998_IRQ_CHGFAULT_MASK      (1 << 7)
+
+#define MAX8998_IRQ_LOBAT1_MASK                (1 << 0)
+#define MAX8998_IRQ_LOBAT2_MASK                (1 << 1)
+
+#define MAX8998_ENRAMP                  (1 << 4)
+
 /**
  * struct max8998_dev - max8998 master device for sub-drivers
  * @dev: master device of the chip (can be used to access platform data)
- * @i2c_client: i2c client private data
- * @dev_read():        chip register read function
- * @dev_write(): chip register write function
- * @dev_update(): chip register update function
+ * @i2c: i2c client private data for regulator
+ * @rtc: i2c client private data for rtc
  * @iolock: mutex for serializing io access
+ * @irqlock: mutex for buslock
+ * @irq_base: base IRQ number for max8998, required for IRQs
+ * @irq: generic IRQ number for max8998
+ * @ono: power onoff IRQ number for max8998
+ * @irq_masks_cur: currently active value
+ * @irq_masks_cache: cached hardware value
+ * @type: indicate which max8998 "variant" is used
  */
-
 struct max8998_dev {
        struct device *dev;
-       struct i2c_client *i2c_client;
-       int (*dev_read)(struct max8998_dev *max8998, u8 reg, u8 *dest);
-       int (*dev_write)(struct max8998_dev *max8998, u8 reg, u8 val);
-       int (*dev_update)(struct max8998_dev *max8998, u8 reg, u8 val, u8 mask);
+       struct i2c_client *i2c;
+       struct i2c_client *rtc;
        struct mutex iolock;
+       struct mutex irqlock;
+
+       int irq_base;
+       int irq;
+       int ono;
+       u8 irq_masks_cur[MAX8998_NUM_IRQ_REGS];
+       u8 irq_masks_cache[MAX8998_NUM_IRQ_REGS];
+       int type;
+       bool wakeup;
 };
 
-static inline int max8998_read_reg(struct max8998_dev *max8998, u8 reg,
-                                  u8 *value)
-{
-       return max8998->dev_read(max8998, reg, value);
-}
-
-static inline int max8998_write_reg(struct max8998_dev *max8998, u8 reg,
-                                   u8 value)
-{
-       return max8998->dev_write(max8998, reg, value);
-}
-
-static inline int max8998_update_reg(struct max8998_dev *max8998, u8 reg,
-                                    u8 value, u8 mask)
-{
-       return max8998->dev_update(max8998, reg, value, mask);
-}
+int max8998_irq_init(struct max8998_dev *max8998);
+void max8998_irq_exit(struct max8998_dev *max8998);
+int max8998_irq_resume(struct max8998_dev *max8998);
+
+extern int max8998_read_reg(struct i2c_client *i2c, u8 reg, u8 *dest);
+extern int max8998_bulk_read(struct i2c_client *i2c, u8 reg, int count,
+               u8 *buf);
+extern int max8998_write_reg(struct i2c_client *i2c, u8 reg, u8 value);
+extern int max8998_bulk_write(struct i2c_client *i2c, u8 reg, int count,
+               u8 *buf);
+extern int max8998_update_reg(struct i2c_client *i2c, u8 reg, u8 val, u8 mask);
 
 #endif /*  __LINUX_MFD_MAX8998_PRIV_H */