Pull IRQ subsystem fixes from Ingo Molnar: - Revert a commit to the mbigen irqchip driver that caused a regression on two-port Hi1616 chips (Caina) - Fix a too-long-preemption-off bug in the stm32mp-exti irqchip driver, caused by a time unit ambiguity & mismatch (Ju Nan) - Remove the now completely unused irq_domain_add_linear() inline function (Jiri Slaby) * tag 'irq-urgent-2026-09-06' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irqchip/stm32mp-exti: Fix the unit of the hwspinlock timeout Revert "irqchip/mbigen: Fix mbigen node address layout" irqdomain: Delete irq_domain_add_linear()
Unified · Split
| @@ -90,10 +90,6 @@ irq_domain映射的类型 · 89 unmodified lines | ||
| 90 | 90 | 映射的优点是固定时间查找IRQ号,而且irq_descs只分配给在用的IRQ。 缺点是该表 |
| 91 | 91 | 必须尽可能大的hwirq号。 |
| 92 | 92 | |
| 93 | −irq_domain_add_linear()和irq_domain_create_linear()在功能上是等价的, | |
| 94 | −除了第一个参数不同--前者接受一个Open Firmware特定的 'struct device_node' 而 | |
| 95 | −后者接受一个更通用的抽象 'struct fwnode_handle' 。 | |
| 96 | − | |
| 97 | 93 | 大多数驱动应该使用线性映射 |
| 98 | 94 | |
| 99 | 95 | 树状映射 |
| @@ -64,20 +64,6 @@ struct mbigen_device { · 63 unmodified lines | ||
| 64 | 64 | void __iomem *base; |
| 65 | 65 | }; |
| 66 | 66 | |
| 67 | −static inline unsigned int get_mbigen_node_offset(unsigned int nid) | |
| 68 | −{ | |
| 69 | − unsigned int offset = nid * MBIGEN_NODE_OFFSET; | |
| 70 | − | |
| 71 | − /* | |
| 72 | − * To avoid touched clear register in unexpected way, we need to directly | |
| 73 | − * skip clear register when access to more than 10 mbigen nodes. | |
| 74 | − */ | |
| 75 | − if (nid >= (REG_MBIGEN_CLEAR_OFFSET / MBIGEN_NODE_OFFSET)) | |
| 76 | − offset += MBIGEN_NODE_OFFSET; | |
| 77 | − | |
| 78 | − return offset; | |
| 79 | −} | |
| 80 | − | |
| 81 | 67 | static inline unsigned int get_mbigen_vec_reg(irq_hw_number_t hwirq) |
| 82 | 68 | { |
| 83 | 69 | unsigned int nid, pin; |
| @@ -86,7 +72,8 @@ static inline unsigned int get_mbigen_vec_reg(irq_hw_number_t hwirq) · 2 unmodified lines | ||
| 86 | 72 | nid = hwirq / IRQS_PER_MBIGEN_NODE + 1; |
| 87 | 73 | pin = hwirq % IRQS_PER_MBIGEN_NODE; |
| 88 | 74 | |
| 89 | − return pin * 4 + get_mbigen_node_offset(nid) + REG_MBIGEN_VEC_OFFSET; | |
| 75 | + return pin * 4 + nid * MBIGEN_NODE_OFFSET | |
| 76 | + + REG_MBIGEN_VEC_OFFSET; | |
| 90 | 77 | } |
| 91 | 78 | |
| 92 | 79 | static inline void get_mbigen_type_reg(irq_hw_number_t hwirq, |
| @@ -101,7 +88,8 @@ static inline void get_mbigen_type_reg(irq_hw_number_t hwirq, · 8 unmodified lines | ||
| 101 | 88 | *mask = 1 << (irq_ofst % 32); |
| 102 | 89 | ofst = irq_ofst / 32 * 4; |
| 103 | 90 | |
| 104 | − *addr = ofst + get_mbigen_node_offset(nid) + REG_MBIGEN_TYPE_OFFSET; | |
| 91 | + *addr = ofst + nid * MBIGEN_NODE_OFFSET | |
| 92 | + + REG_MBIGEN_TYPE_OFFSET; | |
| 105 | 93 | } |
| 106 | 94 | |
| 107 | 95 | static inline void get_mbigen_clear_reg(irq_hw_number_t hwirq, |
| @@ -22,7 +22,7 @@ · 21 unmodified lines | ||
| 22 | 22 | |
| 23 | 23 | #define IRQS_PER_BANK 32 |
| 24 | 24 | |
| 25 | −#define HWSPNLCK_TIMEOUT 1000 /* usec */ | |
| 25 | +#define HWSPNLCK_TIMEOUT_MS 1 | |
| 26 | 26 | |
| 27 | 27 | #define EXTI_EnCIDCFGR(n) (0x180 + (n) * 4) |
| 28 | 28 | #define EXTI_HWCFGR1 0x3f0 |
| @@ -376,7 +376,7 @@ static int stm32mp_exti_set_type(struct irq_data *d, unsigned int type) · 347 unmodified lines | ||
| 376 | 376 | raw_spin_lock(&chip_data->rlock); |
| 377 | 377 | |
| 378 | 378 | if (hwlock) { |
| 379 | − err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT); | |
| 379 | + err = hwspin_lock_timeout_in_atomic(hwlock, HWSPNLCK_TIMEOUT_MS); | |
| 380 | 380 | if (err) { |
| 381 | 381 | pr_err("%s can't get hwspinlock (%d)\n", __func__, err); |
| 382 | 382 | goto unlock; |
| @@ -752,24 +752,6 @@ static inline void msi_device_domain_free_wired(struct irq_domain *domain, unsig · 751 unmodified lines | ||
| 752 | 752 | } |
| 753 | 753 | #endif |
| 754 | 754 | |
| 755 | −static inline struct irq_domain *irq_domain_add_linear(struct device_node *of_node, | |
| 756 | − unsigned int size, | |
| 757 | − const struct irq_domain_ops *ops, | |
| 758 | − void *host_data) | |
| 759 | −{ | |
| 760 | − struct irq_domain_info info = { | |
| 761 | − .fwnode = of_fwnode_handle(of_node), | |
| 762 | − .size = size, | |
| 763 | − .hwirq_max = size, | |
| 764 | − .ops = ops, | |
| 765 | − .host_data = host_data, | |
| 766 | − }; | |
| 767 | − struct irq_domain *d; | |
| 768 | − | |
| 769 | − d = irq_domain_instantiate(&info); | |
| 770 | − return IS_ERR(d) ? NULL : d; | |
| 771 | −} | |
| 772 | − | |
| 773 | 755 | #else /* CONFIG_IRQ_DOMAIN */ |
| 774 | 756 | static inline void irq_dispose_mapping(unsigned int virq) { } |
| 775 | 757 | static inline struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode, |