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
14struct 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
35struct mtk_eint_hw {
36 u8 port_mask;
37 u8 ports;
38 unsigned int ap_num;
39 unsigned int db_cnt;
40 const unsigned int *db_time;
41};
42
43extern const unsigned int debounce_time_mt2701[];
44extern const unsigned int debounce_time_mt6765[];
45extern const unsigned int debounce_time_mt6795[];
46
47struct mtk_eint;
48
49struct mtk_eint_xt {
50 int (*get_gpio_n)(void *data, unsigned long eint_n,
51 unsigned int *gpio_n,
52 struct gpio_chip **gpio_chip);
53 int (*get_gpio_state)(void *data, unsigned long eint_n);
54 int (*set_gpio_as_eint)(void *data, unsigned long eint_n);
55};
56
57struct mtk_eint {
58 struct device *dev;
59 void __iomem *base;
60 struct irq_domain *domain;
61 int irq;
62
63 int *dual_edge;
64 u32 *wake_mask;
65 u32 *cur_mask;
66
67 /* Used to fit into various EINT device */
68 const struct mtk_eint_hw *hw;
69 const struct mtk_eint_regs *regs;
70 u16 num_db_time;
71
72 /* Used to fit into various pinctrl device */
73 void *pctl;
74 const struct mtk_eint_xt *gpio_xlate;
75};
76
77#if IS_ENABLED(CONFIG_EINT_MTK)
78int mtk_eint_do_init(struct mtk_eint *eint);
79int mtk_eint_do_suspend(struct mtk_eint *eint);
80int mtk_eint_do_resume(struct mtk_eint *eint);
81int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_n,
82 unsigned int debounce);
83int mtk_eint_find_irq(struct mtk_eint *eint, unsigned long eint_n);
84
85#else
86static inline int mtk_eint_do_init(struct mtk_eint *eint)
87{
88 return -EOPNOTSUPP;
89}
90
91static inline int mtk_eint_do_suspend(struct mtk_eint *eint)
92{
93 return -EOPNOTSUPP;
94}
95
96static inline int mtk_eint_do_resume(struct mtk_eint *eint)
97{
98 return -EOPNOTSUPP;
99}
100
101static inline int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_n,
102 unsigned int debounce)
103{
104 return -EOPNOTSUPP;
105}
106
107static inline int mtk_eint_find_irq(struct mtk_eint *eint, unsigned long eint_n)
108{
109 return -EOPNOTSUPP;
110}
111#endif
112#endif /* __MTK_EINT_H */
113

source code of linux/drivers/pinctrl/mediatek/mtk-eint.h