linux-surface/drivers/misc/ipts/ipts.h
2017-08-10 13:56:11 -04:00

201 lines
4.8 KiB
C

/*
*
* Intel Management Engine Interface (Intel MEI) Client Driver for IPTS
* Copyright (c) 2016, Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef _IPTS_H_
#define _IPTS_H_
#include <linux/types.h>
#include <linux/mei_cl_bus.h>
#include <linux/hid.h>
#include <linux/intel_ipts_if.h>
#include "ipts-mei-msgs.h"
#include "ipts-state.h"
#include "ipts-binary-spec.h"
#define ENABLE_IPTS_DEBUG /* enable IPTS debug */
#ifdef ENABLE_IPTS_DEBUG
#define ipts_info(ipts, format, arg...) do {\
dev_info(&ipts->cldev->dev, format, ##arg);\
} while (0)
#define ipts_dbg(ipts, format, arg...) do {\
dev_info(&ipts->cldev->dev, format, ##arg);\
} while (0)
#define RUN_DBG_THREAD
#else
#define ipts_info(ipts, format, arg...) do {} while(0);
#define ipts_dbg(ipts, format, arg...) do {} while(0);
#endif
#define ipts_err(ipts, format, arg...) do {\
dev_err(&ipts->cldev->dev, format, ##arg);\
} while (0)
#define HID_PARALLEL_DATA_BUFFERS TOUCH_SENSOR_MAX_DATA_BUFFERS
#define IPTS_MAX_RETRY 3
typedef struct ipts_buffer_info {
char *addr;
dma_addr_t dma_addr;
} ipts_buffer_info_t;
typedef struct ipts_gfx_info {
u64 gfx_handle;
intel_ipts_ops_t ipts_ops;
} ipts_gfx_info_t;
typedef struct ipts_resource {
/* ME & Gfx resource */
ipts_buffer_info_t touch_data_buffer_raw[HID_PARALLEL_DATA_BUFFERS];
ipts_buffer_info_t touch_data_buffer_hid;
ipts_buffer_info_t feedback_buffer[HID_PARALLEL_DATA_BUFFERS];
ipts_buffer_info_t hid2me_buffer;
u32 hid2me_buffer_size;
u8 wq_item_size;
intel_ipts_wq_info_t wq_info;
/* ME2HID buffer */
char *me2hid_buffer;
/* Gfx specific resource */
ipts_buffer_info_t raw_data_mode_output_buffer
[HID_PARALLEL_DATA_BUFFERS][MAX_NUM_OUTPUT_BUFFERS];
int num_of_outputs;
bool default_resource_ready;
bool raw_data_resource_ready;
} ipts_resource_t;
typedef struct ipts_info {
struct mei_cl_device *cldev;
struct hid_device *hid;
struct work_struct init_work;
struct work_struct raw_data_work;
struct work_struct gfx_status_work;
struct task_struct *event_loop;
#if IS_ENABLED(CONFIG_DEBUG_FS)
struct dentry *dbgfs_dir;
#endif
ipts_state_t state;
touch_sensor_mode_t sensor_mode;
touch_sensor_get_device_info_rsp_data_t device_info;
ipts_resource_t resource;
u8 hid_input_report[HID_MAX_BUFFER_SIZE];
int num_of_parallel_data_buffers;
bool hid_desc_ready;
int current_buffer_index;
int last_buffer_completed;
int *last_submitted_id;
ipts_gfx_info_t gfx_info;
u64 kernel_handle;
int gfx_status;
bool display_status;
bool switch_sensor_mode;
touch_sensor_mode_t new_sensor_mode;
int retry;
bool restart;
} ipts_info_t;
#if IS_ENABLED(CONFIG_DEBUG_FS)
int ipts_dbgfs_register(ipts_info_t *ipts, const char *name);
void ipts_dbgfs_deregister(ipts_info_t *ipts);
#else
static int ipts_dbgfs_register(ipts_info_t *ipts, const char *name);
static void ipts_dbgfs_deregister(ipts_info_t *ipts);
#endif /* CONFIG_DEBUG_FS */
/* inline functions */
static inline void ipts_set_state(ipts_info_t *ipts, ipts_state_t state)
{
ipts->state = state;
}
static inline ipts_state_t ipts_get_state(const ipts_info_t *ipts)
{
return ipts->state;
}
static inline bool ipts_is_default_resource_ready(const ipts_info_t *ipts)
{
return ipts->resource.default_resource_ready;
}
static inline bool ipts_is_raw_data_resource_ready(const ipts_info_t *ipts)
{
return ipts->resource.raw_data_resource_ready;
}
static inline ipts_buffer_info_t* ipts_get_feedback_buffer(ipts_info_t *ipts,
int buffer_idx)
{
return &ipts->resource.feedback_buffer[buffer_idx];
}
static inline ipts_buffer_info_t* ipts_get_touch_data_buffer_hid(ipts_info_t *ipts)
{
return &ipts->resource.touch_data_buffer_hid;
}
static inline ipts_buffer_info_t* ipts_get_output_buffers_by_parallel_id(
ipts_info_t *ipts,
int parallel_idx)
{
return &ipts->resource.raw_data_mode_output_buffer[parallel_idx][0];
}
static inline ipts_buffer_info_t* ipts_get_hid2me_buffer(ipts_info_t *ipts)
{
return &ipts->resource.hid2me_buffer;
}
static inline void ipts_set_wq_item_size(ipts_info_t *ipts, u8 size)
{
ipts->resource.wq_item_size = size;
}
static inline u8 ipts_get_wq_item_size(const ipts_info_t *ipts)
{
return ipts->resource.wq_item_size;
}
static inline int ipts_get_num_of_parallel_buffers(const ipts_info_t *ipts)
{
return ipts->num_of_parallel_data_buffers;
}
#endif // _IPTS_H_