mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 07:33:19 +02:00
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:
parent
48f151a537
commit
2c7c9c5db3
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user