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