HID: Intel-thc-hid: Intel-quicki2c: Add two new features to PTL

On Panther Lake platform (PTL), THC hardware introduces two new features
for I2C subsystem:
- Input max input size control
- Input interrupt delay

This patch adds above new advanced features into QuickI2C driver, and
enables max input size control feature on PTL to improve QuickI2C
driver compatibility.

Signed-off-by: Even Xu <even.xu@intel.com>
Tested-by: Chong Han <chong.han@intel.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
This commit is contained in:
Even Xu 2025-05-14 14:19:44 +08:00 committed by Jiri Kosina
parent 48f151a537
commit 2c7c9c5db3
2 changed files with 64 additions and 4 deletions

View File

@ -18,6 +18,10 @@
#include "quicki2c-hid.h"
#include "quicki2c-protocol.h"
struct quicki2c_ddata ptl_ddata = {
.max_detect_size = MAX_RX_DETECT_SIZE_PTL,
};
/* THC QuickI2C ACPI method to get device properties */
/* HIDI2C device method */
static guid_t i2c_hid_guid =
@ -408,6 +412,50 @@ static void quicki2c_dev_deinit(struct quicki2c_device *qcdev)
qcdev->state = QUICKI2C_DISABLED;
}
/**
* quicki2c_dma_adv_enable - Configure and enable DMA advanced features
* @qcdev: Pointer to the quicki2c_device structure
*
* If platform supports THC DMA advanced features, such as max input size
* control or interrupt delay, configures and enables them.
*/
static void quicki2c_dma_adv_enable(struct quicki2c_device *qcdev)
{
/*
* If platform supports max input size control feature and touch device
* max input length <= THC detect capability, enable the feature with device
* max input length.
*/
if (qcdev->ddata->max_detect_size >=
le16_to_cpu(qcdev->dev_desc.max_input_len)) {
thc_i2c_set_rx_max_size(qcdev->thc_hw,
le16_to_cpu(qcdev->dev_desc.max_input_len));
thc_i2c_rx_max_size_enable(qcdev->thc_hw, true);
}
/* If platform supports interrupt delay feature, enable it with given delay */
if (qcdev->ddata->interrupt_delay) {
thc_i2c_set_rx_int_delay(qcdev->thc_hw,
qcdev->ddata->interrupt_delay);
thc_i2c_rx_int_delay_enable(qcdev->thc_hw, true);
}
}
/**
* quicki2c_dma_adv_disable - Disable DMA advanced features
* @qcdev: Pointer to the quicki2c device structure
*
* Disable all DMA advanced features if platform supports.
*/
static void quicki2c_dma_adv_disable(struct quicki2c_device *qcdev)
{
if (qcdev->ddata->max_detect_size)
thc_i2c_rx_max_size_enable(qcdev->thc_hw, false);
if (qcdev->ddata->interrupt_delay)
thc_i2c_rx_int_delay_enable(qcdev->thc_hw, false);
}
/**
* quicki2c_dma_init - Configure THC DMA for QuickI2C device
* @qcdev: Pointer to the quicki2c_device structure
@ -447,6 +495,9 @@ static int quicki2c_dma_init(struct quicki2c_device *qcdev)
return ret;
}
if (qcdev->ddata)
quicki2c_dma_adv_enable(qcdev);
return 0;
}
@ -461,6 +512,9 @@ static void quicki2c_dma_deinit(struct quicki2c_device *qcdev)
{
thc_dma_unconfigure(qcdev->thc_hw);
thc_dma_release(qcdev->thc_hw);
if (qcdev->ddata)
quicki2c_dma_adv_disable(qcdev);
}
/**
@ -924,10 +978,10 @@ static const struct dev_pm_ops quicki2c_pm_ops = {
static const struct pci_device_id quicki2c_pci_tbl[] = {
{ PCI_DEVICE_DATA(INTEL, THC_LNL_DEVICE_ID_I2C_PORT1, NULL) },
{ PCI_DEVICE_DATA(INTEL, THC_LNL_DEVICE_ID_I2C_PORT2, NULL) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_H_DEVICE_ID_I2C_PORT1, NULL) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_H_DEVICE_ID_I2C_PORT2, NULL) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_U_DEVICE_ID_I2C_PORT1, NULL) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_U_DEVICE_ID_I2C_PORT2, NULL) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_H_DEVICE_ID_I2C_PORT1, &ptl_ddata) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_H_DEVICE_ID_I2C_PORT2, &ptl_ddata) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_U_DEVICE_ID_I2C_PORT1, &ptl_ddata) },
{ PCI_DEVICE_DATA(INTEL, THC_PTL_U_DEVICE_ID_I2C_PORT2, &ptl_ddata) },
{ }
};
MODULE_DEVICE_TABLE(pci, quicki2c_pci_tbl);

View File

@ -36,6 +36,12 @@
#define QUICKI2C_DEFAULT_LP_LTR_VALUE 500
#define QUICKI2C_RPM_TIMEOUT_MS 500
/* PTL Max packet size detection capability is 255 Bytes */
#define MAX_RX_DETECT_SIZE_PTL 255
/* Default interrupt delay is 1ms, suitable for most devices */
#define DEFAULT_INTERRUPT_DELAY_US (1 * USEC_PER_MSEC)
/*
* THC uses runtime auto suspend to dynamically switch between THC active LTR
* and low power LTR to save CPU power.