331 lines
7.9 KiB
C
331 lines
7.9 KiB
C
/* drivers/input/touchscreen/maxim_sti.c
|
|
*
|
|
* Maxim SmartTouch Imager Touchscreen Driver
|
|
*
|
|
* Copyright (c)2013 Maxim Integrated Products, Inc.
|
|
* Copyright (C) 2013, NVIDIA Corporation. All Rights Reserved.
|
|
* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
|
*
|
|
* This software is licensed under the terms of the GNU General Public
|
|
* License version 2, as published by the Free Software Foundation, and
|
|
* may be copied, distributed, and modified under those terms.
|
|
*
|
|
* This program is distributed in the hope that 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 __MAXIM_STI_H__
|
|
#define __MAXIM_STI_H__
|
|
|
|
#ifndef __KERNEL__
|
|
#include <stdlib.h>
|
|
#include "genetlink.h"
|
|
#endif
|
|
|
|
#define XSTR(s) STR(s)
|
|
#define STR(s) #s
|
|
|
|
#define DRV_VER_MAJOR 1
|
|
#define DRV_VER_MINOR 1
|
|
|
|
#define DRIVER_VERSION_STR XSTR(DRV_VER_MAJOR) "." XSTR(DRV_VER_MINOR)
|
|
#define DRIVER_VERSION_NUM ((DRV_VER_MAJOR << 8) | DRV_VER_MINOR)
|
|
|
|
#define DRIVER_VERSION DRIVER_VERSION_STR
|
|
#define DRIVER_RELEASE "April 29, 2015"
|
|
#define DRIVER_PROTOCOL 0x0102
|
|
|
|
/****************************************************************************\
|
|
* Netlink: common kernel/user space macros *
|
|
\****************************************************************************/
|
|
|
|
#define NL_BUF_SIZE 30720
|
|
|
|
#define NL_ATTR_FIRST(nptr) \
|
|
((struct nlattr *)((void *)nptr + NLMSG_HDRLEN + GENL_HDRLEN))
|
|
#define NL_ATTR_LAST(nptr) \
|
|
((struct nlattr *)((void *)nptr + \
|
|
NLMSG_ALIGN(((struct nlmsghdr *)nptr)->nlmsg_len)))
|
|
#define NL_SIZE(nptr) NLMSG_ALIGN(((struct nlmsghdr *)nptr)->nlmsg_len)
|
|
#define NL_TYPE(nptr) (((struct nlmsghdr *)nptr)->nlmsg_type)
|
|
#define NL_SEQ(nptr) (((struct nlmsghdr *)nptr)->nlmsg_seq)
|
|
#define NL_OK(nptr) (NL_TYPE(nptr) >= NLMSG_MIN_TYPE)
|
|
#define NL_ATTR_VAL(aptr, type) ((type *)((void *)aptr + NLA_HDRLEN))
|
|
#define NL_ATTR_NEXT(aptr) \
|
|
((struct nlattr *)((void *)aptr + \
|
|
NLA_ALIGN(((struct nlattr *)aptr)->nla_len)))
|
|
#define GENL_CMP(name1, name2) strncmp(name1, name2, GENL_NAMSIZ)
|
|
#define GENL_COPY(name1, name2) strlcpy(name1, name2, GENL_NAMSIZ)
|
|
#define GENL_CHK(name) (strlen(name) > (GENL_NAMSIZ - 1))
|
|
#define MSG_TYPE(nptr) NL_ATTR_FIRST(nptr)->nla_type
|
|
#define MSG_PAYLOAD(nptr) NL_ATTR_VAL(NL_ATTR_FIRST(nptr), void)
|
|
|
|
/****************************************************************************\
|
|
* Netlink: common kernel/user space inline functions *
|
|
\****************************************************************************/
|
|
|
|
static inline void
|
|
nl_msg_init(void *buf, __u16 family_id, __u32 sequence, __u8 dst)
|
|
{
|
|
struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
|
|
struct genlmsghdr *genl = (struct genlmsghdr *)(buf + NLMSG_HDRLEN);
|
|
|
|
memset(buf, 0, NLMSG_HDRLEN + GENL_HDRLEN);
|
|
nlh->nlmsg_type = family_id;
|
|
nlh->nlmsg_flags = NLM_F_REQUEST;
|
|
nlh->nlmsg_seq = sequence;
|
|
nlh->nlmsg_len = NLMSG_HDRLEN + GENL_HDRLEN;
|
|
genl->cmd = dst;
|
|
}
|
|
|
|
static inline void
|
|
*nl_alloc_attr(void *buf, __u16 type, __u16 len)
|
|
{
|
|
struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
|
|
struct nlattr *attr = NL_ATTR_LAST(nlh);
|
|
|
|
if ((NL_SIZE(buf) + NLMSG_ALIGN(NLA_HDRLEN + len)) > NL_BUF_SIZE)
|
|
return NULL;
|
|
|
|
attr->nla_type = type;
|
|
attr->nla_len = NLA_HDRLEN + len;
|
|
nlh->nlmsg_len += NLMSG_ALIGN(attr->nla_len);
|
|
return NL_ATTR_VAL(attr, void);
|
|
}
|
|
|
|
static inline int
|
|
nl_add_attr(void *buf, __u16 type, void *ptr, __u16 len)
|
|
{
|
|
void *a_ptr;
|
|
|
|
a_ptr = nl_alloc_attr(buf, type, len);
|
|
if (a_ptr == NULL)
|
|
return -EPERM;
|
|
memcpy(a_ptr, ptr, len);
|
|
return 0;
|
|
}
|
|
|
|
/****************************************************************************\
|
|
* Netlink: multicast groups enum and name strings *
|
|
\****************************************************************************/
|
|
|
|
enum {
|
|
MC_DRIVER,
|
|
MC_FUSION,
|
|
MC_EVENT_BROADCAST,
|
|
MC_GROUPS,
|
|
};
|
|
|
|
#define MC_DRIVER_NAME "driver"
|
|
#define MC_FUSION_NAME "fusion"
|
|
#define MC_EVENT_BROADCAST_NAME "event_broadcast"
|
|
|
|
#define NL_FAMILY_VERSION 1
|
|
|
|
#define TF_FAMILY_NAME "touch_fusion"
|
|
|
|
/****************************************************************************\
|
|
* Netlink: common parameter and message definitions *
|
|
\****************************************************************************/
|
|
|
|
enum {
|
|
DR_STATE_BASIC,
|
|
DR_STATE_ACTIVE,
|
|
DR_STATE_SUSPEND,
|
|
DR_STATE_RESUME,
|
|
DR_STATE_FAULT,
|
|
};
|
|
|
|
enum {
|
|
DR_INPUT_FINGER,
|
|
DR_INPUT_STYLUS,
|
|
DR_INPUT_ERASER,
|
|
};
|
|
|
|
enum {
|
|
DR_IRQ_FALLING_EDGE,
|
|
DR_IRQ_RISING_EDGE,
|
|
};
|
|
|
|
enum {
|
|
DR_ADD_MC_GROUP,
|
|
DR_ECHO_REQUEST,
|
|
DR_CHIP_READ,
|
|
DR_CHIP_WRITE,
|
|
DR_CHIP_RESET,
|
|
DR_GET_IRQLINE,
|
|
DR_DELAY,
|
|
DR_CHIP_ACCESS_METHOD,
|
|
DR_CONFIG_IRQ,
|
|
DR_CONFIG_INPUT,
|
|
DR_CONFIG_WATCHDOG,
|
|
DR_DECONFIG,
|
|
DR_INPUT,
|
|
DR_RESUME_ACK,
|
|
DR_LEGACY_FWDL,
|
|
DR_LEGACY_ACCELERATION,
|
|
DR_HANDSHAKE,
|
|
DR_CONFIG_FW,
|
|
DR_IDLE,
|
|
DR_SYSFS_ACK,
|
|
DR_TF_STATUS,
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_add_mc_group {
|
|
__u8 number;
|
|
char name[GENL_NAMSIZ];
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_echo_request {
|
|
__u32 cookie;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_chip_read {
|
|
__u16 address;
|
|
__u16 length;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_chip_write {
|
|
__u16 address;
|
|
__u16 length;
|
|
__u8 data[0];
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_chip_reset {
|
|
__u8 state;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_delay {
|
|
__u32 period;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_chip_access_method {
|
|
__u8 method;
|
|
};
|
|
|
|
#define MAX_IRQ_PARAMS 37
|
|
struct __attribute__ ((__packed__)) dr_config_irq {
|
|
__u8 irq_method;
|
|
__u8 irq_edge;
|
|
__u8 irq_params;
|
|
__u16 irq_param[MAX_IRQ_PARAMS];
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_config_input {
|
|
__u16 x_range;
|
|
__u16 y_range;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_config_watchdog {
|
|
__u32 pid;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_input_event {
|
|
__u8 id;
|
|
__u8 tool_type;
|
|
__u16 x;
|
|
__u16 y;
|
|
__u8 z;
|
|
};
|
|
|
|
#define MAX_INPUT_EVENTS 10
|
|
struct __attribute__ ((__packed__)) dr_input {
|
|
struct dr_input_event event[MAX_INPUT_EVENTS];
|
|
__u8 events;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_legacy_acceleration {
|
|
__u8 enable;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_handshake {
|
|
__u16 tf_ver;
|
|
__u16 chip_id;
|
|
};
|
|
|
|
#define DR_SYSFS_UPDATE_NONE 0x0000
|
|
#define DR_SYSFS_UPDATE_BIT_GLOVE 0
|
|
#define DR_SYSFS_UPDATE_BIT_CHARGER 1
|
|
#define DR_SYSFS_UPDATE_BIT_LCD_FPS 2
|
|
|
|
#define DR_SYSFS_ACK_GLOVE 0x5A5A5A5A
|
|
#define DR_SYSFS_ACK_CHARGER 0xA5A5A5A5
|
|
#define DR_SYSFS_ACK_LCD_FPS 0xC3C3C3C3
|
|
|
|
enum {
|
|
DR_NO_CHARGER,
|
|
DR_WIRED_CHARGER,
|
|
DR_WIRELESS_CHARGER,
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_sysfs_ack {
|
|
__u32 type;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_config_fw {
|
|
__u16 fw_ver;
|
|
__u16 fw_protocol;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) dr_idle {
|
|
__u8 idle;
|
|
};
|
|
|
|
#define TF_STATUS_DEFAULT_LOADED (1 << 0)
|
|
#define TF_STATUS_BUSY (1 << 1)
|
|
|
|
struct __attribute__ ((__packed__)) dr_tf_status {
|
|
__u32 tf_status;
|
|
};
|
|
|
|
enum {
|
|
FU_ECHO_RESPONSE,
|
|
FU_CHIP_READ_RESULT,
|
|
FU_IRQLINE_STATUS,
|
|
FU_ASYNC_DATA,
|
|
FU_RESUME,
|
|
FU_HANDSHAKE_RESPONSE,
|
|
FU_SYSFS_INFO,
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) fu_echo_response {
|
|
__u32 cookie;
|
|
__u8 driver_state;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) fu_chip_read_result {
|
|
__u16 address;
|
|
__u16 length;
|
|
__u8 data[0];
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) fu_irqline_status {
|
|
__u8 status;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) fu_async_data {
|
|
__u16 address;
|
|
__u16 length;
|
|
__u16 status;
|
|
__u8 data[0];
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) fu_handshake_response {
|
|
__u16 driver_ver;
|
|
__u16 panel_id;
|
|
__u16 driver_protocol;
|
|
};
|
|
|
|
struct __attribute__ ((__packed__)) fu_sysfs_info {
|
|
__u8 type;
|
|
__u16 glove_value;
|
|
__u16 charger_value;
|
|
__u16 lcd_fps_value;
|
|
};
|
|
|
|
#endif
|
|
|