/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2024 Intel Corporation */
#ifndef _INTEL_THC_DEV_H_
#define _INTEL_THC_DEV_H_
#include <linux/cdev.h>
#include <linux/mutex.h>
#include <linux/workqueue.h>
#include "intel-thc-dma.h"
#include "intel-thc-wot.h"
#define THC_REGMAP_COMMON_OFFSET 0 x10
#define THC_REGMAP_MMIO_OFFSET 0 x1000
/*
* THC Port type
* @ THC_PORT_TYPE_SPI : This port is used for HIDSPI
* @ THC_PORT_TYPE_I2C : This port is used for HIDI2C
*/
enum thc_port_type {
THC_PORT_TYPE_SPI = 0 ,
THC_PORT_TYPE_I2C = 1 ,
};
/**
* THC interrupt flag
* @ THC_NONDMA_INT : THC non - DMA interrupt
* @ THC_RXDMA1_INT : THC RxDMA1 interrupt
* @ THC_RXDMA2_INT : THC RxDMA2 interrupt
* @ THC_SWDMA_INT : THC SWDMA interrupt
* @ THC_TXDMA_INT : THC TXDMA interrupt
* @ THC_PIO_DONE_INT : THC PIO complete interrupt
* @ THC_I2CSUBIP_INT : THC I2C subsystem interrupt
* @ THC_TXN_ERR_INT : THC transfer error interrupt
* @ THC_FATAL_ERR_INT : THC fatal error interrupt
*/
enum thc_int_type {
THC_NONDMA_INT = 0 ,
THC_RXDMA1_INT = 1 ,
THC_RXDMA2_INT = 2 ,
THC_SWDMA_INT = 3 ,
THC_TXDMA_INT = 4 ,
THC_PIO_DONE_INT = 5 ,
THC_I2CSUBIP_INT = 6 ,
THC_TXN_ERR_INT = 7 ,
THC_FATAL_ERR_INT = 8 ,
THC_UNKNOWN_INT
};
/**
* struct thc_device - THC private device struct
* @ thc_regmap : MMIO regmap structure for accessing THC registers
* @ mmio_addr : MMIO registers address
* @ thc_bus_lock : Mutex locker for THC config
* @ port_type : Port type of THC port instance
* @ pio_int_supported : PIO interrupt supported flag
* @ dma_ctx : DMA specific data
* @ wot : THC Wake - on - Touch data
* @ write_complete_wait : Signal event for DMA write complete
* @ swdma_complete_wait : Signal event for SWDMA sequence complete
* @ write_done : Bool value that indicates if DMA write is done
* @ swdma_done : Bool value that indicates if SWDMA sequence is done
* @ perf_limit : The delay between read operation and write operation
* @ i2c_subip_regs : The copy of THC I2C sub - system registers for resuming restore
* @ i2c_max_rx_size : I2C Rx transfer max input size
* @ i2c_int_delay_us : I2C input interrupt delay , unit is us
* @ i2c_max_rx_size_en : Bool value that indicates I2C max input size control enabled or not
* @ i2c_int_delay_en : Bool value that indicates I2C input interrupt delay enabled or not
*/
struct thc_device {
struct device *dev;
struct regmap *thc_regmap;
void __iomem *mmio_addr;
struct mutex thc_bus_lock;
enum thc_port_type port_type;
bool pio_int_supported;
struct thc_dma_context *dma_ctx;
struct thc_wot wot;
wait_queue_head_t write_complete_wait;
wait_queue_head_t swdma_complete_wait;
bool write_done;
bool swdma_done;
u32 perf_limit;
u32 *i2c_subip_regs;
u32 i2c_max_rx_size;
u32 i2c_int_delay_us;
bool i2c_max_rx_size_en;
bool i2c_int_delay_en;
};
struct thc_device *thc_dev_init(struct device *device, void __iomem *mem_addr);
int thc_tic_pio_read(struct thc_device *dev, const u32 address,
const u32 size, u32 *actual_size, u32 *buffer);
int thc_tic_pio_write(struct thc_device *dev, const u32 address,
const u32 size, const u32 *buffer);
int thc_tic_pio_write_and_read(struct thc_device *dev, const u32 address,
const u32 write_size, const u32 *write_buffer,
const u32 read_size, u32 *actual_size, u32 *read_buffer);
void thc_interrupt_config(struct thc_device *dev);
void thc_int_trigger_type_select(struct thc_device *dev, bool edge_trigger);
void thc_interrupt_enable(struct thc_device *dev, bool int_enable);
void thc_set_pio_interrupt_support(struct thc_device *dev, bool supported);
int thc_interrupt_quiesce(const struct thc_device *dev, bool int_quiesce);
void thc_ltr_config(struct thc_device *dev, u32 active_ltr_us, u32 lp_ltr_us);
void thc_change_ltr_mode(struct thc_device *dev, u32 ltr_mode);
void thc_ltr_unconfig(struct thc_device *dev);
u32 thc_int_cause_read(struct thc_device *dev);
int thc_interrupt_handler(struct thc_device *dev);
int thc_port_select(struct thc_device *dev, enum thc_port_type port_type);
int thc_spi_read_config(struct thc_device *dev, u32 spi_freq_val,
u32 io_mode, u32 opcode, u32 spi_rd_mps);
int thc_spi_write_config(struct thc_device *dev, u32 spi_freq_val,
u32 io_mode, u32 opcode, u32 spi_wr_mps, u32 perf_limit);
void thc_spi_input_output_address_config(struct thc_device *dev, u32 input_hdr_addr,
u32 input_bdy_addr, u32 output_addr);
int thc_i2c_subip_init(struct thc_device *dev, const u32 target_address,
const u32 speed, const u32 hcnt, const u32 lcnt);
int thc_i2c_subip_regs_save(struct thc_device *dev);
int thc_i2c_subip_regs_restore(struct thc_device *dev);
int thc_i2c_set_rx_max_size(struct thc_device *dev, u32 max_rx_size);
int thc_i2c_rx_max_size_enable(struct thc_device *dev, bool enable);
int thc_i2c_set_rx_int_delay(struct thc_device *dev, u32 delay_us);
int thc_i2c_rx_int_delay_enable(struct thc_device *dev, bool enable);
#endif /* _INTEL_THC_DEV_H_ */
Messung V0.5 in Prozent C=99 H=95 G=96
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-09-27)
¤
*© Formatika GbR, Deutschland