Skip to content

Commit 88919be

Browse files
EvenxfJiri Kosina
authored andcommitted
HID: intel-thc-hid: Intel-thc: Add more frequency support for SPI
The Nova Lake platform enhances THC with half divider capability for clock division, allowing more granular frequency control for the THC SPI port. Supported frequencies include 50MHz (125MHz/2.5), 35MHz (125MHz/3.5), and 10MHz (125MHz/8/1.5). Signed-off-by: Even Xu <even.xu@intel.com> Tested-by: Rui Zhang <rui1.zhang@intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.com>
1 parent 4ba38ee commit 88919be

2 files changed

Lines changed: 51 additions & 0 deletions

File tree

drivers/hid/intel-thc-hid/intel-thc/intel-thc-dev.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,34 +1112,43 @@ int thc_port_select(struct thc_device *dev, enum thc_port_type port_type)
11121112
EXPORT_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

11241127
static 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) |

drivers/hid/intel-thc-hid/intel-thc/intel-thc-hw.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -643,6 +643,10 @@
643643

644644
#define THC_M_PRT_SPI_DUTYC_CFG_SPI_CSA_CK_DELAY_VAL GENMASK(3, 0)
645645
#define THC_M_PRT_SPI_DUTYC_CFG_SPI_CSA_CK_DELAY_EN BIT(25)
646+
#define THC_M_PRT_SPI_DUTYC_CFG_SPI_TCRF_HALF_DIV_EN BIT(30)
647+
#define THC_M_PRT_SPI_DUTYC_CFG_SPI_TCWF_HALF_DIV_EN BIT(31)
648+
649+
#define THC_M_PRT_SPARE_REG_SPI_CLK_INV_ENABLE BIT(2)
646650

647651
/* CS Assertion delay default value */
648652
#define THC_CSA_CK_DELAY_VAL_DEFAULT 4

0 commit comments

Comments
 (0)