i2c_transfer read direction can not work

Currently,base on jetPack3.1 and kernel 4.4.38.I test i2c_transfer() function, in write direction it works but read direction it not works.Anyone can help?

@frank
Could you tell the detail. How to reproduce the problem.

static int tc358746a_read32(struct v4l2_subdev *sd, u16 reg, u32 *val)
{
int ret;
struct i2c_client *client = v4l2_get_subdevdata(sd);
u8 valbuf[4] = {0,0,0,0};
u8 regbuf[2];
struct i2c_msg msg = {
[0] = {
.addr = client->addr,
.flags = 0,
.len = 2,
.buf = regbuf,
},
[1] = {
.addr = client->addr,
.flags = I2C_M_RD,
.len = 4,
.buf = valbuf,
},
};

    regbuf[0] = reg >> 8;
    regbuf[1] = reg & 0xff;
    ret = i2c_transfer(client->adapter, msg, 2);
    if (ret != 2) {
    dev_err(&client->dev, "Failed reading register 0x%04x!\n",reg);
	}
return 0;

}

static int tc358746a_write32(struct v4l2_subdev *sd, u16 reg, u32 val)
{
int ret;
struct i2c_msg msg;
u8 buf[6];
struct i2c_client *client = v4l2_get_subdevdata(sd);
buf[0] = reg >> 8;
buf[1] = reg & 0xff;
buf[2] = val >> 8;
buf[3] = val & 0xff;
buf[4] = val >> 24;
buf[5] = (val >> 16) && 0xff;
msg.addr = client->addr;
msg.flags = 0;
msg.len = 6;
msg.buf = buf;
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret < 0) {
dev_err(&client->dev, “Failed writing register 0x%04x!\n”, reg);
return ret;
}
return 0;
}

I believe it couldn’t be a problem for Tegra. It’s already verified by the tc358840 you can check it in kernel-4.4/drivers/media/i2c/tc358840.c