drivers: i2c: i2c_litex: Use LiteX HAL

LiteX HAL should be used when accessing Control/Status registers to provide
compatibility between different data widths of CSRs.

Signed-off-by: Michal Sieron <msieron@internships.antmicro.com>
This commit is contained in:
Michal Sieron 2022-05-23 15:21:07 +02:00 committed by Marti Bolivar
commit e088d05159

View file

@ -21,8 +21,8 @@
#define HIGH_STATE_ON_I2C_LINES 0x7 #define HIGH_STATE_ON_I2C_LINES 0x7
struct i2c_litex_cfg { struct i2c_litex_cfg {
volatile uint32_t *w_reg; uint32_t write_addr;
volatile const uint32_t *r_reg; uint32_t read_addr;
}; };
#define GET_I2C_CFG(dev) \ #define GET_I2C_CFG(dev) \
@ -31,22 +31,22 @@ struct i2c_litex_cfg {
#define GET_I2C_BITBANG(dev) \ #define GET_I2C_BITBANG(dev) \
((struct i2c_bitbang *) dev->data) ((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); uint32_t mask = BIT(bit);
if (val) { if (val) {
*reg |= mask; litex_write8(litex_read8(addr) | mask, addr);
} else { } 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); uint32_t mask = BIT(bit);
return !!((*reg) & mask); return !!(litex_read8(addr) & mask);
} }
static void i2c_litex_bitbang_set_scl(void *context, int state) 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 *config =
(const struct i2c_litex_cfg *) context; (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) 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 *config =
(const struct i2c_litex_cfg *) context; (const struct i2c_litex_cfg *) context;
set_bit(config->w_reg, SDA_DIR_BIT_POS, SDA_DIR_OUTPUT); set_bit(config->write_addr, SDA_DIR_BIT_POS, SDA_DIR_OUTPUT);
set_bit(config->w_reg, SDA_BIT_W_POS, state); set_bit(config->write_addr, SDA_BIT_W_POS, state);
} }
static int i2c_litex_bitbang_get_sda(void *context) 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 *config =
(const struct i2c_litex_cfg *) context; (const struct i2c_litex_cfg *) context;
set_bit(config->w_reg, SDA_DIR_BIT_POS, SDA_DIR_INPUT); set_bit(config->write_addr, SDA_DIR_BIT_POS, SDA_DIR_INPUT);
return get_bit(config->r_reg, SDA_BIT_R_POS); return get_bit(config->read_addr, SDA_BIT_R_POS);
} }
static const struct i2c_bitbang_io i2c_litex_bitbang_io = { 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); const struct i2c_litex_cfg *config = GET_I2C_CFG(dev);
struct i2c_bitbang *bitbang = GET_I2C_BITBANG(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); i2c_bitbang_init(bitbang, &i2c_litex_bitbang_io, (void *)config);
return 0; return 0;
@ -116,10 +116,8 @@ static const struct i2c_driver_api i2c_litex_driver_api = {
#define I2C_LITEX_INIT(n) \ #define I2C_LITEX_INIT(n) \
static const struct i2c_litex_cfg i2c_litex_cfg_##n = { \ static const struct i2c_litex_cfg i2c_litex_cfg_##n = { \
.w_reg = \ .write_addr = DT_INST_REG_ADDR_BY_NAME(n, write), \
(volatile uint32_t *) DT_INST_REG_ADDR_BY_NAME(n, write),\ .read_addr = DT_INST_REG_ADDR_BY_NAME(n, read), \
.r_reg = \
(volatile uint32_t *) DT_INST_REG_ADDR_BY_NAME(n, read), \
}; \ }; \
\ \
static struct i2c_bitbang i2c_bitbang_##n; \ static struct i2c_bitbang i2c_bitbang_##n; \