ITE: drivers/i2c: implement i2c specified speed option of 50 KHz
Implement i2c specified speed option of 50 KHz in ITE i2c driver. Signed-off-by: Tim Lin <tim2.lin@ite.corp-partner.google.com>
This commit is contained in:
parent
64b2bd7342
commit
0b9c0a0b23
2 changed files with 44 additions and 12 deletions
|
@ -250,6 +250,7 @@ static int i2c_enhance_configure(const struct device *dev,
|
|||
uint32_t dev_config_raw)
|
||||
{
|
||||
const struct i2c_enhance_config *config = dev->config;
|
||||
struct i2c_enhance_data *const data = dev->data;
|
||||
|
||||
if (!(I2C_MODE_MASTER & dev_config_raw)) {
|
||||
return -EINVAL;
|
||||
|
@ -259,6 +260,8 @@ static int i2c_enhance_configure(const struct device *dev,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
data->bus_freq = I2C_SPEED_GET(dev_config_raw);
|
||||
|
||||
i2c_enhanced_port_set_frequency(dev, config->bitrate);
|
||||
|
||||
return 0;
|
||||
|
@ -275,14 +278,11 @@ static int i2c_enhance_get_config(const struct device *dev, uint32_t *dev_config
|
|||
}
|
||||
|
||||
switch (data->bus_freq) {
|
||||
case I2C_SPEED_DT:
|
||||
case I2C_SPEED_STANDARD:
|
||||
speed = I2C_SPEED_SET(I2C_SPEED_STANDARD);
|
||||
break;
|
||||
case I2C_SPEED_FAST:
|
||||
speed = I2C_SPEED_SET(I2C_SPEED_FAST);
|
||||
break;
|
||||
case I2C_SPEED_FAST_PLUS:
|
||||
speed = I2C_SPEED_SET(I2C_SPEED_FAST_PLUS);
|
||||
speed = I2C_SPEED_SET(data->bus_freq);
|
||||
break;
|
||||
default:
|
||||
return -ERANGE;
|
||||
|
@ -620,7 +620,15 @@ static int i2c_enhance_init(const struct device *dev)
|
|||
IT8XXX2_I2C_CTR1(base) = 0;
|
||||
|
||||
/* Set clock frequency for I2C ports */
|
||||
if (config->bitrate == I2C_BITRATE_STANDARD ||
|
||||
config->bitrate == I2C_BITRATE_FAST ||
|
||||
config->bitrate == I2C_BITRATE_FAST_PLUS) {
|
||||
bitrate_cfg = i2c_map_dt_bitrate(config->bitrate);
|
||||
} else {
|
||||
/* Device tree specified speed */
|
||||
bitrate_cfg = I2C_SPEED_DT << I2C_SPEED_SHIFT;
|
||||
}
|
||||
|
||||
error = i2c_enhance_configure(dev, I2C_MODE_MASTER | bitrate_cfg);
|
||||
data->i2ccs = I2C_CH_NORMAL;
|
||||
|
||||
|
@ -717,6 +725,14 @@ static const struct i2c_driver_api i2c_enhance_driver_api = {
|
|||
};
|
||||
|
||||
#define I2C_ITE_ENHANCE_INIT(inst) \
|
||||
BUILD_ASSERT((DT_INST_PROP(inst, clock_frequency) == \
|
||||
50000) || \
|
||||
(DT_INST_PROP(inst, clock_frequency) == \
|
||||
I2C_BITRATE_STANDARD) || \
|
||||
(DT_INST_PROP(inst, clock_frequency) == \
|
||||
I2C_BITRATE_FAST) || \
|
||||
(DT_INST_PROP(inst, clock_frequency) == \
|
||||
I2C_BITRATE_FAST_PLUS), "Not support I2C bit rate value"); \
|
||||
static void i2c_enhance_config_func_##inst(void); \
|
||||
static const struct i2c_alts_cfg \
|
||||
i2c_alts_##inst[DT_INST_NUM_PINCTRLS_BY_IDX(inst, 0)] = \
|
||||
|
|
|
@ -235,6 +235,9 @@ static int i2c_it8xxx2_configure(const struct device *dev,
|
|||
data->bus_freq = I2C_SPEED_GET(dev_config_raw);
|
||||
|
||||
switch (data->bus_freq) {
|
||||
case I2C_SPEED_DT:
|
||||
freq_set = IT8XXX2_SMB_SMCLKS_50K;
|
||||
break;
|
||||
case I2C_SPEED_STANDARD:
|
||||
freq_set = IT8XXX2_SMB_SMCLKS_100K;
|
||||
break;
|
||||
|
@ -265,14 +268,11 @@ static int i2c_it8xxx2_get_config(const struct device *dev,
|
|||
}
|
||||
|
||||
switch (data->bus_freq) {
|
||||
case I2C_SPEED_DT:
|
||||
case I2C_SPEED_STANDARD:
|
||||
speed = I2C_SPEED_SET(I2C_SPEED_STANDARD);
|
||||
break;
|
||||
case I2C_SPEED_FAST:
|
||||
speed = I2C_SPEED_SET(I2C_SPEED_FAST);
|
||||
break;
|
||||
case I2C_SPEED_FAST_PLUS:
|
||||
speed = I2C_SPEED_SET(I2C_SPEED_FAST_PLUS);
|
||||
speed = I2C_SPEED_SET(data->bus_freq);
|
||||
break;
|
||||
default:
|
||||
return -ERANGE;
|
||||
|
@ -649,7 +649,15 @@ static int i2c_it8xxx2_init(const struct device *dev)
|
|||
IT8XXX2_SMB_HOCTL2(base) = 0x00;
|
||||
|
||||
/* Set clock frequency for I2C ports */
|
||||
if (config->bitrate == I2C_BITRATE_STANDARD ||
|
||||
config->bitrate == I2C_BITRATE_FAST ||
|
||||
config->bitrate == I2C_BITRATE_FAST_PLUS) {
|
||||
bitrate_cfg = i2c_map_dt_bitrate(config->bitrate);
|
||||
} else {
|
||||
/* Device tree specified speed */
|
||||
bitrate_cfg = I2C_SPEED_DT << I2C_SPEED_SHIFT;
|
||||
}
|
||||
|
||||
error = i2c_it8xxx2_configure(dev, I2C_MODE_MASTER | bitrate_cfg);
|
||||
data->i2ccs = I2C_CH_NORMAL;
|
||||
|
||||
|
@ -746,6 +754,14 @@ static const struct i2c_driver_api i2c_it8xxx2_driver_api = {
|
|||
};
|
||||
|
||||
#define I2C_ITE_IT8XXX2_INIT(inst) \
|
||||
BUILD_ASSERT((DT_INST_PROP(inst, clock_frequency) == \
|
||||
50000) || \
|
||||
(DT_INST_PROP(inst, clock_frequency) == \
|
||||
I2C_BITRATE_STANDARD) || \
|
||||
(DT_INST_PROP(inst, clock_frequency) == \
|
||||
I2C_BITRATE_FAST) || \
|
||||
(DT_INST_PROP(inst, clock_frequency) == \
|
||||
I2C_BITRATE_FAST_PLUS), "Not support I2C bit rate value"); \
|
||||
static void i2c_it8xxx2_config_func_##inst(void); \
|
||||
static const struct i2c_alts_cfg \
|
||||
i2c_alts_##inst[DT_INST_NUM_PINCTRLS_BY_IDX(inst, 0)] = \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue