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