| 1 | // SPDX-License-Identifier: GPL-2.0+ |
| 2 | // |
| 3 | // Copyright (c) 2011-2014 Samsung Electronics Co., Ltd |
| 4 | // http://www.samsung.com |
| 5 | |
| 6 | #include <linux/array_size.h> |
| 7 | #include <linux/build_bug.h> |
| 8 | #include <linux/dev_printk.h> |
| 9 | #include <linux/interrupt.h> |
| 10 | #include <linux/irq.h> |
| 11 | #include <linux/mfd/samsung/core.h> |
| 12 | #include <linux/mfd/samsung/irq.h> |
| 13 | #include <linux/mfd/samsung/s2mpg10.h> |
| 14 | #include <linux/mfd/samsung/s2mps11.h> |
| 15 | #include <linux/mfd/samsung/s2mps14.h> |
| 16 | #include <linux/mfd/samsung/s2mpu02.h> |
| 17 | #include <linux/mfd/samsung/s2mpu05.h> |
| 18 | #include <linux/mfd/samsung/s5m8767.h> |
| 19 | #include <linux/regmap.h> |
| 20 | #include "sec-core.h" |
| 21 | |
| 22 | static const struct regmap_irq s2mpg10_irqs[] = { |
| 23 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWRONF, 0, S2MPG10_IRQ_PWRONF_MASK), |
| 24 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWRONR, 0, S2MPG10_IRQ_PWRONR_MASK), |
| 25 | REGMAP_IRQ_REG(S2MPG10_IRQ_JIGONBF, 0, S2MPG10_IRQ_JIGONBF_MASK), |
| 26 | REGMAP_IRQ_REG(S2MPG10_IRQ_JIGONBR, 0, S2MPG10_IRQ_JIGONBR_MASK), |
| 27 | REGMAP_IRQ_REG(S2MPG10_IRQ_ACOKBF, 0, S2MPG10_IRQ_ACOKBF_MASK), |
| 28 | REGMAP_IRQ_REG(S2MPG10_IRQ_ACOKBR, 0, S2MPG10_IRQ_ACOKBR_MASK), |
| 29 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWRON1S, 0, S2MPG10_IRQ_PWRON1S_MASK), |
| 30 | REGMAP_IRQ_REG(S2MPG10_IRQ_MRB, 0, S2MPG10_IRQ_MRB_MASK), |
| 31 | |
| 32 | REGMAP_IRQ_REG(S2MPG10_IRQ_RTC60S, 1, S2MPG10_IRQ_RTC60S_MASK), |
| 33 | REGMAP_IRQ_REG(S2MPG10_IRQ_RTCA1, 1, S2MPG10_IRQ_RTCA1_MASK), |
| 34 | REGMAP_IRQ_REG(S2MPG10_IRQ_RTCA0, 1, S2MPG10_IRQ_RTCA0_MASK), |
| 35 | REGMAP_IRQ_REG(S2MPG10_IRQ_RTC1S, 1, S2MPG10_IRQ_RTC1S_MASK), |
| 36 | REGMAP_IRQ_REG(S2MPG10_IRQ_WTSR_COLDRST, 1, S2MPG10_IRQ_WTSR_COLDRST_MASK), |
| 37 | REGMAP_IRQ_REG(S2MPG10_IRQ_WTSR, 1, S2MPG10_IRQ_WTSR_MASK), |
| 38 | REGMAP_IRQ_REG(S2MPG10_IRQ_WRST, 1, S2MPG10_IRQ_WRST_MASK), |
| 39 | REGMAP_IRQ_REG(S2MPG10_IRQ_SMPL, 1, S2MPG10_IRQ_SMPL_MASK), |
| 40 | |
| 41 | REGMAP_IRQ_REG(S2MPG10_IRQ_120C, 2, S2MPG10_IRQ_INT120C_MASK), |
| 42 | REGMAP_IRQ_REG(S2MPG10_IRQ_140C, 2, S2MPG10_IRQ_INT140C_MASK), |
| 43 | REGMAP_IRQ_REG(S2MPG10_IRQ_TSD, 2, S2MPG10_IRQ_TSD_MASK), |
| 44 | REGMAP_IRQ_REG(S2MPG10_IRQ_PIF_TIMEOUT1, 2, S2MPG10_IRQ_PIF_TIMEOUT1_MASK), |
| 45 | REGMAP_IRQ_REG(S2MPG10_IRQ_PIF_TIMEOUT2, 2, S2MPG10_IRQ_PIF_TIMEOUT2_MASK), |
| 46 | REGMAP_IRQ_REG(S2MPG10_IRQ_SPD_PARITY_ERR, 2, S2MPG10_IRQ_SPD_PARITY_ERR_MASK), |
| 47 | REGMAP_IRQ_REG(S2MPG10_IRQ_SPD_ABNORMAL_STOP, 2, S2MPG10_IRQ_SPD_ABNORMAL_STOP_MASK), |
| 48 | REGMAP_IRQ_REG(S2MPG10_IRQ_PMETER_OVERF, 2, S2MPG10_IRQ_PMETER_OVERF_MASK), |
| 49 | |
| 50 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B1M, 3, S2MPG10_IRQ_OCP_B1M_MASK), |
| 51 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B2M, 3, S2MPG10_IRQ_OCP_B2M_MASK), |
| 52 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B3M, 3, S2MPG10_IRQ_OCP_B3M_MASK), |
| 53 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B4M, 3, S2MPG10_IRQ_OCP_B4M_MASK), |
| 54 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B5M, 3, S2MPG10_IRQ_OCP_B5M_MASK), |
| 55 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B6M, 3, S2MPG10_IRQ_OCP_B6M_MASK), |
| 56 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B7M, 3, S2MPG10_IRQ_OCP_B7M_MASK), |
| 57 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B8M, 3, S2MPG10_IRQ_OCP_B8M_MASK), |
| 58 | |
| 59 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B9M, 4, S2MPG10_IRQ_OCP_B9M_MASK), |
| 60 | REGMAP_IRQ_REG(S2MPG10_IRQ_OCP_B10M, 4, S2MPG10_IRQ_OCP_B10M_MASK), |
| 61 | REGMAP_IRQ_REG(S2MPG10_IRQ_WLWP_ACC, 4, S2MPG10_IRQ_WLWP_ACC_MASK), |
| 62 | REGMAP_IRQ_REG(S2MPG10_IRQ_SMPL_TIMEOUT, 4, S2MPG10_IRQ_SMPL_TIMEOUT_MASK), |
| 63 | REGMAP_IRQ_REG(S2MPG10_IRQ_WTSR_TIMEOUT, 4, S2MPG10_IRQ_WTSR_TIMEOUT_MASK), |
| 64 | REGMAP_IRQ_REG(S2MPG10_IRQ_SPD_SRP_PKT_RST, 4, S2MPG10_IRQ_SPD_SRP_PKT_RST_MASK), |
| 65 | |
| 66 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH0, 5, S2MPG10_IRQ_PWR_WARN_CH0_MASK), |
| 67 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH1, 5, S2MPG10_IRQ_PWR_WARN_CH1_MASK), |
| 68 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH2, 5, S2MPG10_IRQ_PWR_WARN_CH2_MASK), |
| 69 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH3, 5, S2MPG10_IRQ_PWR_WARN_CH3_MASK), |
| 70 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH4, 5, S2MPG10_IRQ_PWR_WARN_CH4_MASK), |
| 71 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH5, 5, S2MPG10_IRQ_PWR_WARN_CH5_MASK), |
| 72 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH6, 5, S2MPG10_IRQ_PWR_WARN_CH6_MASK), |
| 73 | REGMAP_IRQ_REG(S2MPG10_IRQ_PWR_WARN_CH7, 5, S2MPG10_IRQ_PWR_WARN_CH7_MASK), |
| 74 | }; |
| 75 | |
| 76 | static const struct regmap_irq s2mps11_irqs[] = { |
| 77 | REGMAP_IRQ_REG(S2MPS11_IRQ_PWRONF, 0, S2MPS11_IRQ_PWRONF_MASK), |
| 78 | REGMAP_IRQ_REG(S2MPS11_IRQ_PWRONR, 0, S2MPS11_IRQ_PWRONR_MASK), |
| 79 | REGMAP_IRQ_REG(S2MPS11_IRQ_JIGONBF, 0, S2MPS11_IRQ_JIGONBF_MASK), |
| 80 | REGMAP_IRQ_REG(S2MPS11_IRQ_JIGONBR, 0, S2MPS11_IRQ_JIGONBR_MASK), |
| 81 | REGMAP_IRQ_REG(S2MPS11_IRQ_ACOKBF, 0, S2MPS11_IRQ_ACOKBF_MASK), |
| 82 | REGMAP_IRQ_REG(S2MPS11_IRQ_ACOKBR, 0, S2MPS11_IRQ_ACOKBR_MASK), |
| 83 | REGMAP_IRQ_REG(S2MPS11_IRQ_PWRON1S, 0, S2MPS11_IRQ_PWRON1S_MASK), |
| 84 | REGMAP_IRQ_REG(S2MPS11_IRQ_MRB, 0, S2MPS11_IRQ_MRB_MASK), |
| 85 | |
| 86 | REGMAP_IRQ_REG(S2MPS11_IRQ_RTC60S, 1, S2MPS11_IRQ_RTC60S_MASK), |
| 87 | REGMAP_IRQ_REG(S2MPS11_IRQ_RTCA1, 1, S2MPS11_IRQ_RTCA1_MASK), |
| 88 | REGMAP_IRQ_REG(S2MPS11_IRQ_RTCA0, 1, S2MPS11_IRQ_RTCA0_MASK), |
| 89 | REGMAP_IRQ_REG(S2MPS11_IRQ_SMPL, 1, S2MPS11_IRQ_SMPL_MASK), |
| 90 | REGMAP_IRQ_REG(S2MPS11_IRQ_RTC1S, 1, S2MPS11_IRQ_RTC1S_MASK), |
| 91 | REGMAP_IRQ_REG(S2MPS11_IRQ_WTSR, 1, S2MPS11_IRQ_WTSR_MASK), |
| 92 | |
| 93 | REGMAP_IRQ_REG(S2MPS11_IRQ_INT120C, 2, S2MPS11_IRQ_INT120C_MASK), |
| 94 | REGMAP_IRQ_REG(S2MPS11_IRQ_INT140C, 2, S2MPS11_IRQ_INT140C_MASK), |
| 95 | }; |
| 96 | |
| 97 | static const struct regmap_irq s2mps14_irqs[] = { |
| 98 | REGMAP_IRQ_REG(S2MPS14_IRQ_PWRONF, 0, S2MPS11_IRQ_PWRONF_MASK), |
| 99 | REGMAP_IRQ_REG(S2MPS14_IRQ_PWRONR, 0, S2MPS11_IRQ_PWRONR_MASK), |
| 100 | REGMAP_IRQ_REG(S2MPS14_IRQ_JIGONBF, 0, S2MPS11_IRQ_JIGONBF_MASK), |
| 101 | REGMAP_IRQ_REG(S2MPS14_IRQ_JIGONBR, 0, S2MPS11_IRQ_JIGONBR_MASK), |
| 102 | REGMAP_IRQ_REG(S2MPS14_IRQ_ACOKBF, 0, S2MPS11_IRQ_ACOKBF_MASK), |
| 103 | REGMAP_IRQ_REG(S2MPS14_IRQ_ACOKBR, 0, S2MPS11_IRQ_ACOKBR_MASK), |
| 104 | REGMAP_IRQ_REG(S2MPS14_IRQ_PWRON1S, 0, S2MPS11_IRQ_PWRON1S_MASK), |
| 105 | REGMAP_IRQ_REG(S2MPS14_IRQ_MRB, 0, S2MPS11_IRQ_MRB_MASK), |
| 106 | |
| 107 | REGMAP_IRQ_REG(S2MPS14_IRQ_RTC60S, 1, S2MPS11_IRQ_RTC60S_MASK), |
| 108 | REGMAP_IRQ_REG(S2MPS14_IRQ_RTCA1, 1, S2MPS11_IRQ_RTCA1_MASK), |
| 109 | REGMAP_IRQ_REG(S2MPS14_IRQ_RTCA0, 1, S2MPS11_IRQ_RTCA0_MASK), |
| 110 | REGMAP_IRQ_REG(S2MPS14_IRQ_SMPL, 1, S2MPS11_IRQ_SMPL_MASK), |
| 111 | REGMAP_IRQ_REG(S2MPS14_IRQ_RTC1S, 1, S2MPS11_IRQ_RTC1S_MASK), |
| 112 | REGMAP_IRQ_REG(S2MPS14_IRQ_WTSR, 1, S2MPS11_IRQ_WTSR_MASK), |
| 113 | |
| 114 | REGMAP_IRQ_REG(S2MPS14_IRQ_INT120C, 2, S2MPS11_IRQ_INT120C_MASK), |
| 115 | REGMAP_IRQ_REG(S2MPS14_IRQ_INT140C, 2, S2MPS11_IRQ_INT140C_MASK), |
| 116 | REGMAP_IRQ_REG(S2MPS14_IRQ_TSD, 2, S2MPS14_IRQ_TSD_MASK), |
| 117 | }; |
| 118 | |
| 119 | static const struct regmap_irq s2mpu02_irqs[] = { |
| 120 | REGMAP_IRQ_REG(S2MPU02_IRQ_PWRONF, 0, S2MPS11_IRQ_PWRONF_MASK), |
| 121 | REGMAP_IRQ_REG(S2MPU02_IRQ_PWRONR, 0, S2MPS11_IRQ_PWRONR_MASK), |
| 122 | REGMAP_IRQ_REG(S2MPU02_IRQ_JIGONBF, 0, S2MPS11_IRQ_JIGONBF_MASK), |
| 123 | REGMAP_IRQ_REG(S2MPU02_IRQ_JIGONBR, 0, S2MPS11_IRQ_JIGONBR_MASK), |
| 124 | REGMAP_IRQ_REG(S2MPU02_IRQ_ACOKBF, 0, S2MPS11_IRQ_ACOKBF_MASK), |
| 125 | REGMAP_IRQ_REG(S2MPU02_IRQ_ACOKBR, 0, S2MPS11_IRQ_ACOKBR_MASK), |
| 126 | REGMAP_IRQ_REG(S2MPU02_IRQ_PWRON1S, 0, S2MPS11_IRQ_PWRON1S_MASK), |
| 127 | REGMAP_IRQ_REG(S2MPU02_IRQ_MRB, 0, S2MPS11_IRQ_MRB_MASK), |
| 128 | |
| 129 | REGMAP_IRQ_REG(S2MPU02_IRQ_RTC60S, 1, S2MPS11_IRQ_RTC60S_MASK), |
| 130 | REGMAP_IRQ_REG(S2MPU02_IRQ_RTCA1, 1, S2MPS11_IRQ_RTCA1_MASK), |
| 131 | REGMAP_IRQ_REG(S2MPU02_IRQ_RTCA0, 1, S2MPS11_IRQ_RTCA0_MASK), |
| 132 | REGMAP_IRQ_REG(S2MPU02_IRQ_SMPL, 1, S2MPS11_IRQ_SMPL_MASK), |
| 133 | REGMAP_IRQ_REG(S2MPU02_IRQ_RTC1S, 1, S2MPS11_IRQ_RTC1S_MASK), |
| 134 | REGMAP_IRQ_REG(S2MPU02_IRQ_WTSR, 1, S2MPS11_IRQ_WTSR_MASK), |
| 135 | |
| 136 | REGMAP_IRQ_REG(S2MPU02_IRQ_INT120C, 2, S2MPS11_IRQ_INT120C_MASK), |
| 137 | REGMAP_IRQ_REG(S2MPU02_IRQ_INT140C, 2, S2MPS11_IRQ_INT140C_MASK), |
| 138 | REGMAP_IRQ_REG(S2MPU02_IRQ_TSD, 2, S2MPS14_IRQ_TSD_MASK), |
| 139 | }; |
| 140 | |
| 141 | static const struct regmap_irq s2mpu05_irqs[] = { |
| 142 | REGMAP_IRQ_REG(S2MPU05_IRQ_PWRONF, 0, S2MPU05_IRQ_PWRONF_MASK), |
| 143 | REGMAP_IRQ_REG(S2MPU05_IRQ_PWRONR, 0, S2MPU05_IRQ_PWRONR_MASK), |
| 144 | REGMAP_IRQ_REG(S2MPU05_IRQ_JIGONBF, 0, S2MPU05_IRQ_JIGONBF_MASK), |
| 145 | REGMAP_IRQ_REG(S2MPU05_IRQ_JIGONBR, 0, S2MPU05_IRQ_JIGONBR_MASK), |
| 146 | REGMAP_IRQ_REG(S2MPU05_IRQ_ACOKF, 0, S2MPU05_IRQ_ACOKF_MASK), |
| 147 | REGMAP_IRQ_REG(S2MPU05_IRQ_ACOKR, 0, S2MPU05_IRQ_ACOKR_MASK), |
| 148 | REGMAP_IRQ_REG(S2MPU05_IRQ_PWRON1S, 0, S2MPU05_IRQ_PWRON1S_MASK), |
| 149 | REGMAP_IRQ_REG(S2MPU05_IRQ_MRB, 0, S2MPU05_IRQ_MRB_MASK), |
| 150 | REGMAP_IRQ_REG(S2MPU05_IRQ_RTC60S, 1, S2MPU05_IRQ_RTC60S_MASK), |
| 151 | REGMAP_IRQ_REG(S2MPU05_IRQ_RTCA1, 1, S2MPU05_IRQ_RTCA1_MASK), |
| 152 | REGMAP_IRQ_REG(S2MPU05_IRQ_RTCA0, 1, S2MPU05_IRQ_RTCA0_MASK), |
| 153 | REGMAP_IRQ_REG(S2MPU05_IRQ_SMPL, 1, S2MPU05_IRQ_SMPL_MASK), |
| 154 | REGMAP_IRQ_REG(S2MPU05_IRQ_RTC1S, 1, S2MPU05_IRQ_RTC1S_MASK), |
| 155 | REGMAP_IRQ_REG(S2MPU05_IRQ_WTSR, 1, S2MPU05_IRQ_WTSR_MASK), |
| 156 | REGMAP_IRQ_REG(S2MPU05_IRQ_INT120C, 2, S2MPU05_IRQ_INT120C_MASK), |
| 157 | REGMAP_IRQ_REG(S2MPU05_IRQ_INT140C, 2, S2MPU05_IRQ_INT140C_MASK), |
| 158 | REGMAP_IRQ_REG(S2MPU05_IRQ_TSD, 2, S2MPU05_IRQ_TSD_MASK), |
| 159 | }; |
| 160 | |
| 161 | static const struct regmap_irq s5m8767_irqs[] = { |
| 162 | REGMAP_IRQ_REG(S5M8767_IRQ_PWRR, 0, S5M8767_IRQ_PWRR_MASK), |
| 163 | REGMAP_IRQ_REG(S5M8767_IRQ_PWRF, 0, S5M8767_IRQ_PWRF_MASK), |
| 164 | REGMAP_IRQ_REG(S5M8767_IRQ_PWR1S, 0, S5M8767_IRQ_PWR1S_MASK), |
| 165 | REGMAP_IRQ_REG(S5M8767_IRQ_JIGR, 0, S5M8767_IRQ_JIGR_MASK), |
| 166 | REGMAP_IRQ_REG(S5M8767_IRQ_JIGF, 0, S5M8767_IRQ_JIGF_MASK), |
| 167 | REGMAP_IRQ_REG(S5M8767_IRQ_LOWBAT2, 0, S5M8767_IRQ_LOWBAT2_MASK), |
| 168 | REGMAP_IRQ_REG(S5M8767_IRQ_LOWBAT1, 0, S5M8767_IRQ_LOWBAT1_MASK), |
| 169 | |
| 170 | REGMAP_IRQ_REG(S5M8767_IRQ_MRB, 1, S5M8767_IRQ_MRB_MASK), |
| 171 | REGMAP_IRQ_REG(S5M8767_IRQ_DVSOK2, 1, S5M8767_IRQ_DVSOK2_MASK), |
| 172 | REGMAP_IRQ_REG(S5M8767_IRQ_DVSOK3, 1, S5M8767_IRQ_DVSOK3_MASK), |
| 173 | REGMAP_IRQ_REG(S5M8767_IRQ_DVSOK4, 1, S5M8767_IRQ_DVSOK4_MASK), |
| 174 | |
| 175 | REGMAP_IRQ_REG(S5M8767_IRQ_RTC60S, 2, S5M8767_IRQ_RTC60S_MASK), |
| 176 | REGMAP_IRQ_REG(S5M8767_IRQ_RTCA1, 2, S5M8767_IRQ_RTCA1_MASK), |
| 177 | REGMAP_IRQ_REG(S5M8767_IRQ_RTCA2, 2, S5M8767_IRQ_RTCA2_MASK), |
| 178 | REGMAP_IRQ_REG(S5M8767_IRQ_SMPL, 2, S5M8767_IRQ_SMPL_MASK), |
| 179 | REGMAP_IRQ_REG(S5M8767_IRQ_RTC1S, 2, S5M8767_IRQ_RTC1S_MASK), |
| 180 | REGMAP_IRQ_REG(S5M8767_IRQ_WTSR, 2, S5M8767_IRQ_WTSR_MASK), |
| 181 | }; |
| 182 | |
| 183 | /* All S2MPG10 interrupt sources are read-only and don't require clearing */ |
| 184 | static const struct regmap_irq_chip s2mpg10_irq_chip = { |
| 185 | .name = "s2mpg10", |
| 186 | .irqs = s2mpg10_irqs, |
| 187 | .num_irqs = ARRAY_SIZE(s2mpg10_irqs), |
| 188 | .num_regs = 6, |
| 189 | .status_base = S2MPG10_PMIC_INT1, |
| 190 | .mask_base = S2MPG10_PMIC_INT1M, |
| 191 | }; |
| 192 | |
| 193 | static const struct regmap_irq_chip s2mps11_irq_chip = { |
| 194 | .name = "s2mps11", |
| 195 | .irqs = s2mps11_irqs, |
| 196 | .num_irqs = ARRAY_SIZE(s2mps11_irqs), |
| 197 | .num_regs = 3, |
| 198 | .status_base = S2MPS11_REG_INT1, |
| 199 | .mask_base = S2MPS11_REG_INT1M, |
| 200 | .ack_base = S2MPS11_REG_INT1, |
| 201 | }; |
| 202 | |
| 203 | #define S2MPS1X_IRQ_CHIP_COMMON_DATA \ |
| 204 | .irqs = s2mps14_irqs, \ |
| 205 | .num_irqs = ARRAY_SIZE(s2mps14_irqs), \ |
| 206 | .num_regs = 3, \ |
| 207 | .status_base = S2MPS14_REG_INT1, \ |
| 208 | .mask_base = S2MPS14_REG_INT1M, \ |
| 209 | .ack_base = S2MPS14_REG_INT1 \ |
| 210 | |
| 211 | static const struct regmap_irq_chip s2mps13_irq_chip = { |
| 212 | .name = "s2mps13", |
| 213 | S2MPS1X_IRQ_CHIP_COMMON_DATA, |
| 214 | }; |
| 215 | |
| 216 | static const struct regmap_irq_chip s2mps14_irq_chip = { |
| 217 | .name = "s2mps14", |
| 218 | S2MPS1X_IRQ_CHIP_COMMON_DATA, |
| 219 | }; |
| 220 | |
| 221 | static const struct regmap_irq_chip s2mps15_irq_chip = { |
| 222 | .name = "s2mps15", |
| 223 | S2MPS1X_IRQ_CHIP_COMMON_DATA, |
| 224 | }; |
| 225 | |
| 226 | static const struct regmap_irq_chip s2mpu02_irq_chip = { |
| 227 | .name = "s2mpu02", |
| 228 | .irqs = s2mpu02_irqs, |
| 229 | .num_irqs = ARRAY_SIZE(s2mpu02_irqs), |
| 230 | .num_regs = 3, |
| 231 | .status_base = S2MPU02_REG_INT1, |
| 232 | .mask_base = S2MPU02_REG_INT1M, |
| 233 | .ack_base = S2MPU02_REG_INT1, |
| 234 | }; |
| 235 | |
| 236 | static const struct regmap_irq_chip s2mpu05_irq_chip = { |
| 237 | .name = "s2mpu05", |
| 238 | .irqs = s2mpu05_irqs, |
| 239 | .num_irqs = ARRAY_SIZE(s2mpu05_irqs), |
| 240 | .num_regs = 3, |
| 241 | .status_base = S2MPU05_REG_INT1, |
| 242 | .mask_base = S2MPU05_REG_INT1M, |
| 243 | .ack_base = S2MPU05_REG_INT1, |
| 244 | }; |
| 245 | |
| 246 | static const struct regmap_irq_chip s5m8767_irq_chip = { |
| 247 | .name = "s5m8767", |
| 248 | .irqs = s5m8767_irqs, |
| 249 | .num_irqs = ARRAY_SIZE(s5m8767_irqs), |
| 250 | .num_regs = 3, |
| 251 | .status_base = S5M8767_REG_INT1, |
| 252 | .mask_base = S5M8767_REG_INT1M, |
| 253 | .ack_base = S5M8767_REG_INT1, |
| 254 | }; |
| 255 | |
| 256 | int sec_irq_init(struct sec_pmic_dev *sec_pmic) |
| 257 | { |
| 258 | const struct regmap_irq_chip *sec_irq_chip; |
| 259 | int ret; |
| 260 | |
| 261 | switch (sec_pmic->device_type) { |
| 262 | case S5M8767X: |
| 263 | sec_irq_chip = &s5m8767_irq_chip; |
| 264 | break; |
| 265 | case S2DOS05: |
| 266 | return 0; |
| 267 | case S2MPA01: |
| 268 | sec_irq_chip = &s2mps14_irq_chip; |
| 269 | break; |
| 270 | case S2MPG10: |
| 271 | sec_irq_chip = &s2mpg10_irq_chip; |
| 272 | break; |
| 273 | case S2MPS11X: |
| 274 | sec_irq_chip = &s2mps11_irq_chip; |
| 275 | break; |
| 276 | case S2MPS13X: |
| 277 | sec_irq_chip = &s2mps13_irq_chip; |
| 278 | break; |
| 279 | case S2MPS14X: |
| 280 | sec_irq_chip = &s2mps14_irq_chip; |
| 281 | break; |
| 282 | case S2MPS15X: |
| 283 | sec_irq_chip = &s2mps15_irq_chip; |
| 284 | break; |
| 285 | case S2MPU02: |
| 286 | sec_irq_chip = &s2mpu02_irq_chip; |
| 287 | break; |
| 288 | case S2MPU05: |
| 289 | sec_irq_chip = &s2mpu05_irq_chip; |
| 290 | break; |
| 291 | default: |
| 292 | return dev_err_probe(sec_pmic->dev, -EINVAL, |
| 293 | "Unsupported device type %d\n", |
| 294 | sec_pmic->device_type); |
| 295 | } |
| 296 | |
| 297 | if (!sec_pmic->irq) { |
| 298 | dev_warn(sec_pmic->dev, |
| 299 | "No interrupt specified, no interrupts\n"); |
| 300 | return 0; |
| 301 | } |
| 302 | |
| 303 | ret = devm_regmap_add_irq_chip(sec_pmic->dev, sec_pmic->regmap_pmic, |
| 304 | sec_pmic->irq, IRQF_ONESHOT, |
| 305 | 0, sec_irq_chip, &sec_pmic->irq_data); |
| 306 | if (ret) |
| 307 | return dev_err_probe(sec_pmic->dev, ret, |
| 308 | "Failed to add %s IRQ chip\n", |
| 309 | sec_irq_chip->name); |
| 310 | |
| 311 | /* |
| 312 | * The rtc-s5m driver requests S2MPS14_IRQ_RTCA0 also for S2MPS11 |
| 313 | * so the interrupt number must be consistent. |
| 314 | */ |
| 315 | BUILD_BUG_ON(((enum s2mps14_irq)S2MPS11_IRQ_RTCA0) != S2MPS14_IRQ_RTCA0); |
| 316 | |
| 317 | return 0; |
| 318 | } |