Hi @ShaneCCC :
I try to I2C read/write in ds5_probe().
By regmap_raw_read API, ds5_read() fail.
By i2c_transfer API, I2C read/write are success.
So I think power/down/reset pin status are correct.
Are there any regmap parameter settings that I should to check it in JP6?
[ /nvidia-oot/drivers/media/i2c/d4xx.c ]
int i2c_write_reg_read_bytes(struct i2c_client *client, unsigned int devaddr, unsigned int reg_addr, unsigned char * rxbuf, unsigned int rxcount);
int i2c_write_bytes(struct i2c_client *client, unsigned int devaddr, unsigned char * txbuf, unsigned int txcount);
static const struct regmap_config ds5_regmap_config = {
.reg_bits = 16,
.val_bits = 8,
.reg_format_endian = REGMAP_ENDIAN_NATIVE,
.val_format_endian = REGMAP_ENDIAN_NATIVE,
};
static int ds5_probe(struct i2c_client *c, const struct i2c_device_id *id)
{
state->regmap = devm_regmap_init_i2c(c, &ds5_regmap_config);
if (IS_ERR(state->regmap)) {
ret = PTR_ERR(state->regmap);
dev_err(&c->dev, "regmap init failed: %d\n", ret);
goto e_regulator;
}
i2c_write_reg_read_bytes(c, 0x48, 0x1D, rxbuf, 1); /* I2C read OK */
txbuf[0]=0x10; // reg=MAX9296_CTRL0_ADDR
txbuf[1]=0x01;
i2c_write_bytes(c, 0x48, txbuf, 2); /* MAX9296_CTRL0_ADDR(0x10)=0x01, I2C write OK */
txbuf[0]=0x10; // reg=MAX9296_CTRL0_ADDR
txbuf[1]=0x21;
i2c_write_bytes(c, 0x48, txbuf, 2); /* MAX9296_CTRL0_ADDR(0x10)=0x21, I2C write OK */
ds5_read(state, 0x5020, &rec_state); /* regmap_raw_read 0x5020 fail */
} // end of ds5_probe
int i2c_write_reg_read_bytes(struct i2c_client *client, unsigned int devaddr, unsigned int reg_addr, unsigned char * rxbuf, unsigned int rxcount)
{
int ret=0;
unsigned char buf[4]={0};
struct i2c_msg msg[2] = {0};
buf[0]=reg_addr & 0xFF;
msg[0].addr = devaddr;
msg[0].flags = 0;
msg[0].len = 1;
msg[0].buf = buf;
msg[1].addr = devaddr;
msg[1].flags = I2C_M_RD;
msg[1].len = rxcount;
msg[1].buf = rxbuf;
ret = i2c_transfer(client->adapter, &msg[0], 2);
if (ret < 0)
goto err;
return 0;
err:
dev_err(&client->dev, "%s(), Failed I2C writeing register and reading data, ret = %d!\n", __func__, ret);
return ret;
}
int i2c_write_bytes(struct i2c_client *client, unsigned int devaddr, unsigned char * txbuf, unsigned int txcount)
{
int ret=0;
struct i2c_msg msg = {
.addr = devaddr,
.flags = 0,
.len = txcount,
.buf = txbuf,
};
ret = i2c_transfer(client->adapter, &msg, 1);
if (ret < 0) {
dev_err(&client->dev, "%s(devaddr=0x%02X, txbuf[0]=0x%02X, txcount=%d), Failed I2C writing register, ret = %d!\n",__func__, devaddr,txbuf[0], txcount, ret);
return ret;
}
return 0;
}
static int ds5_read(struct ds5 *state, u16 reg, u16 *val)
{
int ret = regmap_raw_read(state->regmap, reg, val, 2);
if (ret < 0)
dev_err(&state->client->dev, "%s(): i2c read failed %d, 0x%04x\n",
__func__, ret, reg);
else {
if (state->dfu_dev.dfu_state_flag == DS5_DFU_IDLE)
dev_dbg(&state->client->dev, "%s(): i2c read 0x%04x: 0x%x\n",
__func__, reg, *val);
}
return ret;
}