diff --git a/drivers/i2c/i2c_litex.c b/drivers/i2c/i2c_litex.c index e8729ffa3e4..8f429ba5e59 100644 --- a/drivers/i2c/i2c_litex.c +++ b/drivers/i2c/i2c_litex.c @@ -21,8 +21,8 @@ #define HIGH_STATE_ON_I2C_LINES 0x7 struct i2c_litex_cfg { - volatile uint32_t *w_reg; - volatile const uint32_t *r_reg; + uint32_t write_addr; + uint32_t read_addr; }; #define GET_I2C_CFG(dev) \ @@ -31,22 +31,22 @@ struct i2c_litex_cfg { #define GET_I2C_BITBANG(dev) \ ((struct i2c_bitbang *) dev->data) -static inline void set_bit(volatile uint32_t *reg, uint32_t bit, uint32_t val) +static inline void set_bit(uint32_t addr, uint32_t bit, uint32_t val) { uint32_t mask = BIT(bit); if (val) { - *reg |= mask; + litex_write8(litex_read8(addr) | mask, addr); } else { - *reg &= ~mask; + litex_write8(litex_read8(addr) & ~mask, addr); } } -static inline int get_bit(volatile const uint32_t *reg, uint32_t bit) +static inline int get_bit(uint32_t addr, uint32_t bit) { uint32_t mask = BIT(bit); - return !!((*reg) & mask); + return !!(litex_read8(addr) & mask); } static void i2c_litex_bitbang_set_scl(void *context, int state) @@ -54,7 +54,7 @@ static void i2c_litex_bitbang_set_scl(void *context, int state) const struct i2c_litex_cfg *config = (const struct i2c_litex_cfg *) context; - set_bit(config->w_reg, SCL_BIT_POS, state); + set_bit(config->write_addr, SCL_BIT_POS, state); } static void i2c_litex_bitbang_set_sda(void *context, int state) @@ -62,8 +62,8 @@ static void i2c_litex_bitbang_set_sda(void *context, int state) const struct i2c_litex_cfg *config = (const struct i2c_litex_cfg *) context; - set_bit(config->w_reg, SDA_DIR_BIT_POS, SDA_DIR_OUTPUT); - set_bit(config->w_reg, SDA_BIT_W_POS, state); + set_bit(config->write_addr, SDA_DIR_BIT_POS, SDA_DIR_OUTPUT); + set_bit(config->write_addr, SDA_BIT_W_POS, state); } static int i2c_litex_bitbang_get_sda(void *context) @@ -71,8 +71,8 @@ static int i2c_litex_bitbang_get_sda(void *context) const struct i2c_litex_cfg *config = (const struct i2c_litex_cfg *) context; - set_bit(config->w_reg, SDA_DIR_BIT_POS, SDA_DIR_INPUT); - return get_bit(config->r_reg, SDA_BIT_R_POS); + set_bit(config->write_addr, SDA_DIR_BIT_POS, SDA_DIR_INPUT); + return get_bit(config->read_addr, SDA_BIT_R_POS); } static const struct i2c_bitbang_io i2c_litex_bitbang_io = { @@ -86,7 +86,7 @@ static int i2c_litex_init(const struct device *dev) const struct i2c_litex_cfg *config = GET_I2C_CFG(dev); struct i2c_bitbang *bitbang = GET_I2C_BITBANG(dev); - *(config->w_reg) |= HIGH_STATE_ON_I2C_LINES; + litex_write8(litex_read8(config->write_addr) | HIGH_STATE_ON_I2C_LINES, config->write_addr); i2c_bitbang_init(bitbang, &i2c_litex_bitbang_io, (void *)config); return 0; @@ -116,10 +116,8 @@ static const struct i2c_driver_api i2c_litex_driver_api = { #define I2C_LITEX_INIT(n) \ static const struct i2c_litex_cfg i2c_litex_cfg_##n = { \ - .w_reg = \ - (volatile uint32_t *) DT_INST_REG_ADDR_BY_NAME(n, write),\ - .r_reg = \ - (volatile uint32_t *) DT_INST_REG_ADDR_BY_NAME(n, read), \ + .write_addr = DT_INST_REG_ADDR_BY_NAME(n, write), \ + .read_addr = DT_INST_REG_ADDR_BY_NAME(n, read), \ }; \ \ static struct i2c_bitbang i2c_bitbang_##n; \