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 static inline int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_n, 96 unsigned int debounce) 97 { 98 return -EOPNOTSUPP; 99 } 100 101 static inline 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 */ 107