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