]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mfd: rsmu: Fix page register setup
authorMatthew Bystrin <dev.mbstr@gmail.com>
Wed, 29 Apr 2026 07:20:46 +0000 (10:20 +0300)
committerLee Jones <lee@kernel.org>
Wed, 17 Jun 2026 10:31:09 +0000 (11:31 +0100)
Fix writes to page register in 8A3400x family (Clock Matrix).

All calls to rsmu_write_page_register() (both in i2c and spi) have
resulted in early return, because all addresses in
include/linux/mfd/idt8a340_reg.h are less than RSMU_CM_SCSR_BASE.

There were 2 separate patch series which have to be merged in one time:
mfd and ptp. The latter have been merged, the former[1] have not.

Link: https://lore.kernel.org/netdev/LV3P220MB1202F8E2FCCFBA2519B4966EA0192@LV3P220MB1202.NAMP220.PROD.OUTLOOK.COM/
Fixes: 67d6c76fc815 ("mfd: rsmu: Support 32-bit address space")
Signed-off-by: Matthew Bystrin <dev.mbstr@gmail.com>
Link: https://patch.msgid.link/20260429072047.1111427-2-dev.mbstr@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/mfd/rsmu_i2c.c
drivers/mfd/rsmu_spi.c

index cba64f107a2fd1e863e92581cdfde44176607ece..9e5fc8259eec2eaec64d74a6497a3f4f2baf4d77 100644 (file)
@@ -134,14 +134,10 @@ static int rsmu_i2c_write_device(struct rsmu_ddata *rsmu, u8 reg, u8 *buf, u8 by
 static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg,
                                    rsmu_rw_device rsmu_write_device)
 {
-       u32 page = reg & RSMU_CM_PAGE_MASK;
+       u32 page = (reg | RSMU_CM_SCSR_BASE) & RSMU_CM_PAGE_MASK;
        u8 buf[4];
        int err;
 
-       /* Do not modify offset register for none-scsr registers */
-       if (reg < RSMU_CM_SCSR_BASE)
-               return 0;
-
        /* Simply return if we are on the same page */
        if (rsmu->page == page)
                return 0;
index 39d9be1e141fb67f3529a7332d905e6efe3986c3..c931d8cea0a1a908bb8ead816ef851b14b4ffe46 100644 (file)
@@ -101,11 +101,8 @@ static int rsmu_write_page_register(struct rsmu_ddata *rsmu, u32 reg)
 
        switch (rsmu->type) {
        case RSMU_CM:
-               /* Do not modify page register for none-scsr registers */
-               if (reg < RSMU_CM_SCSR_BASE)
-                       return 0;
                page_reg = RSMU_CM_PAGE_ADDR;
-               page = reg & RSMU_PAGE_MASK;
+               page = (reg | RSMU_CM_SCSR_BASE) & RSMU_PAGE_MASK;
                buf[0] = (u8)(page & 0xFF);
                buf[1] = (u8)((page >> 8) & 0xFF);
                buf[2] = (u8)((page >> 16) & 0xFF);