These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / pinctrl / mediatek / pinctrl-mtk-common.h
index 375771d..55a5343 100644 (file)
 
 #include <linux/pinctrl/pinctrl.h>
 #include <linux/regmap.h>
+#include <linux/pinctrl/pinconf-generic.h>
 
 #define NO_EINT_SUPPORT    255
-#define MTK_CHIP_TYPE_BASE     0
-#define MTK_CHIP_TYPE_PMIC     1
 #define MT_EDGE_SENSITIVE           0
 #define MT_LEVEL_SENSITIVE          1
 #define EINT_DBNC_SET_DBNC_BITS     4
 #define EINT_DBNC_RST_BIT           (0x1 << 1)
 #define EINT_DBNC_SET_EN            (0x1 << 0)
 
+#define MTK_PINCTRL_NOT_SUPPORT        (0xffff)
+
 struct mtk_desc_function {
        const char *name;
        unsigned char muxval;
@@ -39,7 +40,6 @@ struct mtk_desc_eint {
 
 struct mtk_desc_pin {
        struct pinctrl_pin_desc pin;
-       const char *chip;
        const struct mtk_desc_eint eint;
        const struct mtk_desc_function  *functions;
 };
@@ -47,7 +47,6 @@ struct mtk_desc_pin {
 #define MTK_PIN(_pin, _pad, _chip, _eint, ...)         \
        {                                                       \
                .pin = _pin,                                    \
-               .chip = _chip,                                  \
                .eint = _eint,                                  \
                .functions = (struct mtk_desc_function[]){      \
                        __VA_ARGS__, { } },                     \
@@ -107,8 +106,8 @@ struct mtk_drv_group_desc {
  * @grp: The group for this pin belongs to.
  */
 struct mtk_pin_drv_grp {
-       unsigned int pin;
-       unsigned int offset;
+       unsigned short pin;
+       unsigned short offset;
        unsigned char bit;
        unsigned char grp;
 };
@@ -121,6 +120,54 @@ struct mtk_pin_drv_grp {
                .grp = _grp,    \
        }
 
+/**
+ * struct mtk_pin_spec_pupd_set_samereg
+ * - For special pins' pull up/down setting which resides in same register
+ * @pin: The pin number.
+ * @offset: The offset of special pull up/down setting register.
+ * @pupd_bit: The pull up/down bit in this register.
+ * @r0_bit: The r0 bit of pull resistor.
+ * @r1_bit: The r1 bit of pull resistor.
+ */
+struct mtk_pin_spec_pupd_set_samereg {
+       unsigned short pin;
+       unsigned short offset;
+       unsigned char pupd_bit;
+       unsigned char r1_bit;
+       unsigned char r0_bit;
+};
+
+#define MTK_PIN_PUPD_SPEC_SR(_pin, _offset, _pupd, _r1, _r0)   \
+       {       \
+               .pin = _pin,    \
+               .offset = _offset,      \
+               .pupd_bit = _pupd,      \
+               .r1_bit = _r1,          \
+               .r0_bit = _r0,          \
+       }
+
+/**
+ * struct mtk_pin_ies_set - For special pins' ies and smt setting.
+ * @start: The start pin number of those special pins.
+ * @end: The end pin number of those special pins.
+ * @offset: The offset of special setting register.
+ * @bit: The bit of special setting register.
+ */
+struct mtk_pin_ies_smt_set {
+       unsigned short start;
+       unsigned short end;
+       unsigned short offset;
+       unsigned char bit;
+};
+
+#define MTK_PIN_IES_SMT_SPEC(_start, _end, _offset, _bit)      \
+       {       \
+               .start = _start,        \
+               .end = _end,    \
+               .bit = _bit,    \
+               .offset = _offset,      \
+       }
+
 struct mtk_eint_offsets {
        const char *name;
        unsigned int  stat;
@@ -186,14 +233,13 @@ struct mtk_pinctrl_devdata {
        int (*spec_pull_set)(struct regmap *reg, unsigned int pin,
                        unsigned char align, bool isup, unsigned int arg);
        int (*spec_ies_smt_set)(struct regmap *reg, unsigned int pin,
-                       unsigned char align, int value);
+                       unsigned char align, int value, enum pin_config_param arg);
        unsigned int dir_offset;
        unsigned int ies_offset;
        unsigned int smt_offset;
        unsigned int pullen_offset;
        unsigned int pullsel_offset;
        unsigned int drv_offset;
-       unsigned int invser_offset;
        unsigned int dout_offset;
        unsigned int din_offset;
        unsigned int pinmux_offset;
@@ -202,7 +248,6 @@ struct mtk_pinctrl_devdata {
        unsigned char  port_shf;
        unsigned char  port_mask;
        unsigned char  port_align;
-       unsigned char   chip_type;
        struct mtk_eint_offsets eint_offsets;
        unsigned int    ap_num;
        unsigned int    db_cnt;
@@ -211,6 +256,7 @@ struct mtk_pinctrl_devdata {
 struct mtk_pinctrl {
        struct regmap   *regmap1;
        struct regmap   *regmap2;
+       struct pinctrl_desc pctl_desc;
        struct device           *dev;
        struct gpio_chip        *chip;
        struct mtk_pinctrl_group        *groups;
@@ -221,9 +267,23 @@ struct mtk_pinctrl {
        void __iomem            *eint_reg_base;
        struct irq_domain       *domain;
        int                     *eint_dual_edges;
+       u32 *wake_mask;
+       u32 *cur_mask;
 };
 
 int mtk_pctrl_init(struct platform_device *pdev,
-               const struct mtk_pinctrl_devdata *data);
+               const struct mtk_pinctrl_devdata *data,
+               struct regmap *regmap);
+
+int mtk_pctrl_spec_pull_set_samereg(struct regmap *regmap,
+               const struct mtk_pin_spec_pupd_set_samereg *pupd_infos,
+               unsigned int info_num, unsigned int pin,
+               unsigned char align, bool isup, unsigned int r1r0);
+
+int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap,
+               const struct mtk_pin_ies_smt_set *ies_smt_infos, unsigned int info_num,
+               unsigned int pin, unsigned char align, int value);
+
+extern const struct dev_pm_ops mtk_eint_pm_ops;
 
 #endif /* __PINCTRL_MTK_COMMON_H */