@@ -831,8 +831,14 @@ static int geni_i2c_probe(struct platform_device *pdev)
831831 spin_lock_init (& gi2c -> lock );
832832 platform_set_drvdata (pdev , gi2c );
833833
834- /* Keep interrupts disabled initially to allow for low-power modes */
835- ret = devm_request_irq (dev , gi2c -> irq , geni_i2c_irq , IRQF_NO_AUTOEN ,
834+ /*
835+ * Keep interrupts disabled initially to allow for low-power modes.
836+ * IRQF_NO_SUSPEND: Keep IRQ enabled during suspend to handle I2C transfers
837+ * in noirq phase (e.g., from PCIe driver's noirq_resume).
838+ * IRQF_EARLY_RESUME: Enable IRQ early during resume sequence.
839+ */
840+ ret = devm_request_irq (dev , gi2c -> irq , geni_i2c_irq ,
841+ IRQF_NO_AUTOEN | IRQF_NO_SUSPEND | IRQF_EARLY_RESUME ,
836842 dev_name (dev ), gi2c );
837843 if (ret )
838844 return dev_err_probe (dev , ret ,
@@ -1044,6 +1050,20 @@ static int __maybe_unused geni_i2c_suspend_noirq(struct device *dev)
10441050static int __maybe_unused geni_i2c_resume_noirq (struct device * dev )
10451051{
10461052 struct geni_i2c_dev * gi2c = dev_get_drvdata (dev );
1053+ int ret = 0 ;
1054+
1055+ /*
1056+ * Resume hardware to handle I2C transfers from other drivers'
1057+ * noirq_resume callbacks (e.g., PCIe driver).
1058+ * pm_runtime_force_resume() properly handles PM state and usage_count.
1059+ */
1060+ if (gi2c -> suspended ) {
1061+ ret = pm_runtime_force_resume (dev );
1062+ if (ret ) {
1063+ dev_err (dev , "Failed to resume I2C during noirq: %d\n" , ret );
1064+ return ret ;
1065+ }
1066+ }
10471067
10481068 i2c_mark_adapter_resumed (& gi2c -> adap );
10491069 return 0 ;
0 commit comments