mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-31 22:23:05 +00:00

Wake-on-Touch (WoT) feature gives system the capability to wake from sleep state by user touch event, it requires platform providing wake GPIO through ACPI resource. Intel UEFI provides a user setting to enable or disable THC device WoT feature. If it's enabled, UEFI assigns an additional wake GPIO resource to THC device ACPI configuration, facilitating system wakeup. This patch provides helper APIs for THC device driver to query wake GPIO resource, enable WoT feature and unconfigure WoT. APIs added: - thc_wot_config(): Query and configure wake-on-touch feature. - thc_wot_unconfig(): Unconfig wake-on-touch feature. 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>
134 lines
4.8 KiB
C
134 lines
4.8 KiB
C
/* 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 0x10
|
|
#define THC_REGMAP_MMIO_OFFSET 0x1000
|
|
|
|
/*
|
|
* 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_ */
|