Lines Matching refs:exti
117 static inline uint32_t stm32_exti_maxcid(const struct stm32_exti_pdata *exti) in stm32_exti_maxcid() argument
119 uint32_t bitfield = (exti->hwcfgr1 & _EXTI_HWCFGR1_CIDWIDTH_MASK) >> in stm32_exti_maxcid()
125 static inline uint32_t stm32_exti_nbevents(const struct stm32_exti_pdata *exti) in stm32_exti_nbevents() argument
127 uint32_t bitfield = (exti->hwcfgr1 & _EXTI_HWCFGR1_NBEVENTS_MASK) >> in stm32_exti_nbevents()
133 static inline uint32_t stm32_exti_nbcpus(const struct stm32_exti_pdata *exti) in stm32_exti_nbcpus() argument
135 uint32_t bitfield = (exti->hwcfgr1 & _EXTI_HWCFGR1_NBCPUS_MASK) >> in stm32_exti_nbcpus()
142 stm32_exti_event_is_configurable(const struct stm32_exti_pdata *exti, in stm32_exti_event_is_configurable() argument
148 return exti->trg[i] & mask; in stm32_exti_event_is_configurable()
151 static void stm32_exti_set_type(struct stm32_exti_pdata *exti, in stm32_exti_set_type() argument
178 exceptions = cpu_spin_lock_xsave(&exti->lock); in stm32_exti_set_type()
180 io_mask32(exti->base + _EXTI_RTSR(i), r_trig, mask); in stm32_exti_set_type()
181 io_mask32(exti->base + _EXTI_FTSR(i), f_trig, mask); in stm32_exti_set_type()
183 cpu_spin_unlock_xrestore(&exti->lock, exceptions); in stm32_exti_set_type()
186 static void stm32_exti_mask(struct stm32_exti_pdata *exti, uint32_t exti_line) in stm32_exti_mask() argument
192 exceptions = cpu_spin_lock_xsave(&exti->lock); in stm32_exti_mask()
194 io_clrbits32(exti->base + _EXTI_C1IMR(i), mask); in stm32_exti_mask()
195 exti->mask_cache[i] &= ~mask; in stm32_exti_mask()
197 cpu_spin_unlock_xrestore(&exti->lock, exceptions); in stm32_exti_mask()
200 static void stm32_exti_unmask(struct stm32_exti_pdata *exti, in stm32_exti_unmask() argument
207 exceptions = cpu_spin_lock_xsave(&exti->lock); in stm32_exti_unmask()
209 io_setbits32(exti->base + _EXTI_C1IMR(i), mask); in stm32_exti_unmask()
210 exti->mask_cache[i] |= mask; in stm32_exti_unmask()
212 cpu_spin_unlock_xrestore(&exti->lock, exceptions); in stm32_exti_unmask()
215 static void stm32_exti_enable_wake(struct stm32_exti_pdata *exti, in stm32_exti_enable_wake() argument
222 exceptions = cpu_spin_lock_xsave(&exti->lock); in stm32_exti_enable_wake()
224 exti->wake_active[i] |= mask; in stm32_exti_enable_wake()
226 cpu_spin_unlock_xrestore(&exti->lock, exceptions); in stm32_exti_enable_wake()
229 static void stm32_exti_disable_wake(struct stm32_exti_pdata *exti, in stm32_exti_disable_wake() argument
236 exceptions = cpu_spin_lock_xsave(&exti->lock); in stm32_exti_disable_wake()
238 exti->wake_active[i] &= ~mask; in stm32_exti_disable_wake()
240 cpu_spin_unlock_xrestore(&exti->lock, exceptions); in stm32_exti_disable_wake()
243 static void stm32_exti_clear(struct stm32_exti_pdata *exti, uint32_t exti_line) in stm32_exti_clear() argument
249 exceptions = cpu_spin_lock_xsave(&exti->lock); in stm32_exti_clear()
251 io_setbits32(exti->base + _EXTI_RPR(i), mask); in stm32_exti_clear()
252 io_setbits32(exti->base + _EXTI_FPR(i), mask); in stm32_exti_clear()
254 cpu_spin_unlock_xrestore(&exti->lock, exceptions); in stm32_exti_clear()
257 static void stm32_exti_set_tz(struct stm32_exti_pdata *exti, in stm32_exti_set_tz() argument
264 exceptions = cpu_spin_lock_xsave(&exti->lock); in stm32_exti_set_tz()
266 io_setbits32(exti->base + _EXTI_SECCFGR(i), mask); in stm32_exti_set_tz()
268 cpu_spin_unlock_xrestore(&exti->lock, exceptions); in stm32_exti_set_tz()
272 stm32_exti_get_parent_itr(struct stm32_exti_pdata *exti, size_t it) in stm32_exti_get_parent_itr() argument
274 if (!exti || it >= stm32_exti_nbevents(exti) || !exti->hierarchy[it]) in stm32_exti_get_parent_itr()
277 return &exti->hierarchy[it]->parent; in stm32_exti_get_parent_itr()
283 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_enable() local
284 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_enable()
286 stm32_exti_unmask(exti, it); in stm32_exti_op_enable()
294 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_disable() local
295 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_disable()
297 stm32_exti_mask(exti, it); in stm32_exti_op_disable()
305 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_mask() local
306 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_mask()
308 stm32_exti_mask(exti, it); in stm32_exti_op_mask()
316 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_unmask() local
317 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_unmask()
319 stm32_exti_unmask(exti, it); in stm32_exti_op_unmask()
327 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_raise_pi() local
328 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_raise_pi()
338 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_raise_sgi() local
339 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_raise_sgi()
349 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_set_affinity() local
350 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_set_affinity()
361 struct stm32_exti_pdata *exti = itr_chip_to_stm32_exti_pdata(chip); in stm32_exti_op_set_wake() local
362 struct itr_desc *parent = stm32_exti_get_parent_itr(exti, it); in stm32_exti_op_set_wake()
365 stm32_exti_enable_wake(exti, it); in stm32_exti_op_set_wake()
367 stm32_exti_disable_wake(exti, it); in stm32_exti_op_set_wake()
385 static TEE_Result stm32_exti_rif_check_access(struct stm32_exti_pdata *exti, in stm32_exti_rif_check_access() argument
392 if (!((exti->seccfgr_cache[i] & exti->privcfgr_cache[i] & in stm32_exti_rif_check_access()
393 exti->access_mask[i]) & mask)) in stm32_exti_rif_check_access()
396 if ((exti->e_cids[exti_line] & _EXTI_CIDCFGR_CFEN) && in stm32_exti_rif_check_access()
397 ((exti->e_cids[exti_line] & _EXTI_CIDCFGR_SCID_MASK) != in stm32_exti_rif_check_access()
404 static void stm32_exti_rif_parse_dt(struct stm32_exti_pdata *exti, in stm32_exti_rif_parse_dt() argument
414 exti->glock = true; in stm32_exti_rif_parse_dt()
424 exti->e_cids = calloc(stm32_exti_nbevents(exti), sizeof(uint32_t)); in stm32_exti_rif_parse_dt()
425 exti->c_cids = calloc(stm32_exti_nbcpus(exti), sizeof(uint32_t)); in stm32_exti_rif_parse_dt()
426 if (!exti->e_cids || !exti->c_cids) in stm32_exti_rif_parse_dt()
429 conf_data.cid_confs = exti->e_cids; in stm32_exti_rif_parse_dt()
430 conf_data.sec_conf = exti->seccfgr_cache; in stm32_exti_rif_parse_dt()
431 conf_data.priv_conf = exti->privcfgr_cache; in stm32_exti_rif_parse_dt()
432 conf_data.access_mask = exti->access_mask; in stm32_exti_rif_parse_dt()
438 stm32_exti_nbevents(exti)); in stm32_exti_rif_parse_dt()
449 if (pos == 0 || pos > stm32_exti_nbcpus(exti)) in stm32_exti_rif_parse_dt()
452 if (c_cid > stm32_exti_maxcid(exti)) in stm32_exti_rif_parse_dt()
455 exti->c_cids[pos - 1] = SHIFT_U32(c_cid, _CIDCFGR_SCID_SHIFT) | in stm32_exti_rif_parse_dt()
460 static TEE_Result stm32_exti_rif_apply(const struct stm32_exti_pdata *exti) in stm32_exti_rif_apply() argument
478 for (event = 0; event < stm32_exti_nbevents(exti); event++) { in stm32_exti_rif_apply()
482 if (!(BIT(bit_offset) & exti->access_mask[i])) in stm32_exti_rif_apply()
485 io_clrbits32(exti->base + _EXTI_EnCIDCFGR(event), in stm32_exti_rif_apply()
489 for (i = 0; i < stm32_exti_nbcpus(exti); i++) in stm32_exti_rif_apply()
490 io_clrbits32(exti->base + _EXTI_CmCIDCFGR(i), in stm32_exti_rif_apply()
496 if (!exti->access_mask[i]) in stm32_exti_rif_apply()
499 io_clrsetbits32(exti->base + _EXTI_PRIVCFGR(i), in stm32_exti_rif_apply()
500 _EXTI_PRIVCFGR_MASK & exti->access_mask[i], in stm32_exti_rif_apply()
501 exti->privcfgr_cache[i]); in stm32_exti_rif_apply()
502 io_clrsetbits32(exti->base + _EXTI_SECCFGR(i), in stm32_exti_rif_apply()
503 _EXTI_SECCFGR_MASK & exti->access_mask[i], in stm32_exti_rif_apply()
504 exti->seccfgr_cache[i]); in stm32_exti_rif_apply()
511 for (event = 0; event < stm32_exti_nbevents(exti); event++) { in stm32_exti_rif_apply()
515 if (!(BIT(bit_offset) & exti->access_mask[i])) in stm32_exti_rif_apply()
518 io_clrsetbits32(exti->base + _EXTI_EnCIDCFGR(event), in stm32_exti_rif_apply()
519 _EXTI_CIDCFGR_CONF_MASK, exti->e_cids[event]); in stm32_exti_rif_apply()
521 for (i = 0; i < stm32_exti_nbcpus(exti); i++) { in stm32_exti_rif_apply()
522 if (!(exti->c_cids[i] & _EXTI_CIDCFGR_CFEN)) in stm32_exti_rif_apply()
525 io_clrsetbits32(exti->base + _EXTI_CmCIDCFGR(i), in stm32_exti_rif_apply()
526 _EXTI_CIDCFGR_CONF_MASK, exti->c_cids[i]); in stm32_exti_rif_apply()
530 if (exti->glock) in stm32_exti_rif_apply()
531 io_setbits32(exti->base + _EXTI_LOCKR, _EXTI_LOCKR_GLOCK); in stm32_exti_rif_apply()
536 static void stm32_exti_rif_save(struct stm32_exti_pdata *exti) in stm32_exti_rif_save() argument
544 if (!exti->access_mask[i]) in stm32_exti_rif_save()
547 exti->privcfgr_cache[i] = in stm32_exti_rif_save()
548 io_read32(exti->base + _EXTI_PRIVCFGR(i)); in stm32_exti_rif_save()
549 exti->seccfgr_cache[i] = in stm32_exti_rif_save()
550 io_read32(exti->base + _EXTI_SECCFGR(i)); in stm32_exti_rif_save()
557 for (event = 0; event < stm32_exti_nbevents(exti); event++) { in stm32_exti_rif_save()
561 if (!(BIT(bit_offset) & exti->access_mask[i])) in stm32_exti_rif_save()
564 exti->e_cids[event] = io_read32(exti->base + in stm32_exti_rif_save()
567 for (i = 0; i < stm32_exti_nbcpus(exti); i++) in stm32_exti_rif_save()
568 exti->c_cids[i] = io_read32(exti->base + _EXTI_CmCIDCFGR(i)); in stm32_exti_rif_save()
571 static void stm32_exti_pm_suspend(struct stm32_exti_pdata *exti) in stm32_exti_pm_suspend() argument
573 uint32_t base = exti->base; in stm32_exti_pm_suspend()
576 if (IS_ENABLED(CFG_STM32_RIF) && stm32_exti_maxcid(exti)) in stm32_exti_pm_suspend()
577 stm32_exti_rif_save(exti); in stm32_exti_pm_suspend()
581 exti->ftsr_cache[i] = io_read32(base + _EXTI_FTSR(i)); in stm32_exti_pm_suspend()
582 exti->rtsr_cache[i] = io_read32(base + _EXTI_RTSR(i)); in stm32_exti_pm_suspend()
583 exti->seccfgr_cache[i] = io_read32(base + _EXTI_SECCFGR(i)); in stm32_exti_pm_suspend()
588 exti->port_sel_cache[i] = io_read32(base + _EXTI_CR(i)); in stm32_exti_pm_suspend()
591 static void stm32_exti_pm_resume(struct stm32_exti_pdata *exti) in stm32_exti_pm_resume() argument
593 uint32_t base = exti->base; in stm32_exti_pm_resume()
598 io_write32(base + _EXTI_FTSR(i), exti->ftsr_cache[i]); in stm32_exti_pm_resume()
599 io_write32(base + _EXTI_RTSR(i), exti->rtsr_cache[i]); in stm32_exti_pm_resume()
600 io_write32(base + _EXTI_SECCFGR(i), exti->seccfgr_cache[i]); in stm32_exti_pm_resume()
605 io_write32(base + _EXTI_CR(i), exti->port_sel_cache[i]); in stm32_exti_pm_resume()
607 if (IS_ENABLED(CFG_STM32_RIF) && stm32_exti_maxcid(exti)) in stm32_exti_pm_resume()
608 stm32_exti_rif_apply(exti); in stm32_exti_pm_resume()
612 static void stm32_exti_configure_wake(struct stm32_exti_pdata *exti) in stm32_exti_configure_wake() argument
618 exti->imr_cache[i] = io_read32(exti->base + _EXTI_C1IMR(i)); in stm32_exti_configure_wake()
620 io_clrbits32(exti->base + _EXTI_C1IMR(i), exti->mask_cache[i]); in stm32_exti_configure_wake()
622 io_setbits32(exti->base + _EXTI_C1IMR(i), exti->wake_active[i]); in stm32_exti_configure_wake()
626 static void stm32_exti_restore_wake(struct stm32_exti_pdata *exti) in stm32_exti_restore_wake() argument
632 io_write32(exti->base + _EXTI_C1IMR(i), exti->imr_cache[i]); in stm32_exti_restore_wake()
639 struct stm32_exti_pdata *exti = in stm32_exti_pm() local
643 stm32_exti_configure_wake(exti); in stm32_exti_pm()
645 stm32_exti_restore_wake(exti); in stm32_exti_pm()
651 stm32_exti_pm_suspend(exti); in stm32_exti_pm()
653 stm32_exti_pm_resume(exti); in stm32_exti_pm()
663 struct stm32_exti_pdata *exti = in stm32_exti_it_handler() local
668 if (stm32_exti_event_is_configurable(exti, itr_desc->itr_num)) in stm32_exti_it_handler()
669 stm32_exti_clear(exti, itr_desc->itr_num); in stm32_exti_it_handler()
680 struct stm32_exti_pdata *exti = priv_data; in stm32_exti_dt_get_chip_cb() local
692 itr_desc->chip = &exti->chip; in stm32_exti_dt_get_chip_cb()
695 if (exti_line >= stm32_exti_nbevents(exti)) in stm32_exti_dt_get_chip_cb()
699 if (IS_ENABLED(CFG_STM32_RIF) && stm32_exti_maxcid(exti)) { in stm32_exti_dt_get_chip_cb()
700 res = stm32_exti_rif_check_access(exti, exti_line); in stm32_exti_dt_get_chip_cb()
705 hierarchy = exti->hierarchy[exti_line]; in stm32_exti_dt_get_chip_cb()
710 exti->hierarchy[exti_line] = hierarchy; in stm32_exti_dt_get_chip_cb()
713 hierarchy->this.chip = &exti->chip; in stm32_exti_dt_get_chip_cb()
731 if (stm32_exti_event_is_configurable(exti, exti_line)) in stm32_exti_dt_get_chip_cb()
732 stm32_exti_set_type(exti, exti_line, type); in stm32_exti_dt_get_chip_cb()
735 if (!IS_ENABLED(CFG_STM32_RIF) || !stm32_exti_maxcid(exti)) in stm32_exti_dt_get_chip_cb()
736 stm32_exti_set_tz(exti, exti_line); in stm32_exti_dt_get_chip_cb()
744 struct stm32_exti_pdata *exti = NULL; in stm32_exti_probe() local
750 exti = calloc(1, sizeof(*exti)); in stm32_exti_probe()
751 if (!exti) in stm32_exti_probe()
754 exti->lock = SPINLOCK_UNLOCK; in stm32_exti_probe()
755 exti->chip.ops = &stm32_exti_ops; in stm32_exti_probe()
756 exti->chip.name = strdup(fdt_get_name(fdt, node, NULL)); in stm32_exti_probe()
758 res = itr_chip_dt_only_init(&exti->chip); in stm32_exti_probe()
765 exti->base = io_pa_or_va_secure(&base, reg_size); in stm32_exti_probe()
766 assert(exti->base); in stm32_exti_probe()
768 exti->hwcfgr1 = io_read32(exti->base + _EXTI_HWCFGR1); in stm32_exti_probe()
770 exti->trg[i] = io_read32(exti->base + _EXTI_TRG(i)); in stm32_exti_probe()
772 if (IS_ENABLED(CFG_STM32_RIF) && stm32_exti_maxcid(exti)) { in stm32_exti_probe()
773 stm32_exti_rif_parse_dt(exti, fdt, node); in stm32_exti_probe()
774 res = stm32_exti_rif_apply(exti); in stm32_exti_probe()
780 exti); in stm32_exti_probe()
784 register_pm_core_service_cb(stm32_exti_pm, exti, "stm32-exti"); in stm32_exti_probe()
789 free(exti->e_cids); in stm32_exti_probe()
790 free(exti->c_cids); in stm32_exti_probe()
791 free((char *)exti->chip.name); in stm32_exti_probe()
792 free(exti); in stm32_exti_probe()