@@ -110,7 +110,7 @@ static uint32_t regval_speed[I2C_SPEED_MAX] = {
110110 * For example, standard mode is 100KHz, 10000ns per period, 5000ns for
111111 * SCL low & high level.
112112 */
113- #define I2C_SS_SCL_HIGH 4500
113+ #define I2C_SS_SCL_HIGH 4640
114114#define I2C_SS_SCL_LOW 5100
115115#define I2C_FS_SCL_HIGH 690
116116#define I2C_FS_SCL_LOW 1650
@@ -1126,6 +1126,25 @@ int32_t sedi_i2c_control(IN sedi_i2c_t i2c_device, IN uint32_t control, IN uint3
11261126 case SEDI_I2C_SET_RX_MEMORY_TYPE :
11271127 context -> rx_memory_type = arg ;
11281128 break ;
1129+ case SEDI_I2C_SET_BUS_DATA_STD :
1130+ case SEDI_I2C_SET_BUS_DATA_FST :
1131+ case SEDI_I2C_SET_BUS_DATA_FSP :
1132+ case SEDI_I2C_SET_BUS_DATA_HIGH :
1133+ {
1134+ const sedi_i2c_bus_clk_t * bus_clk = (const sedi_i2c_bus_clk_t * )arg ;
1135+ sedi_i2c_bus_clk_t * bus_clk_ptr = & context -> bus_info .std_clk ;
1136+ uint32_t idx = control - SEDI_I2C_SET_BUS_DATA_STD ;
1137+
1138+ DBG_CHECK (NULL != bus_clk , SEDI_DRIVER_ERROR_PARAMETER );
1139+ DBG_CHECK (idx < sizeof (context -> bus_info ) / sizeof (sedi_i2c_bus_clk_t ),
1140+ SEDI_DRIVER_ERROR_PARAMETER );
1141+
1142+ bus_clk_ptr = bus_clk_ptr + idx ;
1143+ bus_clk_ptr -> sda_hold = LBW_CLK_MHZ * bus_clk -> sda_hold / NS_PER_US ;
1144+ bus_clk_ptr -> hcnt = LBW_CLK_MHZ * bus_clk -> hcnt / NS_PER_US ;
1145+ bus_clk_ptr -> lcnt = LBW_CLK_MHZ * bus_clk -> lcnt / NS_PER_US ;
1146+ }
1147+ break ;
11291148 default :
11301149 ret = SEDI_DRIVER_ERROR ;
11311150 break ;
0 commit comments