I2c-ralink kernel module bugfix

I have an RT5350 device (Vstarcam T7838WIP IP camera) and I'm trying to upgrade it to OpenWRT software.

Found a strange bug with i2c bus: system completely hangs on modprobe of i2c-ralink kernel module.

After some research I found the reason: read/write to registers before device reset.

I fixed rt_i2c_init function, this is the working one:

static int rt_i2c_init(struct rt_i2c *i2c)
{
        u32 reg;

        /* i2c_sclk = periph_clk / ((2 * clk_div) + 5) */
        i2c->clk_div = (clk_get_rate(i2c->clk) - (5 * i2c->cur_clk)) /
                (2 * i2c->cur_clk);
        if (i2c->clk_div < 8)
                i2c->clk_div = 8;
        if (i2c->clk_div > I2C_CLKDIV_MASK)
                i2c->clk_div = I2C_CLKDIV_MASK;

        rt_i2c_reset(i2c);

        /* check support combinde/repeated start message */
        rt_i2c_w32(i2c, NOSTOP_CMD, REG_STARTXFR_REG);
        reg = rt_i2c_r32(i2c, REG_STARTXFR_REG) & NOSTOP_CMD;

        return reg;
}

Part of the original version does rt_i2c_reset:

        /* check support combinde/repeated start message */
        rt_i2c_w32(i2c, NOSTOP_CMD, REG_STARTXFR_REG);
        reg = rt_i2c_r32(i2c, REG_STARTXFR_REG) & NOSTOP_CMD;

        rt_i2c_reset(i2c);

Can anybody tell me, why the original version does reset after reading REG_STARTXFR_REG? My system completely hangs at rt_i2c_w32 if rt_i2c_reset has not been called before.

Is it possible to make a bugfix to all releases starting from v17?

Can anybody help with this? Don't know how to read this, looks like i2c bus has not been configured.

OpenWRT 18 on RT5350 device with wm8988 on i2c + i2s.

root@OpenWrt:~# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 
30: -- -- -- -- -- -- -- -- 38 39 3a 3b 3c 3d 3e 3f 
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 
70: 70 71 72 73 74 75 76 77                         
root@OpenWrt:~# i2cdetect -r -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         
root@OpenWrt:~# i2cdetect -q -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 
10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 
20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 
30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 
40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 
50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 
60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 
70: 70 71 72 73 74 75 76 77                         

root@OpenWrt:~# i2cdetect -F 0
Functionalities implemented by /dev/i2c-0:
I2C                              yes
SMBus Quick Command              yes
SMBus Send Byte                  yes
SMBus Receive Byte               yes
SMBus Write Byte                 yes
SMBus Read Byte                  yes
SMBus Write Word                 yes
SMBus Read Word                  yes
SMBus Process Call               yes
SMBus Block Write                yes
SMBus Block Read                 no
SMBus Block Process Call         no
SMBus PEC                        yes
I2C Block Write                  yes
I2C Block Read                   yes