mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
HID: Intel-thc-hid: Intel-quicki2c: Add driver data support
This patch defines driver data structure and adds it into QuickI2C device structure. Changes PCI ID table to use PCI_DEVICE_DATA() to pass platform specific driver data into driver, let driver has capability to enable different hardware features according to different platform driver data. Signed-off-by: Even Xu <even.xu@intel.com> Signed-off-by: Jiri Kosina <jkosina@suse.com>
This commit is contained in:
parent
bccbe21e76
commit
48f151a537
|
|
@ -323,6 +323,7 @@ static irqreturn_t quicki2c_irq_thread_handler(int irq, void *dev_id)
|
|||
* quicki2c_dev_init - Initialize QuickI2C device
|
||||
* @pdev: Pointer to the THC PCI device
|
||||
* @mem_addr: The Pointer of MMIO memory address
|
||||
* @ddata: Point to quicki2c_ddata structure
|
||||
*
|
||||
* Alloc quicki2c_device structure and initialized THC device,
|
||||
* then configure THC to HIDI2C mode.
|
||||
|
|
@ -332,7 +333,8 @@ static irqreturn_t quicki2c_irq_thread_handler(int irq, void *dev_id)
|
|||
* Return: Pointer to the quicki2c_device structure if success
|
||||
* or NULL on failure.
|
||||
*/
|
||||
static struct quicki2c_device *quicki2c_dev_init(struct pci_dev *pdev, void __iomem *mem_addr)
|
||||
static struct quicki2c_device *quicki2c_dev_init(struct pci_dev *pdev, void __iomem *mem_addr,
|
||||
const struct quicki2c_ddata *ddata)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct quicki2c_device *qcdev;
|
||||
|
|
@ -346,6 +348,7 @@ static struct quicki2c_device *quicki2c_dev_init(struct pci_dev *pdev, void __io
|
|||
qcdev->dev = dev;
|
||||
qcdev->mem_addr = mem_addr;
|
||||
qcdev->state = QUICKI2C_DISABLED;
|
||||
qcdev->ddata = ddata;
|
||||
|
||||
init_waitqueue_head(&qcdev->reset_ack_wq);
|
||||
|
||||
|
|
@ -529,9 +532,9 @@ static int quicki2c_alloc_report_buf(struct quicki2c_device *qcdev)
|
|||
*
|
||||
* Return 0 if success or error code on failure.
|
||||
*/
|
||||
static int quicki2c_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *id)
|
||||
static int quicki2c_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
{
|
||||
const struct quicki2c_ddata *ddata = (const struct quicki2c_ddata *)id->driver_data;
|
||||
struct quicki2c_device *qcdev;
|
||||
void __iomem *mem_addr;
|
||||
int ret;
|
||||
|
|
@ -569,7 +572,7 @@ static int quicki2c_probe(struct pci_dev *pdev,
|
|||
|
||||
pdev->irq = pci_irq_vector(pdev, 0);
|
||||
|
||||
qcdev = quicki2c_dev_init(pdev, mem_addr);
|
||||
qcdev = quicki2c_dev_init(pdev, mem_addr, ddata);
|
||||
if (IS_ERR(qcdev)) {
|
||||
dev_err_once(&pdev->dev, "QuickI2C device init failed\n");
|
||||
ret = PTR_ERR(qcdev);
|
||||
|
|
@ -919,13 +922,13 @@ static const struct dev_pm_ops quicki2c_pm_ops = {
|
|||
};
|
||||
|
||||
static const struct pci_device_id quicki2c_pci_tbl[] = {
|
||||
{PCI_VDEVICE(INTEL, THC_LNL_DEVICE_ID_I2C_PORT1), },
|
||||
{PCI_VDEVICE(INTEL, THC_LNL_DEVICE_ID_I2C_PORT2), },
|
||||
{PCI_VDEVICE(INTEL, THC_PTL_H_DEVICE_ID_I2C_PORT1), },
|
||||
{PCI_VDEVICE(INTEL, THC_PTL_H_DEVICE_ID_I2C_PORT2), },
|
||||
{PCI_VDEVICE(INTEL, THC_PTL_U_DEVICE_ID_I2C_PORT1), },
|
||||
{PCI_VDEVICE(INTEL, THC_PTL_U_DEVICE_ID_I2C_PORT2), },
|
||||
{}
|
||||
{ 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) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, quicki2c_pci_tbl);
|
||||
|
||||
|
|
|
|||
|
|
@ -7,12 +7,12 @@
|
|||
#include <linux/hid-over-i2c.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
#define THC_LNL_DEVICE_ID_I2C_PORT1 0xA848
|
||||
#define THC_LNL_DEVICE_ID_I2C_PORT2 0xA84A
|
||||
#define THC_PTL_H_DEVICE_ID_I2C_PORT1 0xE348
|
||||
#define THC_PTL_H_DEVICE_ID_I2C_PORT2 0xE34A
|
||||
#define THC_PTL_U_DEVICE_ID_I2C_PORT1 0xE448
|
||||
#define THC_PTL_U_DEVICE_ID_I2C_PORT2 0xE44A
|
||||
#define PCI_DEVICE_ID_INTEL_THC_LNL_DEVICE_ID_I2C_PORT1 0xA848
|
||||
#define PCI_DEVICE_ID_INTEL_THC_LNL_DEVICE_ID_I2C_PORT2 0xA84A
|
||||
#define PCI_DEVICE_ID_INTEL_THC_PTL_H_DEVICE_ID_I2C_PORT1 0xE348
|
||||
#define PCI_DEVICE_ID_INTEL_THC_PTL_H_DEVICE_ID_I2C_PORT2 0xE34A
|
||||
#define PCI_DEVICE_ID_INTEL_THC_PTL_U_DEVICE_ID_I2C_PORT1 0xE448
|
||||
#define PCI_DEVICE_ID_INTEL_THC_PTL_U_DEVICE_ID_I2C_PORT2 0xE44A
|
||||
|
||||
/* Packet size value, the unit is 16 bytes */
|
||||
#define MAX_PACKET_SIZE_VALUE_LNL 256
|
||||
|
|
@ -122,6 +122,16 @@ struct quicki2c_subip_acpi_config {
|
|||
u64 HMSL;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct quicki2c_ddata - Driver specific data for quicki2c device
|
||||
* @max_detect_size: Identify max packet size detect for rx
|
||||
* @interrupt_delay: Identify interrupt detect delay for rx
|
||||
*/
|
||||
struct quicki2c_ddata {
|
||||
u32 max_detect_size;
|
||||
u32 interrupt_delay;
|
||||
};
|
||||
|
||||
struct device;
|
||||
struct pci_dev;
|
||||
struct thc_device;
|
||||
|
|
@ -135,6 +145,7 @@ struct acpi_device;
|
|||
* @thc_hw: Point to THC device
|
||||
* @hid_dev: Point to HID device
|
||||
* @acpi_dev: Point to ACPI device
|
||||
* @ddata: Point to QuickI2C platform specific driver data
|
||||
* @state: THC I2C device state
|
||||
* @mem_addr: MMIO memory address
|
||||
* @dev_desc: Device descriptor for HIDI2C protocol
|
||||
|
|
@ -158,6 +169,7 @@ struct quicki2c_device {
|
|||
struct thc_device *thc_hw;
|
||||
struct hid_device *hid_dev;
|
||||
struct acpi_device *acpi_dev;
|
||||
const struct quicki2c_ddata *ddata;
|
||||
enum quicki2c_dev_state state;
|
||||
|
||||
void __iomem *mem_addr;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user