irq-stm32-exti.c (29031B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) Maxime Coquelin 2015 4 * Copyright (C) STMicroelectronics 2017 5 * Author: Maxime Coquelin <mcoquelin.stm32@gmail.com> 6 */ 7 8#include <linux/bitops.h> 9#include <linux/delay.h> 10#include <linux/hwspinlock.h> 11#include <linux/interrupt.h> 12#include <linux/io.h> 13#include <linux/irq.h> 14#include <linux/irqchip.h> 15#include <linux/irqchip/chained_irq.h> 16#include <linux/irqdomain.h> 17#include <linux/module.h> 18#include <linux/of_address.h> 19#include <linux/of_irq.h> 20#include <linux/of_platform.h> 21#include <linux/syscore_ops.h> 22 23#include <dt-bindings/interrupt-controller/arm-gic.h> 24 25#define IRQS_PER_BANK 32 26 27#define HWSPNLCK_TIMEOUT 1000 /* usec */ 28 29struct stm32_exti_bank { 30 u32 imr_ofst; 31 u32 emr_ofst; 32 u32 rtsr_ofst; 33 u32 ftsr_ofst; 34 u32 swier_ofst; 35 u32 rpr_ofst; 36 u32 fpr_ofst; 37}; 38 39#define UNDEF_REG ~0 40 41struct stm32_desc_irq { 42 u32 exti; 43 u32 irq_parent; 44 struct irq_chip *chip; 45}; 46 47struct stm32_exti_drv_data { 48 const struct stm32_exti_bank **exti_banks; 49 const struct stm32_desc_irq *desc_irqs; 50 u32 bank_nr; 51 u32 irq_nr; 52}; 53 54struct stm32_exti_chip_data { 55 struct stm32_exti_host_data *host_data; 56 const struct stm32_exti_bank *reg_bank; 57 struct raw_spinlock rlock; 58 u32 wake_active; 59 u32 mask_cache; 60 u32 rtsr_cache; 61 u32 ftsr_cache; 62}; 63 64struct stm32_exti_host_data { 65 void __iomem *base; 66 struct stm32_exti_chip_data *chips_data; 67 const struct stm32_exti_drv_data *drv_data; 68 struct hwspinlock *hwlock; 69}; 70 71static struct stm32_exti_host_data *stm32_host_data; 72 73static const struct stm32_exti_bank stm32f4xx_exti_b1 = { 74 .imr_ofst = 0x00, 75 .emr_ofst = 0x04, 76 .rtsr_ofst = 0x08, 77 .ftsr_ofst = 0x0C, 78 .swier_ofst = 0x10, 79 .rpr_ofst = 0x14, 80 .fpr_ofst = UNDEF_REG, 81}; 82 83static const struct stm32_exti_bank *stm32f4xx_exti_banks[] = { 84 &stm32f4xx_exti_b1, 85}; 86 87static const struct stm32_exti_drv_data stm32f4xx_drv_data = { 88 .exti_banks = stm32f4xx_exti_banks, 89 .bank_nr = ARRAY_SIZE(stm32f4xx_exti_banks), 90}; 91 92static const struct stm32_exti_bank stm32h7xx_exti_b1 = { 93 .imr_ofst = 0x80, 94 .emr_ofst = 0x84, 95 .rtsr_ofst = 0x00, 96 .ftsr_ofst = 0x04, 97 .swier_ofst = 0x08, 98 .rpr_ofst = 0x88, 99 .fpr_ofst = UNDEF_REG, 100}; 101 102static const struct stm32_exti_bank stm32h7xx_exti_b2 = { 103 .imr_ofst = 0x90, 104 .emr_ofst = 0x94, 105 .rtsr_ofst = 0x20, 106 .ftsr_ofst = 0x24, 107 .swier_ofst = 0x28, 108 .rpr_ofst = 0x98, 109 .fpr_ofst = UNDEF_REG, 110}; 111 112static const struct stm32_exti_bank stm32h7xx_exti_b3 = { 113 .imr_ofst = 0xA0, 114 .emr_ofst = 0xA4, 115 .rtsr_ofst = 0x40, 116 .ftsr_ofst = 0x44, 117 .swier_ofst = 0x48, 118 .rpr_ofst = 0xA8, 119 .fpr_ofst = UNDEF_REG, 120}; 121 122static const struct stm32_exti_bank *stm32h7xx_exti_banks[] = { 123 &stm32h7xx_exti_b1, 124 &stm32h7xx_exti_b2, 125 &stm32h7xx_exti_b3, 126}; 127 128static const struct stm32_exti_drv_data stm32h7xx_drv_data = { 129 .exti_banks = stm32h7xx_exti_banks, 130 .bank_nr = ARRAY_SIZE(stm32h7xx_exti_banks), 131}; 132 133static const struct stm32_exti_bank stm32mp1_exti_b1 = { 134 .imr_ofst = 0x80, 135 .emr_ofst = 0x84, 136 .rtsr_ofst = 0x00, 137 .ftsr_ofst = 0x04, 138 .swier_ofst = 0x08, 139 .rpr_ofst = 0x0C, 140 .fpr_ofst = 0x10, 141}; 142 143static const struct stm32_exti_bank stm32mp1_exti_b2 = { 144 .imr_ofst = 0x90, 145 .emr_ofst = 0x94, 146 .rtsr_ofst = 0x20, 147 .ftsr_ofst = 0x24, 148 .swier_ofst = 0x28, 149 .rpr_ofst = 0x2C, 150 .fpr_ofst = 0x30, 151}; 152 153static const struct stm32_exti_bank stm32mp1_exti_b3 = { 154 .imr_ofst = 0xA0, 155 .emr_ofst = 0xA4, 156 .rtsr_ofst = 0x40, 157 .ftsr_ofst = 0x44, 158 .swier_ofst = 0x48, 159 .rpr_ofst = 0x4C, 160 .fpr_ofst = 0x50, 161}; 162 163static const struct stm32_exti_bank *stm32mp1_exti_banks[] = { 164 &stm32mp1_exti_b1, 165 &stm32mp1_exti_b2, 166 &stm32mp1_exti_b3, 167}; 168 169static struct irq_chip stm32_exti_h_chip; 170static struct irq_chip stm32_exti_h_chip_direct; 171 172static const struct stm32_desc_irq stm32mp1_desc_irq[] = { 173 { .exti = 0, .irq_parent = 6, .chip = &stm32_exti_h_chip }, 174 { .exti = 1, .irq_parent = 7, .chip = &stm32_exti_h_chip }, 175 { .exti = 2, .irq_parent = 8, .chip = &stm32_exti_h_chip }, 176 { .exti = 3, .irq_parent = 9, .chip = &stm32_exti_h_chip }, 177 { .exti = 4, .irq_parent = 10, .chip = &stm32_exti_h_chip }, 178 { .exti = 5, .irq_parent = 23, .chip = &stm32_exti_h_chip }, 179 { .exti = 6, .irq_parent = 64, .chip = &stm32_exti_h_chip }, 180 { .exti = 7, .irq_parent = 65, .chip = &stm32_exti_h_chip }, 181 { .exti = 8, .irq_parent = 66, .chip = &stm32_exti_h_chip }, 182 { .exti = 9, .irq_parent = 67, .chip = &stm32_exti_h_chip }, 183 { .exti = 10, .irq_parent = 40, .chip = &stm32_exti_h_chip }, 184 { .exti = 11, .irq_parent = 42, .chip = &stm32_exti_h_chip }, 185 { .exti = 12, .irq_parent = 76, .chip = &stm32_exti_h_chip }, 186 { .exti = 13, .irq_parent = 77, .chip = &stm32_exti_h_chip }, 187 { .exti = 14, .irq_parent = 121, .chip = &stm32_exti_h_chip }, 188 { .exti = 15, .irq_parent = 127, .chip = &stm32_exti_h_chip }, 189 { .exti = 16, .irq_parent = 1, .chip = &stm32_exti_h_chip }, 190 { .exti = 19, .irq_parent = 3, .chip = &stm32_exti_h_chip_direct }, 191 { .exti = 21, .irq_parent = 31, .chip = &stm32_exti_h_chip_direct }, 192 { .exti = 22, .irq_parent = 33, .chip = &stm32_exti_h_chip_direct }, 193 { .exti = 23, .irq_parent = 72, .chip = &stm32_exti_h_chip_direct }, 194 { .exti = 24, .irq_parent = 95, .chip = &stm32_exti_h_chip_direct }, 195 { .exti = 25, .irq_parent = 107, .chip = &stm32_exti_h_chip_direct }, 196 { .exti = 26, .irq_parent = 37, .chip = &stm32_exti_h_chip_direct }, 197 { .exti = 27, .irq_parent = 38, .chip = &stm32_exti_h_chip_direct }, 198 { .exti = 28, .irq_parent = 39, .chip = &stm32_exti_h_chip_direct }, 199 { .exti = 29, .irq_parent = 71, .chip = &stm32_exti_h_chip_direct }, 200 { .exti = 30, .irq_parent = 52, .chip = &stm32_exti_h_chip_direct }, 201 { .exti = 31, .irq_parent = 53, .chip = &stm32_exti_h_chip_direct }, 202 { .exti = 32, .irq_parent = 82, .chip = &stm32_exti_h_chip_direct }, 203 { .exti = 33, .irq_parent = 83, .chip = &stm32_exti_h_chip_direct }, 204 { .exti = 47, .irq_parent = 93, .chip = &stm32_exti_h_chip_direct }, 205 { .exti = 48, .irq_parent = 138, .chip = &stm32_exti_h_chip_direct }, 206 { .exti = 50, .irq_parent = 139, .chip = &stm32_exti_h_chip_direct }, 207 { .exti = 52, .irq_parent = 140, .chip = &stm32_exti_h_chip_direct }, 208 { .exti = 53, .irq_parent = 141, .chip = &stm32_exti_h_chip_direct }, 209 { .exti = 54, .irq_parent = 135, .chip = &stm32_exti_h_chip_direct }, 210 { .exti = 61, .irq_parent = 100, .chip = &stm32_exti_h_chip_direct }, 211 { .exti = 65, .irq_parent = 144, .chip = &stm32_exti_h_chip }, 212 { .exti = 68, .irq_parent = 143, .chip = &stm32_exti_h_chip }, 213 { .exti = 70, .irq_parent = 62, .chip = &stm32_exti_h_chip_direct }, 214 { .exti = 73, .irq_parent = 129, .chip = &stm32_exti_h_chip }, 215}; 216 217static const struct stm32_desc_irq stm32mp13_desc_irq[] = { 218 { .exti = 0, .irq_parent = 6, .chip = &stm32_exti_h_chip }, 219 { .exti = 1, .irq_parent = 7, .chip = &stm32_exti_h_chip }, 220 { .exti = 2, .irq_parent = 8, .chip = &stm32_exti_h_chip }, 221 { .exti = 3, .irq_parent = 9, .chip = &stm32_exti_h_chip }, 222 { .exti = 4, .irq_parent = 10, .chip = &stm32_exti_h_chip }, 223 { .exti = 5, .irq_parent = 24, .chip = &stm32_exti_h_chip }, 224 { .exti = 6, .irq_parent = 65, .chip = &stm32_exti_h_chip }, 225 { .exti = 7, .irq_parent = 66, .chip = &stm32_exti_h_chip }, 226 { .exti = 8, .irq_parent = 67, .chip = &stm32_exti_h_chip }, 227 { .exti = 9, .irq_parent = 68, .chip = &stm32_exti_h_chip }, 228 { .exti = 10, .irq_parent = 41, .chip = &stm32_exti_h_chip }, 229 { .exti = 11, .irq_parent = 43, .chip = &stm32_exti_h_chip }, 230 { .exti = 12, .irq_parent = 77, .chip = &stm32_exti_h_chip }, 231 { .exti = 13, .irq_parent = 78, .chip = &stm32_exti_h_chip }, 232 { .exti = 14, .irq_parent = 106, .chip = &stm32_exti_h_chip }, 233 { .exti = 15, .irq_parent = 109, .chip = &stm32_exti_h_chip }, 234 { .exti = 16, .irq_parent = 1, .chip = &stm32_exti_h_chip }, 235 { .exti = 19, .irq_parent = 3, .chip = &stm32_exti_h_chip_direct }, 236 { .exti = 21, .irq_parent = 32, .chip = &stm32_exti_h_chip_direct }, 237 { .exti = 22, .irq_parent = 34, .chip = &stm32_exti_h_chip_direct }, 238 { .exti = 23, .irq_parent = 73, .chip = &stm32_exti_h_chip_direct }, 239 { .exti = 24, .irq_parent = 93, .chip = &stm32_exti_h_chip_direct }, 240 { .exti = 25, .irq_parent = 114, .chip = &stm32_exti_h_chip_direct }, 241 { .exti = 26, .irq_parent = 38, .chip = &stm32_exti_h_chip_direct }, 242 { .exti = 27, .irq_parent = 39, .chip = &stm32_exti_h_chip_direct }, 243 { .exti = 28, .irq_parent = 40, .chip = &stm32_exti_h_chip_direct }, 244 { .exti = 29, .irq_parent = 72, .chip = &stm32_exti_h_chip_direct }, 245 { .exti = 30, .irq_parent = 53, .chip = &stm32_exti_h_chip_direct }, 246 { .exti = 31, .irq_parent = 54, .chip = &stm32_exti_h_chip_direct }, 247 { .exti = 32, .irq_parent = 83, .chip = &stm32_exti_h_chip_direct }, 248 { .exti = 33, .irq_parent = 84, .chip = &stm32_exti_h_chip_direct }, 249 { .exti = 44, .irq_parent = 96, .chip = &stm32_exti_h_chip_direct }, 250 { .exti = 47, .irq_parent = 92, .chip = &stm32_exti_h_chip_direct }, 251 { .exti = 48, .irq_parent = 116, .chip = &stm32_exti_h_chip_direct }, 252 { .exti = 50, .irq_parent = 117, .chip = &stm32_exti_h_chip_direct }, 253 { .exti = 52, .irq_parent = 118, .chip = &stm32_exti_h_chip_direct }, 254 { .exti = 53, .irq_parent = 119, .chip = &stm32_exti_h_chip_direct }, 255 { .exti = 68, .irq_parent = 63, .chip = &stm32_exti_h_chip_direct }, 256 { .exti = 70, .irq_parent = 98, .chip = &stm32_exti_h_chip_direct }, 257}; 258 259static const struct stm32_exti_drv_data stm32mp1_drv_data = { 260 .exti_banks = stm32mp1_exti_banks, 261 .bank_nr = ARRAY_SIZE(stm32mp1_exti_banks), 262 .desc_irqs = stm32mp1_desc_irq, 263 .irq_nr = ARRAY_SIZE(stm32mp1_desc_irq), 264}; 265 266static const struct stm32_exti_drv_data stm32mp13_drv_data = { 267 .exti_banks = stm32mp1_exti_banks, 268 .bank_nr = ARRAY_SIZE(stm32mp1_exti_banks), 269 .desc_irqs = stm32mp13_desc_irq, 270 .irq_nr = ARRAY_SIZE(stm32mp13_desc_irq), 271}; 272 273static const struct 274stm32_desc_irq *stm32_exti_get_desc(const struct stm32_exti_drv_data *drv_data, 275 irq_hw_number_t hwirq) 276{ 277 const struct stm32_desc_irq *desc = NULL; 278 int i; 279 280 if (!drv_data->desc_irqs) 281 return NULL; 282 283 for (i = 0; i < drv_data->irq_nr; i++) { 284 desc = &drv_data->desc_irqs[i]; 285 if (desc->exti == hwirq) 286 break; 287 } 288 289 return desc; 290} 291 292static unsigned long stm32_exti_pending(struct irq_chip_generic *gc) 293{ 294 struct stm32_exti_chip_data *chip_data = gc->private; 295 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 296 unsigned long pending; 297 298 pending = irq_reg_readl(gc, stm32_bank->rpr_ofst); 299 if (stm32_bank->fpr_ofst != UNDEF_REG) 300 pending |= irq_reg_readl(gc, stm32_bank->fpr_ofst); 301 302 return pending; 303} 304 305static void stm32_irq_handler(struct irq_desc *desc) 306{ 307 struct irq_domain *domain = irq_desc_get_handler_data(desc); 308 struct irq_chip *chip = irq_desc_get_chip(desc); 309 unsigned int nbanks = domain->gc->num_chips; 310 struct irq_chip_generic *gc; 311 unsigned long pending; 312 int n, i, irq_base = 0; 313 314 chained_irq_enter(chip, desc); 315 316 for (i = 0; i < nbanks; i++, irq_base += IRQS_PER_BANK) { 317 gc = irq_get_domain_generic_chip(domain, irq_base); 318 319 while ((pending = stm32_exti_pending(gc))) { 320 for_each_set_bit(n, &pending, IRQS_PER_BANK) 321 generic_handle_domain_irq(domain, irq_base + n); 322 } 323 } 324 325 chained_irq_exit(chip, desc); 326} 327 328static int stm32_exti_set_type(struct irq_data *d, 329 unsigned int type, u32 *rtsr, u32 *ftsr) 330{ 331 u32 mask = BIT(d->hwirq % IRQS_PER_BANK); 332 333 switch (type) { 334 case IRQ_TYPE_EDGE_RISING: 335 *rtsr |= mask; 336 *ftsr &= ~mask; 337 break; 338 case IRQ_TYPE_EDGE_FALLING: 339 *rtsr &= ~mask; 340 *ftsr |= mask; 341 break; 342 case IRQ_TYPE_EDGE_BOTH: 343 *rtsr |= mask; 344 *ftsr |= mask; 345 break; 346 default: 347 return -EINVAL; 348 } 349 350 return 0; 351} 352 353static int stm32_irq_set_type(struct irq_data *d, unsigned int type) 354{ 355 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); 356 struct stm32_exti_chip_data *chip_data = gc->private; 357 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 358 struct hwspinlock *hwlock = chip_data->host_data->hwlock; 359 u32 rtsr, ftsr; 360 int err; 361 362 irq_gc_lock(gc); 363 364 if (hwlock) { 365 err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT); 366 if (err) { 367 pr_err("%s can't get hwspinlock (%d)\n", __func__, err); 368 goto unlock; 369 } 370 } 371 372 rtsr = irq_reg_readl(gc, stm32_bank->rtsr_ofst); 373 ftsr = irq_reg_readl(gc, stm32_bank->ftsr_ofst); 374 375 err = stm32_exti_set_type(d, type, &rtsr, &ftsr); 376 if (err) 377 goto unspinlock; 378 379 irq_reg_writel(gc, rtsr, stm32_bank->rtsr_ofst); 380 irq_reg_writel(gc, ftsr, stm32_bank->ftsr_ofst); 381 382unspinlock: 383 if (hwlock) 384 hwspin_unlock_in_atomic(hwlock); 385unlock: 386 irq_gc_unlock(gc); 387 388 return err; 389} 390 391static void stm32_chip_suspend(struct stm32_exti_chip_data *chip_data, 392 u32 wake_active) 393{ 394 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 395 void __iomem *base = chip_data->host_data->base; 396 397 /* save rtsr, ftsr registers */ 398 chip_data->rtsr_cache = readl_relaxed(base + stm32_bank->rtsr_ofst); 399 chip_data->ftsr_cache = readl_relaxed(base + stm32_bank->ftsr_ofst); 400 401 writel_relaxed(wake_active, base + stm32_bank->imr_ofst); 402} 403 404static void stm32_chip_resume(struct stm32_exti_chip_data *chip_data, 405 u32 mask_cache) 406{ 407 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 408 void __iomem *base = chip_data->host_data->base; 409 410 /* restore rtsr, ftsr, registers */ 411 writel_relaxed(chip_data->rtsr_cache, base + stm32_bank->rtsr_ofst); 412 writel_relaxed(chip_data->ftsr_cache, base + stm32_bank->ftsr_ofst); 413 414 writel_relaxed(mask_cache, base + stm32_bank->imr_ofst); 415} 416 417static void stm32_irq_suspend(struct irq_chip_generic *gc) 418{ 419 struct stm32_exti_chip_data *chip_data = gc->private; 420 421 irq_gc_lock(gc); 422 stm32_chip_suspend(chip_data, gc->wake_active); 423 irq_gc_unlock(gc); 424} 425 426static void stm32_irq_resume(struct irq_chip_generic *gc) 427{ 428 struct stm32_exti_chip_data *chip_data = gc->private; 429 430 irq_gc_lock(gc); 431 stm32_chip_resume(chip_data, gc->mask_cache); 432 irq_gc_unlock(gc); 433} 434 435static int stm32_exti_alloc(struct irq_domain *d, unsigned int virq, 436 unsigned int nr_irqs, void *data) 437{ 438 struct irq_fwspec *fwspec = data; 439 irq_hw_number_t hwirq; 440 441 hwirq = fwspec->param[0]; 442 443 irq_map_generic_chip(d, virq, hwirq); 444 445 return 0; 446} 447 448static void stm32_exti_free(struct irq_domain *d, unsigned int virq, 449 unsigned int nr_irqs) 450{ 451 struct irq_data *data = irq_domain_get_irq_data(d, virq); 452 453 irq_domain_reset_irq_data(data); 454} 455 456static const struct irq_domain_ops irq_exti_domain_ops = { 457 .map = irq_map_generic_chip, 458 .alloc = stm32_exti_alloc, 459 .free = stm32_exti_free, 460}; 461 462static void stm32_irq_ack(struct irq_data *d) 463{ 464 struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d); 465 struct stm32_exti_chip_data *chip_data = gc->private; 466 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 467 468 irq_gc_lock(gc); 469 470 irq_reg_writel(gc, d->mask, stm32_bank->rpr_ofst); 471 if (stm32_bank->fpr_ofst != UNDEF_REG) 472 irq_reg_writel(gc, d->mask, stm32_bank->fpr_ofst); 473 474 irq_gc_unlock(gc); 475} 476 477/* directly set the target bit without reading first. */ 478static inline void stm32_exti_write_bit(struct irq_data *d, u32 reg) 479{ 480 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 481 void __iomem *base = chip_data->host_data->base; 482 u32 val = BIT(d->hwirq % IRQS_PER_BANK); 483 484 writel_relaxed(val, base + reg); 485} 486 487static inline u32 stm32_exti_set_bit(struct irq_data *d, u32 reg) 488{ 489 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 490 void __iomem *base = chip_data->host_data->base; 491 u32 val; 492 493 val = readl_relaxed(base + reg); 494 val |= BIT(d->hwirq % IRQS_PER_BANK); 495 writel_relaxed(val, base + reg); 496 497 return val; 498} 499 500static inline u32 stm32_exti_clr_bit(struct irq_data *d, u32 reg) 501{ 502 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 503 void __iomem *base = chip_data->host_data->base; 504 u32 val; 505 506 val = readl_relaxed(base + reg); 507 val &= ~BIT(d->hwirq % IRQS_PER_BANK); 508 writel_relaxed(val, base + reg); 509 510 return val; 511} 512 513static void stm32_exti_h_eoi(struct irq_data *d) 514{ 515 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 516 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 517 518 raw_spin_lock(&chip_data->rlock); 519 520 stm32_exti_write_bit(d, stm32_bank->rpr_ofst); 521 if (stm32_bank->fpr_ofst != UNDEF_REG) 522 stm32_exti_write_bit(d, stm32_bank->fpr_ofst); 523 524 raw_spin_unlock(&chip_data->rlock); 525 526 if (d->parent_data->chip) 527 irq_chip_eoi_parent(d); 528} 529 530static void stm32_exti_h_mask(struct irq_data *d) 531{ 532 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 533 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 534 535 raw_spin_lock(&chip_data->rlock); 536 chip_data->mask_cache = stm32_exti_clr_bit(d, stm32_bank->imr_ofst); 537 raw_spin_unlock(&chip_data->rlock); 538 539 if (d->parent_data->chip) 540 irq_chip_mask_parent(d); 541} 542 543static void stm32_exti_h_unmask(struct irq_data *d) 544{ 545 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 546 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 547 548 raw_spin_lock(&chip_data->rlock); 549 chip_data->mask_cache = stm32_exti_set_bit(d, stm32_bank->imr_ofst); 550 raw_spin_unlock(&chip_data->rlock); 551 552 if (d->parent_data->chip) 553 irq_chip_unmask_parent(d); 554} 555 556static int stm32_exti_h_set_type(struct irq_data *d, unsigned int type) 557{ 558 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 559 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 560 struct hwspinlock *hwlock = chip_data->host_data->hwlock; 561 void __iomem *base = chip_data->host_data->base; 562 u32 rtsr, ftsr; 563 int err; 564 565 raw_spin_lock(&chip_data->rlock); 566 567 if (hwlock) { 568 err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT); 569 if (err) { 570 pr_err("%s can't get hwspinlock (%d)\n", __func__, err); 571 goto unlock; 572 } 573 } 574 575 rtsr = readl_relaxed(base + stm32_bank->rtsr_ofst); 576 ftsr = readl_relaxed(base + stm32_bank->ftsr_ofst); 577 578 err = stm32_exti_set_type(d, type, &rtsr, &ftsr); 579 if (err) 580 goto unspinlock; 581 582 writel_relaxed(rtsr, base + stm32_bank->rtsr_ofst); 583 writel_relaxed(ftsr, base + stm32_bank->ftsr_ofst); 584 585unspinlock: 586 if (hwlock) 587 hwspin_unlock_in_atomic(hwlock); 588unlock: 589 raw_spin_unlock(&chip_data->rlock); 590 591 return err; 592} 593 594static int stm32_exti_h_set_wake(struct irq_data *d, unsigned int on) 595{ 596 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 597 u32 mask = BIT(d->hwirq % IRQS_PER_BANK); 598 599 raw_spin_lock(&chip_data->rlock); 600 601 if (on) 602 chip_data->wake_active |= mask; 603 else 604 chip_data->wake_active &= ~mask; 605 606 raw_spin_unlock(&chip_data->rlock); 607 608 return 0; 609} 610 611static int stm32_exti_h_set_affinity(struct irq_data *d, 612 const struct cpumask *dest, bool force) 613{ 614 if (d->parent_data->chip) 615 return irq_chip_set_affinity_parent(d, dest, force); 616 617 return -EINVAL; 618} 619 620static int __maybe_unused stm32_exti_h_suspend(void) 621{ 622 struct stm32_exti_chip_data *chip_data; 623 int i; 624 625 for (i = 0; i < stm32_host_data->drv_data->bank_nr; i++) { 626 chip_data = &stm32_host_data->chips_data[i]; 627 raw_spin_lock(&chip_data->rlock); 628 stm32_chip_suspend(chip_data, chip_data->wake_active); 629 raw_spin_unlock(&chip_data->rlock); 630 } 631 632 return 0; 633} 634 635static void __maybe_unused stm32_exti_h_resume(void) 636{ 637 struct stm32_exti_chip_data *chip_data; 638 int i; 639 640 for (i = 0; i < stm32_host_data->drv_data->bank_nr; i++) { 641 chip_data = &stm32_host_data->chips_data[i]; 642 raw_spin_lock(&chip_data->rlock); 643 stm32_chip_resume(chip_data, chip_data->mask_cache); 644 raw_spin_unlock(&chip_data->rlock); 645 } 646} 647 648static struct syscore_ops stm32_exti_h_syscore_ops = { 649#ifdef CONFIG_PM_SLEEP 650 .suspend = stm32_exti_h_suspend, 651 .resume = stm32_exti_h_resume, 652#endif 653}; 654 655static void stm32_exti_h_syscore_init(struct stm32_exti_host_data *host_data) 656{ 657 stm32_host_data = host_data; 658 register_syscore_ops(&stm32_exti_h_syscore_ops); 659} 660 661static void stm32_exti_h_syscore_deinit(void) 662{ 663 unregister_syscore_ops(&stm32_exti_h_syscore_ops); 664} 665 666static int stm32_exti_h_retrigger(struct irq_data *d) 667{ 668 struct stm32_exti_chip_data *chip_data = irq_data_get_irq_chip_data(d); 669 const struct stm32_exti_bank *stm32_bank = chip_data->reg_bank; 670 void __iomem *base = chip_data->host_data->base; 671 u32 mask = BIT(d->hwirq % IRQS_PER_BANK); 672 673 writel_relaxed(mask, base + stm32_bank->swier_ofst); 674 675 return 0; 676} 677 678static struct irq_chip stm32_exti_h_chip = { 679 .name = "stm32-exti-h", 680 .irq_eoi = stm32_exti_h_eoi, 681 .irq_mask = stm32_exti_h_mask, 682 .irq_unmask = stm32_exti_h_unmask, 683 .irq_retrigger = stm32_exti_h_retrigger, 684 .irq_set_type = stm32_exti_h_set_type, 685 .irq_set_wake = stm32_exti_h_set_wake, 686 .flags = IRQCHIP_MASK_ON_SUSPEND, 687 .irq_set_affinity = IS_ENABLED(CONFIG_SMP) ? stm32_exti_h_set_affinity : NULL, 688}; 689 690static struct irq_chip stm32_exti_h_chip_direct = { 691 .name = "stm32-exti-h-direct", 692 .irq_eoi = irq_chip_eoi_parent, 693 .irq_ack = irq_chip_ack_parent, 694 .irq_mask = irq_chip_mask_parent, 695 .irq_unmask = irq_chip_unmask_parent, 696 .irq_retrigger = irq_chip_retrigger_hierarchy, 697 .irq_set_type = irq_chip_set_type_parent, 698 .irq_set_wake = stm32_exti_h_set_wake, 699 .flags = IRQCHIP_MASK_ON_SUSPEND, 700 .irq_set_affinity = IS_ENABLED(CONFIG_SMP) ? irq_chip_set_affinity_parent : NULL, 701}; 702 703static int stm32_exti_h_domain_alloc(struct irq_domain *dm, 704 unsigned int virq, 705 unsigned int nr_irqs, void *data) 706{ 707 struct stm32_exti_host_data *host_data = dm->host_data; 708 struct stm32_exti_chip_data *chip_data; 709 const struct stm32_desc_irq *desc; 710 struct irq_fwspec *fwspec = data; 711 struct irq_fwspec p_fwspec; 712 irq_hw_number_t hwirq; 713 int bank; 714 715 hwirq = fwspec->param[0]; 716 bank = hwirq / IRQS_PER_BANK; 717 chip_data = &host_data->chips_data[bank]; 718 719 720 desc = stm32_exti_get_desc(host_data->drv_data, hwirq); 721 if (!desc) 722 return -EINVAL; 723 724 irq_domain_set_hwirq_and_chip(dm, virq, hwirq, desc->chip, 725 chip_data); 726 if (desc->irq_parent) { 727 p_fwspec.fwnode = dm->parent->fwnode; 728 p_fwspec.param_count = 3; 729 p_fwspec.param[0] = GIC_SPI; 730 p_fwspec.param[1] = desc->irq_parent; 731 p_fwspec.param[2] = IRQ_TYPE_LEVEL_HIGH; 732 733 return irq_domain_alloc_irqs_parent(dm, virq, 1, &p_fwspec); 734 } 735 736 return 0; 737} 738 739static struct 740stm32_exti_host_data *stm32_exti_host_init(const struct stm32_exti_drv_data *dd, 741 struct device_node *node) 742{ 743 struct stm32_exti_host_data *host_data; 744 745 host_data = kzalloc(sizeof(*host_data), GFP_KERNEL); 746 if (!host_data) 747 return NULL; 748 749 host_data->drv_data = dd; 750 host_data->chips_data = kcalloc(dd->bank_nr, 751 sizeof(struct stm32_exti_chip_data), 752 GFP_KERNEL); 753 if (!host_data->chips_data) 754 goto free_host_data; 755 756 host_data->base = of_iomap(node, 0); 757 if (!host_data->base) { 758 pr_err("%pOF: Unable to map registers\n", node); 759 goto free_chips_data; 760 } 761 762 stm32_host_data = host_data; 763 764 return host_data; 765 766free_chips_data: 767 kfree(host_data->chips_data); 768free_host_data: 769 kfree(host_data); 770 771 return NULL; 772} 773 774static struct 775stm32_exti_chip_data *stm32_exti_chip_init(struct stm32_exti_host_data *h_data, 776 u32 bank_idx, 777 struct device_node *node) 778{ 779 const struct stm32_exti_bank *stm32_bank; 780 struct stm32_exti_chip_data *chip_data; 781 void __iomem *base = h_data->base; 782 783 stm32_bank = h_data->drv_data->exti_banks[bank_idx]; 784 chip_data = &h_data->chips_data[bank_idx]; 785 chip_data->host_data = h_data; 786 chip_data->reg_bank = stm32_bank; 787 788 raw_spin_lock_init(&chip_data->rlock); 789 790 /* 791 * This IP has no reset, so after hot reboot we should 792 * clear registers to avoid residue 793 */ 794 writel_relaxed(0, base + stm32_bank->imr_ofst); 795 writel_relaxed(0, base + stm32_bank->emr_ofst); 796 797 pr_info("%pOF: bank%d\n", node, bank_idx); 798 799 return chip_data; 800} 801 802static int __init stm32_exti_init(const struct stm32_exti_drv_data *drv_data, 803 struct device_node *node) 804{ 805 struct stm32_exti_host_data *host_data; 806 unsigned int clr = IRQ_NOREQUEST | IRQ_NOPROBE | IRQ_NOAUTOEN; 807 int nr_irqs, ret, i; 808 struct irq_chip_generic *gc; 809 struct irq_domain *domain; 810 811 host_data = stm32_exti_host_init(drv_data, node); 812 if (!host_data) 813 return -ENOMEM; 814 815 domain = irq_domain_add_linear(node, drv_data->bank_nr * IRQS_PER_BANK, 816 &irq_exti_domain_ops, NULL); 817 if (!domain) { 818 pr_err("%pOFn: Could not register interrupt domain.\n", 819 node); 820 ret = -ENOMEM; 821 goto out_unmap; 822 } 823 824 ret = irq_alloc_domain_generic_chips(domain, IRQS_PER_BANK, 1, "exti", 825 handle_edge_irq, clr, 0, 0); 826 if (ret) { 827 pr_err("%pOF: Could not allocate generic interrupt chip.\n", 828 node); 829 goto out_free_domain; 830 } 831 832 for (i = 0; i < drv_data->bank_nr; i++) { 833 const struct stm32_exti_bank *stm32_bank; 834 struct stm32_exti_chip_data *chip_data; 835 836 stm32_bank = drv_data->exti_banks[i]; 837 chip_data = stm32_exti_chip_init(host_data, i, node); 838 839 gc = irq_get_domain_generic_chip(domain, i * IRQS_PER_BANK); 840 841 gc->reg_base = host_data->base; 842 gc->chip_types->type = IRQ_TYPE_EDGE_BOTH; 843 gc->chip_types->chip.irq_ack = stm32_irq_ack; 844 gc->chip_types->chip.irq_mask = irq_gc_mask_clr_bit; 845 gc->chip_types->chip.irq_unmask = irq_gc_mask_set_bit; 846 gc->chip_types->chip.irq_set_type = stm32_irq_set_type; 847 gc->chip_types->chip.irq_set_wake = irq_gc_set_wake; 848 gc->suspend = stm32_irq_suspend; 849 gc->resume = stm32_irq_resume; 850 gc->wake_enabled = IRQ_MSK(IRQS_PER_BANK); 851 852 gc->chip_types->regs.mask = stm32_bank->imr_ofst; 853 gc->private = (void *)chip_data; 854 } 855 856 nr_irqs = of_irq_count(node); 857 for (i = 0; i < nr_irqs; i++) { 858 unsigned int irq = irq_of_parse_and_map(node, i); 859 860 irq_set_handler_data(irq, domain); 861 irq_set_chained_handler(irq, stm32_irq_handler); 862 } 863 864 return 0; 865 866out_free_domain: 867 irq_domain_remove(domain); 868out_unmap: 869 iounmap(host_data->base); 870 kfree(host_data->chips_data); 871 kfree(host_data); 872 return ret; 873} 874 875static const struct irq_domain_ops stm32_exti_h_domain_ops = { 876 .alloc = stm32_exti_h_domain_alloc, 877 .free = irq_domain_free_irqs_common, 878 .xlate = irq_domain_xlate_twocell, 879}; 880 881static void stm32_exti_remove_irq(void *data) 882{ 883 struct irq_domain *domain = data; 884 885 irq_domain_remove(domain); 886} 887 888static int stm32_exti_remove(struct platform_device *pdev) 889{ 890 stm32_exti_h_syscore_deinit(); 891 return 0; 892} 893 894static int stm32_exti_probe(struct platform_device *pdev) 895{ 896 int ret, i; 897 struct device *dev = &pdev->dev; 898 struct device_node *np = dev->of_node; 899 struct irq_domain *parent_domain, *domain; 900 struct stm32_exti_host_data *host_data; 901 const struct stm32_exti_drv_data *drv_data; 902 903 host_data = devm_kzalloc(dev, sizeof(*host_data), GFP_KERNEL); 904 if (!host_data) 905 return -ENOMEM; 906 907 /* check for optional hwspinlock which may be not available yet */ 908 ret = of_hwspin_lock_get_id(np, 0); 909 if (ret == -EPROBE_DEFER) 910 /* hwspinlock framework not yet ready */ 911 return ret; 912 913 if (ret >= 0) { 914 host_data->hwlock = devm_hwspin_lock_request_specific(dev, ret); 915 if (!host_data->hwlock) { 916 dev_err(dev, "Failed to request hwspinlock\n"); 917 return -EINVAL; 918 } 919 } else if (ret != -ENOENT) { 920 /* note: ENOENT is a valid case (means 'no hwspinlock') */ 921 dev_err(dev, "Failed to get hwspinlock\n"); 922 return ret; 923 } 924 925 /* initialize host_data */ 926 drv_data = of_device_get_match_data(dev); 927 if (!drv_data) { 928 dev_err(dev, "no of match data\n"); 929 return -ENODEV; 930 } 931 host_data->drv_data = drv_data; 932 933 host_data->chips_data = devm_kcalloc(dev, drv_data->bank_nr, 934 sizeof(*host_data->chips_data), 935 GFP_KERNEL); 936 if (!host_data->chips_data) 937 return -ENOMEM; 938 939 host_data->base = devm_platform_ioremap_resource(pdev, 0); 940 if (IS_ERR(host_data->base)) 941 return PTR_ERR(host_data->base); 942 943 for (i = 0; i < drv_data->bank_nr; i++) 944 stm32_exti_chip_init(host_data, i, np); 945 946 parent_domain = irq_find_host(of_irq_find_parent(np)); 947 if (!parent_domain) { 948 dev_err(dev, "GIC interrupt-parent not found\n"); 949 return -EINVAL; 950 } 951 952 domain = irq_domain_add_hierarchy(parent_domain, 0, 953 drv_data->bank_nr * IRQS_PER_BANK, 954 np, &stm32_exti_h_domain_ops, 955 host_data); 956 957 if (!domain) { 958 dev_err(dev, "Could not register exti domain\n"); 959 return -ENOMEM; 960 } 961 962 ret = devm_add_action_or_reset(dev, stm32_exti_remove_irq, domain); 963 if (ret) 964 return ret; 965 966 stm32_exti_h_syscore_init(host_data); 967 968 return 0; 969} 970 971/* platform driver only for MP1 */ 972static const struct of_device_id stm32_exti_ids[] = { 973 { .compatible = "st,stm32mp1-exti", .data = &stm32mp1_drv_data}, 974 { .compatible = "st,stm32mp13-exti", .data = &stm32mp13_drv_data}, 975 {}, 976}; 977MODULE_DEVICE_TABLE(of, stm32_exti_ids); 978 979static struct platform_driver stm32_exti_driver = { 980 .probe = stm32_exti_probe, 981 .remove = stm32_exti_remove, 982 .driver = { 983 .name = "stm32_exti", 984 .of_match_table = stm32_exti_ids, 985 }, 986}; 987 988static int __init stm32_exti_arch_init(void) 989{ 990 return platform_driver_register(&stm32_exti_driver); 991} 992 993static void __exit stm32_exti_arch_exit(void) 994{ 995 return platform_driver_unregister(&stm32_exti_driver); 996} 997 998arch_initcall(stm32_exti_arch_init); 999module_exit(stm32_exti_arch_exit); 1000 1001/* no platform driver for F4 and H7 */ 1002static int __init stm32f4_exti_of_init(struct device_node *np, 1003 struct device_node *parent) 1004{ 1005 return stm32_exti_init(&stm32f4xx_drv_data, np); 1006} 1007 1008IRQCHIP_DECLARE(stm32f4_exti, "st,stm32-exti", stm32f4_exti_of_init); 1009 1010static int __init stm32h7_exti_of_init(struct device_node *np, 1011 struct device_node *parent) 1012{ 1013 return stm32_exti_init(&stm32h7xx_drv_data, np); 1014} 1015 1016IRQCHIP_DECLARE(stm32h7_exti, "st,stm32h7-exti", stm32h7_exti_of_init);