hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/arm/mach-imx/gpc.c
....@@ -62,28 +62,38 @@
6262 void imx_gpc_pre_suspend(bool arm_power_off)
6363 {
6464 void __iomem *reg_imr1 = gpc_base + GPC_IMR1;
65
+ unsigned long flags;
6566 int i;
6667
6768 /* Tell GPC to power off ARM core when suspend */
6869 if (arm_power_off)
6970 imx_gpc_set_arm_power_in_lpm(arm_power_off);
7071
72
+ flags = hard_cond_local_irq_save();
73
+
7174 for (i = 0; i < IMR_NUM; i++) {
7275 gpc_saved_imrs[i] = readl_relaxed(reg_imr1 + i * 4);
7376 writel_relaxed(~gpc_wake_irqs[i], reg_imr1 + i * 4);
7477 }
78
+
79
+ hard_cond_local_irq_restore(flags);
7580 }
7681
7782 void imx_gpc_post_resume(void)
7883 {
7984 void __iomem *reg_imr1 = gpc_base + GPC_IMR1;
85
+ unsigned long flags;
8086 int i;
8187
8288 /* Keep ARM core powered on for other low-power modes */
8389 imx_gpc_set_arm_power_in_lpm(false);
8490
91
+ flags = hard_cond_local_irq_save();
92
+
8593 for (i = 0; i < IMR_NUM; i++)
8694 writel_relaxed(gpc_saved_imrs[i], reg_imr1 + i * 4);
95
+
96
+ hard_cond_local_irq_restore(flags);
8797 }
8898
8999 static int imx_gpc_irq_set_wake(struct irq_data *d, unsigned int on)
....@@ -105,21 +115,31 @@
105115 void imx_gpc_mask_all(void)
106116 {
107117 void __iomem *reg_imr1 = gpc_base + GPC_IMR1;
118
+ unsigned long flags;
108119 int i;
120
+
121
+ flags = hard_cond_local_irq_save();
109122
110123 for (i = 0; i < IMR_NUM; i++) {
111124 gpc_saved_imrs[i] = readl_relaxed(reg_imr1 + i * 4);
112125 writel_relaxed(~0, reg_imr1 + i * 4);
113126 }
127
+
128
+ hard_cond_local_irq_restore(flags);
114129 }
115130
116131 void imx_gpc_restore_all(void)
117132 {
118133 void __iomem *reg_imr1 = gpc_base + GPC_IMR1;
134
+ unsigned long flags;
119135 int i;
136
+
137
+ flags = hard_cond_local_irq_save();
120138
121139 for (i = 0; i < IMR_NUM; i++)
122140 writel_relaxed(gpc_saved_imrs[i], reg_imr1 + i * 4);
141
+
142
+ hard_cond_local_irq_restore(flags);
123143 }
124144
125145 void imx_gpc_hwirq_unmask(unsigned int hwirq)
....@@ -167,6 +187,7 @@
167187 #ifdef CONFIG_SMP
168188 .irq_set_affinity = irq_chip_set_affinity_parent,
169189 #endif
190
+ .flags = IRQCHIP_PIPELINE_SAFE,
170191 };
171192
172193 static int imx_gpc_domain_translate(struct irq_domain *d,