GNU Linux-libre 4.19.286-gnu1
[releases.git] / drivers / pinctrl / mediatek / mtk-eint.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (C) 2014-2018 MediaTek Inc.
4  *
5  * Author: Maoguang Meng <maoguang.meng@mediatek.com>
6  *         Sean Wang <sean.wang@mediatek.com>
7  *
8  */
9 #ifndef __MTK_EINT_H
10 #define __MTK_EINT_H
11
12 #include <linux/irqdomain.h>
13
14 struct mtk_eint_regs {
15         unsigned int    stat;
16         unsigned int    ack;
17         unsigned int    mask;
18         unsigned int    mask_set;
19         unsigned int    mask_clr;
20         unsigned int    sens;
21         unsigned int    sens_set;
22         unsigned int    sens_clr;
23         unsigned int    soft;
24         unsigned int    soft_set;
25         unsigned int    soft_clr;
26         unsigned int    pol;
27         unsigned int    pol_set;
28         unsigned int    pol_clr;
29         unsigned int    dom_en;
30         unsigned int    dbnc_ctrl;
31         unsigned int    dbnc_set;
32         unsigned int    dbnc_clr;
33 };
34
35 struct mtk_eint_hw {
36         u8              port_mask;
37         u8              ports;
38         unsigned int    ap_num;
39         unsigned int    db_cnt;
40 };
41
42 struct mtk_eint;
43
44 struct mtk_eint_xt {
45         int (*get_gpio_n)(void *data, unsigned long eint_n,
46                           unsigned int *gpio_n,
47                           struct gpio_chip **gpio_chip);
48         int (*get_gpio_state)(void *data, unsigned long eint_n);
49         int (*set_gpio_as_eint)(void *data, unsigned long eint_n);
50 };
51
52 struct mtk_eint {
53         struct device *dev;
54         void __iomem *base;
55         struct irq_domain *domain;
56         int irq;
57
58         int *dual_edge;
59         u32 *wake_mask;
60         u32 *cur_mask;
61
62         /* Used to fit into various EINT device */
63         const struct mtk_eint_hw *hw;
64         const struct mtk_eint_regs *regs;
65
66         /* Used to fit into various pinctrl device */
67         void *pctl;
68         const struct mtk_eint_xt *gpio_xlate;
69 };
70
71 #if IS_ENABLED(CONFIG_EINT_MTK)
72 int mtk_eint_do_init(struct mtk_eint *eint);
73 int mtk_eint_do_suspend(struct mtk_eint *eint);
74 int mtk_eint_do_resume(struct mtk_eint *eint);
75 int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_n,
76                           unsigned int debounce);
77 int mtk_eint_find_irq(struct mtk_eint *eint, unsigned long eint_n);
78
79 #else
80 static inline int mtk_eint_do_init(struct mtk_eint *eint)
81 {
82         return -EOPNOTSUPP;
83 }
84
85 static inline int mtk_eint_do_suspend(struct mtk_eint *eint)
86 {
87         return -EOPNOTSUPP;
88 }
89
90 static inline int mtk_eint_do_resume(struct mtk_eint *eint)
91 {
92         return -EOPNOTSUPP;
93 }
94
95 int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_n,
96                           unsigned int debounce)
97 {
98         return -EOPNOTSUPP;
99 }
100
101 int mtk_eint_find_irq(struct mtk_eint *eint, unsigned long eint_n)
102 {
103         return -EOPNOTSUPP;
104 }
105 #endif
106 #endif /* __MTK_EINT_H */