Skip to content

Commit e088d05

Browse files
michalsieronmbolivar-nordic
authored andcommitted
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 <[email protected]>
1 parent 9f6c531 commit e088d05

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

drivers/i2c/i2c_litex.c

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@
2121
#define HIGH_STATE_ON_I2C_LINES 0x7
2222

2323
struct i2c_litex_cfg {
24-
volatile uint32_t *w_reg;
25-
volatile const uint32_t *r_reg;
24+
uint32_t write_addr;
25+
uint32_t read_addr;
2626
};
2727

2828
#define GET_I2C_CFG(dev) \
@@ -31,48 +31,48 @@ struct i2c_litex_cfg {
3131
#define GET_I2C_BITBANG(dev) \
3232
((struct i2c_bitbang *) dev->data)
3333

34-
static inline void set_bit(volatile uint32_t *reg, uint32_t bit, uint32_t val)
34+
static inline void set_bit(uint32_t addr, uint32_t bit, uint32_t val)
3535
{
3636
uint32_t mask = BIT(bit);
3737

3838
if (val) {
39-
*reg |= mask;
39+
litex_write8(litex_read8(addr) | mask, addr);
4040
} else {
41-
*reg &= ~mask;
41+
litex_write8(litex_read8(addr) & ~mask, addr);
4242
}
4343
}
4444

45-
static inline int get_bit(volatile const uint32_t *reg, uint32_t bit)
45+
static inline int get_bit(uint32_t addr, uint32_t bit)
4646
{
4747
uint32_t mask = BIT(bit);
4848

49-
return !!((*reg) & mask);
49+
return !!(litex_read8(addr) & mask);
5050
}
5151

5252
static void i2c_litex_bitbang_set_scl(void *context, int state)
5353
{
5454
const struct i2c_litex_cfg *config =
5555
(const struct i2c_litex_cfg *) context;
5656

57-
set_bit(config->w_reg, SCL_BIT_POS, state);
57+
set_bit(config->write_addr, SCL_BIT_POS, state);
5858
}
5959

6060
static void i2c_litex_bitbang_set_sda(void *context, int state)
6161
{
6262
const struct i2c_litex_cfg *config =
6363
(const struct i2c_litex_cfg *) context;
6464

65-
set_bit(config->w_reg, SDA_DIR_BIT_POS, SDA_DIR_OUTPUT);
66-
set_bit(config->w_reg, SDA_BIT_W_POS, state);
65+
set_bit(config->write_addr, SDA_DIR_BIT_POS, SDA_DIR_OUTPUT);
66+
set_bit(config->write_addr, SDA_BIT_W_POS, state);
6767
}
6868

6969
static int i2c_litex_bitbang_get_sda(void *context)
7070
{
7171
const struct i2c_litex_cfg *config =
7272
(const struct i2c_litex_cfg *) context;
7373

74-
set_bit(config->w_reg, SDA_DIR_BIT_POS, SDA_DIR_INPUT);
75-
return get_bit(config->r_reg, SDA_BIT_R_POS);
74+
set_bit(config->write_addr, SDA_DIR_BIT_POS, SDA_DIR_INPUT);
75+
return get_bit(config->read_addr, SDA_BIT_R_POS);
7676
}
7777

7878
static const struct i2c_bitbang_io i2c_litex_bitbang_io = {
@@ -86,7 +86,7 @@ static int i2c_litex_init(const struct device *dev)
8686
const struct i2c_litex_cfg *config = GET_I2C_CFG(dev);
8787
struct i2c_bitbang *bitbang = GET_I2C_BITBANG(dev);
8888

89-
*(config->w_reg) |= HIGH_STATE_ON_I2C_LINES;
89+
litex_write8(litex_read8(config->write_addr) | HIGH_STATE_ON_I2C_LINES, config->write_addr);
9090
i2c_bitbang_init(bitbang, &i2c_litex_bitbang_io, (void *)config);
9191

9292
return 0;
@@ -116,10 +116,8 @@ static const struct i2c_driver_api i2c_litex_driver_api = {
116116

117117
#define I2C_LITEX_INIT(n) \
118118
static const struct i2c_litex_cfg i2c_litex_cfg_##n = { \
119-
.w_reg = \
120-
(volatile uint32_t *) DT_INST_REG_ADDR_BY_NAME(n, write),\
121-
.r_reg = \
122-
(volatile uint32_t *) DT_INST_REG_ADDR_BY_NAME(n, read), \
119+
.write_addr = DT_INST_REG_ADDR_BY_NAME(n, write), \
120+
.read_addr = DT_INST_REG_ADDR_BY_NAME(n, read), \
123121
}; \
124122
\
125123
static struct i2c_bitbang i2c_bitbang_##n; \

0 commit comments

Comments
 (0)