Merge tag 'i2c-for-6.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:

- riic, imx-lpi2c: suspend/resume fixes

- qcom-geni: DMA handling fix

- iproc: correct DT binding description

* tag 'i2c-for-6.19-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
i2c: imx-lpi2c: change to PIO mode in system-wide suspend/resume progress
i2c: qcom-geni: make sure I2C hub controllers can't use SE DMA
i2c: riic: Move suspend handling to NOIRQ phase
dt-bindings: i2c: brcm,iproc-i2c: Allow 2 reg entries for brcm,iproc-nic-i2c

+62 -12
+9 -1
Documentation/devicetree/bindings/i2c/brcm,iproc-i2c.yaml
··· 16 - brcm,iproc-nic-i2c 17 18 reg: 19 - maxItems: 1 20 21 clock-frequency: 22 enum: [ 100000, 400000 ] ··· 42 contains: 43 const: brcm,iproc-nic-i2c 44 then: 45 required: 46 - brcm,ape-hsls-addr-mask 47 48 unevaluatedProperties: false 49
··· 16 - brcm,iproc-nic-i2c 17 18 reg: 19 + minItems: 1 20 + maxItems: 2 21 22 clock-frequency: 23 enum: [ 100000, 400000 ] ··· 41 contains: 42 const: brcm,iproc-nic-i2c 43 then: 44 + properties: 45 + reg: 46 + minItems: 2 47 required: 48 - brcm,ape-hsls-addr-mask 49 + else: 50 + properties: 51 + reg: 52 + maxItems: 1 53 54 unevaluatedProperties: false 55
+7
drivers/i2c/busses/i2c-imx-lpi2c.c
··· 593 return false; 594 595 /* 596 * When the length of data is less than I2C_DMA_THRESHOLD, 597 * cpu mode is used directly to avoid low performance. 598 */
··· 593 return false; 594 595 /* 596 + * A system-wide suspend or resume transition is in progress. LPI2C should use PIO to 597 + * transfer data to avoid issue caused by no ready DMA HW resource. 598 + */ 599 + if (pm_suspend_in_progress()) 600 + return false; 601 + 602 + /* 603 * When the length of data is less than I2C_DMA_THRESHOLD, 604 * cpu mode is used directly to avoid low performance. 605 */
+7 -4
drivers/i2c/busses/i2c-qcom-geni.c
··· 116 dma_addr_t dma_addr; 117 struct dma_chan *tx_c; 118 struct dma_chan *rx_c; 119 bool gpi_mode; 120 bool abort_done; 121 bool is_tx_multi_desc_xfer; ··· 448 size_t len = msg->len; 449 struct i2c_msg *cur; 450 451 - dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); 452 if (dma_buf) 453 geni_se_select_mode(se, GENI_SE_DMA); 454 else ··· 487 size_t len = msg->len; 488 struct i2c_msg *cur; 489 490 - dma_buf = i2c_get_dma_safe_msg_buf(msg, 32); 491 if (dma_buf) 492 geni_se_select_mode(se, GENI_SE_DMA); 493 else ··· 1081 goto err_resources; 1082 } 1083 1084 - if (desc && desc->no_dma_support) 1085 fifo_disable = false; 1086 - else 1087 fifo_disable = readl_relaxed(gi2c->se.base + GENI_IF_DISABLE_RO) & FIFO_IF_DISABLE; 1088 1089 if (fifo_disable) { 1090 /* FIFO is disabled, so we can only use GPI DMA */
··· 116 dma_addr_t dma_addr; 117 struct dma_chan *tx_c; 118 struct dma_chan *rx_c; 119 + bool no_dma; 120 bool gpi_mode; 121 bool abort_done; 122 bool is_tx_multi_desc_xfer; ··· 447 size_t len = msg->len; 448 struct i2c_msg *cur; 449 450 + dma_buf = gi2c->no_dma ? NULL : i2c_get_dma_safe_msg_buf(msg, 32); 451 if (dma_buf) 452 geni_se_select_mode(se, GENI_SE_DMA); 453 else ··· 486 size_t len = msg->len; 487 struct i2c_msg *cur; 488 489 + dma_buf = gi2c->no_dma ? NULL : i2c_get_dma_safe_msg_buf(msg, 32); 490 if (dma_buf) 491 geni_se_select_mode(se, GENI_SE_DMA); 492 else ··· 1080 goto err_resources; 1081 } 1082 1083 + if (desc && desc->no_dma_support) { 1084 fifo_disable = false; 1085 + gi2c->no_dma = true; 1086 + } else { 1087 fifo_disable = readl_relaxed(gi2c->se.base + GENI_IF_DISABLE_RO) & FIFO_IF_DISABLE; 1088 + } 1089 1090 if (fifo_disable) { 1091 /* FIFO is disabled, so we can only use GPI DMA */
+39 -7
drivers/i2c/busses/i2c-riic.c
··· 670 671 static int riic_i2c_suspend(struct device *dev) 672 { 673 - struct riic_dev *riic = dev_get_drvdata(dev); 674 - int ret; 675 676 - ret = pm_runtime_resume_and_get(dev); 677 - if (ret) 678 - return ret; 679 680 i2c_mark_adapter_suspended(&riic->adapter); 681 ··· 710 riic_clear_set_bit(riic, ICCR1_ICE, 0, RIIC_ICCR1); 711 712 pm_runtime_mark_last_busy(dev); 713 - pm_runtime_put_sync(dev); 714 715 return reset_control_assert(riic->rstc); 716 } 717 718 - static int riic_i2c_resume(struct device *dev) 719 { 720 struct riic_dev *riic = dev_get_drvdata(dev); 721 int ret; 722 723 ret = reset_control_deassert(riic->rstc); 724 if (ret) 725 return ret; 726 ··· 745 } 746 747 static const struct dev_pm_ops riic_i2c_pm_ops = { 748 SYSTEM_SLEEP_PM_OPS(riic_i2c_suspend, riic_i2c_resume) 749 }; 750
··· 670 671 static int riic_i2c_suspend(struct device *dev) 672 { 673 + /* 674 + * Some I2C devices may need the I2C controller to remain active 675 + * during resume_noirq() or suspend_noirq(). If the controller is 676 + * autosuspended, there is no way to wake it up once runtime PM is 677 + * disabled (in suspend_late()). 678 + * 679 + * During system resume, the I2C controller will be available only 680 + * after runtime PM is re-enabled (in resume_early()). However, this 681 + * may be too late for some devices. 682 + * 683 + * Wake up the controller in the suspend() callback while runtime PM 684 + * is still enabled. The I2C controller will remain available until 685 + * the suspend_noirq() callback (pm_runtime_force_suspend()) is 686 + * called. During resume, the I2C controller can be restored by the 687 + * resume_noirq() callback (pm_runtime_force_resume()). 688 + * 689 + * Finally, the resume() callback re-enables autosuspend, ensuring 690 + * the I2C controller remains available until the system enters 691 + * suspend_noirq() and from resume_noirq(). 692 + */ 693 + return pm_runtime_resume_and_get(dev); 694 + } 695 696 + static int riic_i2c_resume(struct device *dev) 697 + { 698 + pm_runtime_put_autosuspend(dev); 699 + 700 + return 0; 701 + } 702 + 703 + static int riic_i2c_suspend_noirq(struct device *dev) 704 + { 705 + struct riic_dev *riic = dev_get_drvdata(dev); 706 707 i2c_mark_adapter_suspended(&riic->adapter); 708 ··· 683 riic_clear_set_bit(riic, ICCR1_ICE, 0, RIIC_ICCR1); 684 685 pm_runtime_mark_last_busy(dev); 686 + pm_runtime_force_suspend(dev); 687 688 return reset_control_assert(riic->rstc); 689 } 690 691 + static int riic_i2c_resume_noirq(struct device *dev) 692 { 693 struct riic_dev *riic = dev_get_drvdata(dev); 694 int ret; 695 696 ret = reset_control_deassert(riic->rstc); 697 + if (ret) 698 + return ret; 699 + 700 + ret = pm_runtime_force_resume(dev); 701 if (ret) 702 return ret; 703 ··· 714 } 715 716 static const struct dev_pm_ops riic_i2c_pm_ops = { 717 + NOIRQ_SYSTEM_SLEEP_PM_OPS(riic_i2c_suspend_noirq, riic_i2c_resume_noirq) 718 SYSTEM_SLEEP_PM_OPS(riic_i2c_suspend, riic_i2c_resume) 719 }; 720