@@ -1112,34 +1112,43 @@ int thc_port_select(struct thc_device *dev, enum thc_port_type port_type)
11121112EXPORT_SYMBOL_NS_GPL (thc_port_select , "INTEL_THC" );
11131113
11141114#define THC_SPI_FREQUENCY_7M 7812500
1115+ #define THC_SPI_FREQUENCY_10M 10416700
11151116#define THC_SPI_FREQUENCY_15M 15625000
11161117#define THC_SPI_FREQUENCY_17M 17857100
11171118#define THC_SPI_FREQUENCY_20M 20833000
11181119#define THC_SPI_FREQUENCY_25M 25000000
11191120#define THC_SPI_FREQUENCY_31M 31250000
1121+ #define THC_SPI_FREQUENCY_35M 35714200
11201122#define THC_SPI_FREQUENCY_41M 41666700
1123+ #define THC_SPI_FREQUENCY_50M 50000000
11211124
11221125#define THC_SPI_LOW_FREQUENCY THC_SPI_FREQUENCY_17M
11231126
11241127static u8 thc_get_spi_freq_div_val (struct thc_device * dev , u32 spi_freq_val )
11251128{
11261129 static const int frequency [] = {
11271130 THC_SPI_FREQUENCY_7M ,
1131+ THC_SPI_FREQUENCY_10M ,
11281132 THC_SPI_FREQUENCY_15M ,
11291133 THC_SPI_FREQUENCY_17M ,
11301134 THC_SPI_FREQUENCY_20M ,
11311135 THC_SPI_FREQUENCY_25M ,
11321136 THC_SPI_FREQUENCY_31M ,
1137+ THC_SPI_FREQUENCY_35M ,
11331138 THC_SPI_FREQUENCY_41M ,
1139+ THC_SPI_FREQUENCY_50M ,
11341140 };
11351141 static const u8 frequency_div [] = {
11361142 THC_SPI_FRQ_DIV_2 ,
11371143 THC_SPI_FRQ_DIV_1 ,
1144+ THC_SPI_FRQ_DIV_1 ,
11381145 THC_SPI_FRQ_DIV_7 ,
11391146 THC_SPI_FRQ_DIV_6 ,
11401147 THC_SPI_FRQ_DIV_5 ,
11411148 THC_SPI_FRQ_DIV_4 ,
11421149 THC_SPI_FRQ_DIV_3 ,
1150+ THC_SPI_FRQ_DIV_3 ,
1151+ THC_SPI_FRQ_DIV_2 ,
11431152 };
11441153 int size = ARRAY_SIZE (frequency );
11451154 u32 closest_freq ;
@@ -1190,6 +1199,25 @@ int thc_spi_read_config(struct thc_device *dev, u32 spi_freq_val,
11901199 if (spi_freq_val < THC_SPI_LOW_FREQUENCY )
11911200 is_low_freq = true;
11921201
1202+ /* 10M, 35M and 50M CLK need 1.5, 3.5 and 2.5 half divider */
1203+ if ((freq_div == THC_SPI_FRQ_DIV_2 && spi_freq_val >= THC_SPI_FREQUENCY_50M ) ||
1204+ (freq_div == THC_SPI_FRQ_DIV_3 && spi_freq_val < THC_SPI_FREQUENCY_41M ) ||
1205+ (freq_div == THC_SPI_FRQ_DIV_1 && spi_freq_val < THC_SPI_FREQUENCY_15M )) {
1206+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPI_DUTYC_CFG_OFFSET ,
1207+ THC_M_PRT_SPI_DUTYC_CFG_SPI_TCRF_HALF_DIV_EN ,
1208+ THC_M_PRT_SPI_DUTYC_CFG_SPI_TCRF_HALF_DIV_EN );
1209+
1210+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPARE_REG_OFFSET ,
1211+ THC_M_PRT_SPARE_REG_SPI_CLK_INV_ENABLE ,
1212+ THC_M_PRT_SPARE_REG_SPI_CLK_INV_ENABLE );
1213+ } else {
1214+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPI_DUTYC_CFG_OFFSET ,
1215+ THC_M_PRT_SPI_DUTYC_CFG_SPI_TCRF_HALF_DIV_EN , 0 );
1216+
1217+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPARE_REG_OFFSET ,
1218+ THC_M_PRT_SPARE_REG_SPI_CLK_INV_ENABLE , 0 );
1219+ }
1220+
11931221 cfg = FIELD_PREP (THC_M_PRT_SPI_CFG_SPI_TCRF , freq_div ) |
11941222 FIELD_PREP (THC_M_PRT_SPI_CFG_SPI_TRMODE , io_mode ) |
11951223 (is_low_freq ? THC_M_PRT_SPI_CFG_SPI_LOW_FREQ_EN : 0 ) |
@@ -1243,6 +1271,25 @@ int thc_spi_write_config(struct thc_device *dev, u32 spi_freq_val,
12431271 if (spi_freq_val < THC_SPI_LOW_FREQUENCY )
12441272 is_low_freq = true;
12451273
1274+ /* 10M, 35M and 50M CLK need 1.5, 3.5 and 2.5 half divider */
1275+ if ((freq_div == THC_SPI_FRQ_DIV_2 && spi_freq_val >= THC_SPI_FREQUENCY_50M ) ||
1276+ (freq_div == THC_SPI_FRQ_DIV_3 && spi_freq_val < THC_SPI_FREQUENCY_41M ) ||
1277+ (freq_div == THC_SPI_FRQ_DIV_1 && spi_freq_val < THC_SPI_FREQUENCY_15M )) {
1278+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPI_DUTYC_CFG_OFFSET ,
1279+ THC_M_PRT_SPI_DUTYC_CFG_SPI_TCWF_HALF_DIV_EN ,
1280+ THC_M_PRT_SPI_DUTYC_CFG_SPI_TCWF_HALF_DIV_EN );
1281+
1282+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPARE_REG_OFFSET ,
1283+ THC_M_PRT_SPARE_REG_SPI_CLK_INV_ENABLE ,
1284+ THC_M_PRT_SPARE_REG_SPI_CLK_INV_ENABLE );
1285+ } else {
1286+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPI_DUTYC_CFG_OFFSET ,
1287+ THC_M_PRT_SPI_DUTYC_CFG_SPI_TCWF_HALF_DIV_EN , 0 );
1288+
1289+ regmap_write_bits (dev -> thc_regmap , THC_M_PRT_SPARE_REG_OFFSET ,
1290+ THC_M_PRT_SPARE_REG_SPI_CLK_INV_ENABLE , 0 );
1291+ }
1292+
12461293 cfg = FIELD_PREP (THC_M_PRT_SPI_CFG_SPI_TCWF , freq_div ) |
12471294 FIELD_PREP (THC_M_PRT_SPI_CFG_SPI_TWMODE , io_mode ) |
12481295 (is_low_freq ? THC_M_PRT_SPI_CFG_SPI_LOW_FREQ_EN : 0 ) |
0 commit comments