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:
Tim Lin 2022-03-18 14:20:08 +08:00 committed by Anas Nashif
commit 0b9c0a0b23
2 changed files with 44 additions and 12 deletions

View file

@ -250,6 +250,7 @@ static int i2c_enhance_configure(const struct device *dev,
uint32_t dev_config_raw) uint32_t dev_config_raw)
{ {
const struct i2c_enhance_config *config = dev->config; const struct i2c_enhance_config *config = dev->config;
struct i2c_enhance_data *const data = dev->data;
if (!(I2C_MODE_MASTER & dev_config_raw)) { if (!(I2C_MODE_MASTER & dev_config_raw)) {
return -EINVAL; return -EINVAL;
@ -259,6 +260,8 @@ static int i2c_enhance_configure(const struct device *dev,
return -EINVAL; return -EINVAL;
} }
data->bus_freq = I2C_SPEED_GET(dev_config_raw);
i2c_enhanced_port_set_frequency(dev, config->bitrate); i2c_enhanced_port_set_frequency(dev, config->bitrate);
return 0; return 0;
@ -275,14 +278,11 @@ static int i2c_enhance_get_config(const struct device *dev, uint32_t *dev_config
} }
switch (data->bus_freq) { switch (data->bus_freq) {
case I2C_SPEED_DT:
case I2C_SPEED_STANDARD: case I2C_SPEED_STANDARD:
speed = I2C_SPEED_SET(I2C_SPEED_STANDARD);
break;
case I2C_SPEED_FAST: case I2C_SPEED_FAST:
speed = I2C_SPEED_SET(I2C_SPEED_FAST);
break;
case I2C_SPEED_FAST_PLUS: case I2C_SPEED_FAST_PLUS:
speed = I2C_SPEED_SET(I2C_SPEED_FAST_PLUS); speed = I2C_SPEED_SET(data->bus_freq);
break; break;
default: default:
return -ERANGE; return -ERANGE;
@ -620,7 +620,15 @@ static int i2c_enhance_init(const struct device *dev)
IT8XXX2_I2C_CTR1(base) = 0; IT8XXX2_I2C_CTR1(base) = 0;
/* Set clock frequency for I2C ports */ /* Set clock frequency for I2C ports */
bitrate_cfg = i2c_map_dt_bitrate(config->bitrate); 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); error = i2c_enhance_configure(dev, I2C_MODE_MASTER | bitrate_cfg);
data->i2ccs = I2C_CH_NORMAL; 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) \ #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 void i2c_enhance_config_func_##inst(void); \
static const struct i2c_alts_cfg \ static const struct i2c_alts_cfg \
i2c_alts_##inst[DT_INST_NUM_PINCTRLS_BY_IDX(inst, 0)] = \ i2c_alts_##inst[DT_INST_NUM_PINCTRLS_BY_IDX(inst, 0)] = \

View file

@ -235,6 +235,9 @@ static int i2c_it8xxx2_configure(const struct device *dev,
data->bus_freq = I2C_SPEED_GET(dev_config_raw); data->bus_freq = I2C_SPEED_GET(dev_config_raw);
switch (data->bus_freq) { switch (data->bus_freq) {
case I2C_SPEED_DT:
freq_set = IT8XXX2_SMB_SMCLKS_50K;
break;
case I2C_SPEED_STANDARD: case I2C_SPEED_STANDARD:
freq_set = IT8XXX2_SMB_SMCLKS_100K; freq_set = IT8XXX2_SMB_SMCLKS_100K;
break; break;
@ -265,14 +268,11 @@ static int i2c_it8xxx2_get_config(const struct device *dev,
} }
switch (data->bus_freq) { switch (data->bus_freq) {
case I2C_SPEED_DT:
case I2C_SPEED_STANDARD: case I2C_SPEED_STANDARD:
speed = I2C_SPEED_SET(I2C_SPEED_STANDARD);
break;
case I2C_SPEED_FAST: case I2C_SPEED_FAST:
speed = I2C_SPEED_SET(I2C_SPEED_FAST);
break;
case I2C_SPEED_FAST_PLUS: case I2C_SPEED_FAST_PLUS:
speed = I2C_SPEED_SET(I2C_SPEED_FAST_PLUS); speed = I2C_SPEED_SET(data->bus_freq);
break; break;
default: default:
return -ERANGE; return -ERANGE;
@ -649,7 +649,15 @@ static int i2c_it8xxx2_init(const struct device *dev)
IT8XXX2_SMB_HOCTL2(base) = 0x00; IT8XXX2_SMB_HOCTL2(base) = 0x00;
/* Set clock frequency for I2C ports */ /* Set clock frequency for I2C ports */
bitrate_cfg = i2c_map_dt_bitrate(config->bitrate); 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); error = i2c_it8xxx2_configure(dev, I2C_MODE_MASTER | bitrate_cfg);
data->i2ccs = I2C_CH_NORMAL; 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) \ #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 void i2c_it8xxx2_config_func_##inst(void); \
static const struct i2c_alts_cfg \ static const struct i2c_alts_cfg \
i2c_alts_##inst[DT_INST_NUM_PINCTRLS_BY_IDX(inst, 0)] = \ i2c_alts_##inst[DT_INST_NUM_PINCTRLS_BY_IDX(inst, 0)] = \