414 lines
12 KiB
C
Executable File
414 lines
12 KiB
C
Executable File
/*
|
|
* cypress_touchkey.h - Platform data for cypress touchkey driver
|
|
*
|
|
* Copyright (C) 2011 Samsung Electronics
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
*/
|
|
|
|
#ifndef __LINUX_CYPRESS_TOUCHKEY_H
|
|
#define __LINUX_CYPRESS_TOUCHKEY_H
|
|
extern struct class *sec_class;
|
|
|
|
#ifdef CONFIG_SAMSUNG_LPM_MODE
|
|
extern int poweroff_charging;
|
|
#endif
|
|
|
|
/* DVFS feature : TOUCH BOOSTER */
|
|
#define TSP_BOOSTER
|
|
#ifdef TSP_BOOSTER
|
|
#include <linux/cpufreq.h>
|
|
|
|
#define DVFS_STAGE_DUAL 2
|
|
#define DVFS_STAGE_SINGLE 1
|
|
#define DVFS_STAGE_NONE 0
|
|
#define TOUCH_BOOSTER_OFF_TIME 500
|
|
#define TOUCH_BOOSTER_CHG_TIME 500
|
|
#endif
|
|
|
|
#include <linux/input.h>
|
|
#include <linux/earlysuspend.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/wakelock.h>
|
|
|
|
#if defined(CONFIG_SEC_K_PROJECT)
|
|
#define CYPRESS_SUPPORT_DUAL_INT_MODE
|
|
#define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x1D
|
|
#define TK_CMD_INTERRUPT_SET_REG 0x00
|
|
#define CYPRESS_DETECTION_FLAG 0x08
|
|
#define TK_CMD_DUAL_DETECTION 0x01
|
|
#define TK_BIT_DETECTION_CONFIRM 0xEE
|
|
#elif defined(CONFIG_MACH_JSGLTE_CHN_CMCC)
|
|
#define USE_SW_I2C
|
|
#define ENABLE_FW_UPDATE
|
|
#define CYPRESS_SUPPORT_DUAL_INT_MODE
|
|
#define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x1C
|
|
#define TK_CMD_INTERRUPT_SET_REG 0x18
|
|
#define CYPRESS_DETECTION_FLAG 0x1B
|
|
#define TK_CMD_DUAL_DETECTION 0x01
|
|
#define TK_BIT_DETECTION_CONFIRM 0xEE
|
|
#elif defined(CONFIG_SEC_H_PROJECT)
|
|
#define CYPRESS_SUPPORT_DUAL_INT_MODE
|
|
#define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x12
|
|
#define TK_CMD_INTERRUPT_SET_REG 0x18
|
|
#define CYPRESS_DETECTION_FLAG 0x1B
|
|
#define TK_CMD_DUAL_DETECTION 0x01
|
|
#define TK_BIT_DETECTION_CONFIRM 0xEE
|
|
#elif defined(CONFIG_SEC_KLIMT_PROJECT)
|
|
#define CYPRESS_SUPPORT_DUAL_INT_MODE
|
|
#define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x09
|
|
#define TK_CMD_INTERRUPT_SET_REG 0x18
|
|
#define CYPRESS_DETECTION_FLAG 0x1B
|
|
#define TK_CMD_DUAL_DETECTION 0x01
|
|
#define TK_BIT_DETECTION_CONFIRM 0xEE
|
|
#define CRC_CHECK_DELAY
|
|
#elif defined(CONFIG_MACH_JS01LTEDCM)
|
|
#define CYPRESS_SUPPORT_DUAL_INT_MODE
|
|
#define CYPRESS_RECENT_BACK_REPORT_FW_VER 0x09
|
|
#define TK_CMD_INTERRUPT_SET_REG 0x18
|
|
#define CYPRESS_DETECTION_FLAG 0x1B
|
|
#define TK_CMD_DUAL_DETECTION 0x01
|
|
#define TK_BIT_DETECTION_CONFIRM 0xEE
|
|
#else
|
|
#undef CYPRESS_SUPPORT_DUAL_INT_MODE
|
|
#define CYPRESS_RECENT_BACK_REPORT_FW_VER 0xFF
|
|
#endif
|
|
|
|
#if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY)
|
|
/* Touchkey Register */
|
|
#define CYPRESS_GEN 0X00
|
|
#define CYPRESS_OP_MODE 0X01
|
|
#define CYPRESS_SP_REG 0X02
|
|
#define CYPRESS_BUTTON_STATUS 0X03
|
|
#define CYPRESS_FW_VER 0X04
|
|
#define CYPRESS_MODULE_VER 0X05
|
|
#define CYPRESS_DEVICE_VER 0X06
|
|
#define CYPRESS_STATUS_FLAG 0X07
|
|
#define CYPRESS_THRESHOLD 0X09
|
|
#define CYPRESS_THRESHOLD2 0X0A
|
|
#define CYPRESS_THRESHOLD3 0X0B
|
|
#define CYPRESS_THRESHOLD4 0X0C
|
|
#define CYPRESS_IDAC_MENU 0x0D
|
|
#define CYPRESS_IDAC_MENU_INNER 0x0E
|
|
#define CYPRESS_IDAC_BACK 0x0F
|
|
#define CYPRESS_IDAC_BACK_INNER 0x10
|
|
#define CYPRESS_COMPIDAC_MENU 0x11
|
|
#define CYPRESS_COMPIDAC_MENU_INNER 0x12
|
|
#define CYPRESS_COMPIDAC_BACK 0x13
|
|
#define CYPRESS_COMPIDAC_BACK_INNER 0x14
|
|
#define CYPRESS_DIFF_MENU 0x16
|
|
#define CYPRESS_DIFF_MENU_INNER 0x18
|
|
#define CYPRESS_DIFF_BACK 0x1A
|
|
#define CYPRESS_DIFF_BACK_INNER 0x1C
|
|
#define CYPRESS_RAW_DATA_MENU 0x1E
|
|
#define CYPRESS_RAW_DATA_MENU_INNER 0x20
|
|
#define CYPRESS_RAW_DATA_BACK 0x22
|
|
#define CYPRESS_RAW_DATA_BACK_INNER 0x24
|
|
#define CYPRESS_BASE_DATA_MENU 0x26
|
|
#define CYPRESS_BASE_DATA_MENU_INNER 0x28
|
|
#define CYPRESS_BASE_DATA_BACK 0x2A
|
|
#define CYPRESS_BASE_DATA_BACK_INNER 0x2C
|
|
#define CYPRESS_DATA_UPDATE 0X40
|
|
|
|
#elif defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_H) || defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_HE)
|
|
#define CYPRESS_GEN 0X00
|
|
#define CYPRESS_FW_VER 0X01
|
|
#define CYPRESS_MODULE_VER 0X02
|
|
#define CYPRESS_2ND_HOST 0X03
|
|
#define CYPRESS_THRESHOLD 0X04
|
|
#define CYPRESS_AUTO_CAL_FLG 0X05
|
|
#define CYPRESS_IDAC_MENU 0X07
|
|
#define CYPRESS_IDAC_BACK 0X06
|
|
#define CYPRESS_IDAC_HOME 0X08
|
|
#define CYPRESS_DIFF_MENU 0x0C
|
|
#define CYPRESS_DIFF_BACK 0x0A
|
|
#define CYPRESS_DIFF_HOME 0x0E
|
|
#define CYPRESS_RAW_DATA_MENU 0x10
|
|
#define CYPRESS_RAW_DATA_BACK 0x0E
|
|
#define CYPRESS_RAW_DATA_HOME 0x12
|
|
#define CYPRESS_RAW_DATA_BACK_GOGH 0x14
|
|
#define CYPRESS_DATA_UPDATE 0X40
|
|
#define CYPRESS_AUTO_CAL 0X50
|
|
#define CYPRESS_SLEEP 0X80
|
|
#define CYPRESS_FW_ID_REG 0X05
|
|
#define USE_OPEN_CLOSE
|
|
#undef DO_NOT_USE_FUNC_PARAM
|
|
#define KEYCODE_REG 0x00
|
|
#endif
|
|
|
|
/* OP MODE CMD */
|
|
#define TK_BIT_CMD_LEDCONTROL 0x40 /* Owner for LED on/off control (0:host / 1:TouchIC) */
|
|
#define TK_BIT_CMD_INSPECTION 0x20 /* Inspection mode */
|
|
#define TK_BIT_CMD_1MM 0x10 /* 1mm stylus mode */
|
|
#define TK_BIT_CMD_FLIP 0x08 /* flip mode */
|
|
#define TK_BIT_CMD_GLOVE 0x04 /* glove mode */
|
|
#define TK_BIT_CMD_TA_ON 0x02 /* Ta mode */
|
|
#define TK_BIT_CMD_REGULAR 0x01 /* regular mode = normal mode */
|
|
|
|
#define TK_BIT_WRITE_CONFIRM 0xAA
|
|
|
|
/* STATUS FLAG */
|
|
#if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_H) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_HE)
|
|
#define TK_BIT_AUTOCAL 0x80
|
|
#define TK_BIT_GLOVE 0x40
|
|
#define TK_BIT_TA_ON 0x10
|
|
#define TK_BIT_FLIP 0x08
|
|
#else
|
|
#define TK_BIT_LEDCONTROL 0x40 /* Owner for LED on/off control (0:host / 1:TouchIC) */
|
|
#define TK_BIT_1MM 0x20 /* 1mm stylus mode */
|
|
#define TK_BIT_FLIP 0x10 /* flip mode */
|
|
#define TK_BIT_GLOVE 0x08 /* glove mode */
|
|
#define TK_BIT_TA_ON 0x04 /* Ta mode */
|
|
#define TK_BIT_REGULAR 0x02 /* regular mode = normal mode */
|
|
#define TK_BIT_LED_STATUS 0x01 /* LED status */
|
|
#endif
|
|
|
|
/* bit masks*/
|
|
#define PRESS_BIT_MASK 0X08
|
|
#define KEYCODE_BIT_MASK 0X07
|
|
|
|
#define TK_CMD_LED_ON 0x10
|
|
#define TK_CMD_LED_OFF 0x20
|
|
|
|
/*
|
|
#define TOUCHKEY_LOG(k, v) dev_notice(&info->client->dev, "key[%d] %d\n", k, v);
|
|
#define FUNC_CALLED dev_notice(&info->client->dev, "%s: called.\n", __func__);
|
|
*/
|
|
#define NUM_OF_RETRY_UPDATE 5
|
|
/*#define NUM_OF_KEY 4*/
|
|
|
|
#define USE_OPEN_CLOSE
|
|
#undef DO_NOT_USE_FUNC_PARAM
|
|
|
|
|
|
#define CONFIG_GLOVE_TOUCH
|
|
#ifdef CONFIG_GLOVE_TOUCH
|
|
#define TKEY_GLOVE_DWORK_TIME 300
|
|
#endif
|
|
|
|
/* Flip cover*/
|
|
#define TKEY_FLIP_MODE
|
|
/* 1MM stylus */
|
|
#define TKEY_1MM_MODE
|
|
|
|
//#define TK_INFORM_CHARGER
|
|
#if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY) && \
|
|
!defined(CONFIG_EXTCON)
|
|
#define TK_INFORM_CHARGER
|
|
#elif defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_H) || defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C) || defined (CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_HE)
|
|
#undef TK_INFORM_CHARGER
|
|
#endif
|
|
|
|
#define CYPRESS_55_IC_MASK 0x20
|
|
#define CYPRESS_65_IC_MASK 0x04
|
|
|
|
#define NUM_OF_KEY 4
|
|
|
|
enum {
|
|
CORERIVER_TOUCHKEY,
|
|
CYPRESS_TOUCHKEY,
|
|
};
|
|
|
|
#ifdef TK_INFORM_CHARGER
|
|
struct touchkey_callbacks {
|
|
void (*inform_charger)(struct touchkey_callbacks *, bool);
|
|
};
|
|
#endif
|
|
|
|
enum {
|
|
UPDATE_NONE,
|
|
DOWNLOADING,
|
|
UPDATE_FAIL,
|
|
UPDATE_PASS,
|
|
};
|
|
|
|
#define USE_TKEY_UPDATE_WORK
|
|
#define TKEY_REQUEST_FW_UPDATE
|
|
|
|
#ifdef TKEY_REQUEST_FW_UPDATE
|
|
#define TKEY_FW_BUILTIN_PATH "tkey"
|
|
#define TKEY_FW_IN_SDCARD_PATH "/sdcard/"
|
|
|
|
#define TKEY_SEMCO_CYPRESS_FW_NAME "semco_cypress_tkey"
|
|
#define TKEY_SEMCO02_CYPRESS_FW_NAME "semco02_cypress_tkey"
|
|
#define TKEY_SEMCO04_CYPRESS_FW_NAME "semco04_cypress_tkey"
|
|
#define TKEY_DTECH_CYPRESS_FW_NAME "dtech_cypress_tkey"
|
|
|
|
#ifdef CONFIG_MACH_JS01LTEDCM
|
|
#define TKEY_CORERIVER_FW_NAME "hltejs01_coreriver_tkey"
|
|
#define TKEY_CYPRESS_FW_NAME "hltejs01_cypress_tkey"
|
|
#else
|
|
#define TKEY_CORERIVER_FW_NAME "hlte_coreriver_tkey"
|
|
#if defined(CONFIG_SEC_BERLUTI_PROJECT)
|
|
#define TKEY_CYPRESS_FW_NAME "berluti_cypress_tkey"
|
|
#elif defined(CONFIG_SEC_KLIMT_PROJECT)
|
|
#define TKEY_CYPRESS_FW_NAME "klimt_cypress_tkey"
|
|
#elif defined(CONFIG_MACH_JSGLTE_CHN_CMCC)
|
|
#define TKEY_CYPRESS_FW_NAME "jsglte_cypress_tkey"
|
|
#else
|
|
#define TKEY_CYPRESS_FW_NAME "hlte_cypress_tkey"
|
|
#endif
|
|
#endif
|
|
|
|
enum {
|
|
FW_BUILT_IN = 0,
|
|
FW_IN_SDCARD,
|
|
};
|
|
|
|
struct fw_image {
|
|
u8 hdr_ver;
|
|
u8 hdr_len;
|
|
u16 first_fw_ver;
|
|
u16 second_fw_ver;
|
|
u16 third_ver;
|
|
u32 fw_len;
|
|
#if defined(CONFIG_SEC_K_PROJECT) || defined(CONFIG_SEC_S_PROJECT) || defined(CONFIG_SEC_PATEK_PROJECT) || defined(CONFIG_SEC_KLIMT_PROJECT)
|
|
u16 checksum;
|
|
u16 alignment_dummy;
|
|
#endif
|
|
u8 data[0];
|
|
} __attribute__ ((packed));
|
|
#else
|
|
|
|
#define BIN_FW_VERSION 0
|
|
#endif
|
|
|
|
/* Divide model */
|
|
#if defined(CONFIG_SEC_KLIMT_PROJECT)
|
|
#define USE_SW_I2C // only use sw i2c line
|
|
#define ENABLE_FW_UPDATE //fw update after dtsi 02
|
|
#endif
|
|
|
|
struct cypress_touchkey_platform_data {
|
|
unsigned gpio_led_en;
|
|
u32 touchkey_keycode[4];
|
|
int keycodes_size;
|
|
void (*power_onoff) (int);
|
|
bool skip_fw_update;
|
|
bool touchkey_order;
|
|
void (*register_cb)(void *);
|
|
bool i2c_pull_up;
|
|
bool vcc_flag;
|
|
bool fw_update_flag;
|
|
int gpio_int;
|
|
u32 irq_gpio_flags;
|
|
int gpio_sda;
|
|
u32 sda_gpio_flags;
|
|
int gpio_scl;
|
|
u32 scl_gpio_flags;
|
|
int gpio_touchkey_id;
|
|
u32 gpio_touchkey_id_flags;
|
|
int vdd_led;
|
|
int vcc_en;
|
|
};
|
|
|
|
struct cypress_touchkey_info {
|
|
struct i2c_client *client;
|
|
struct cypress_touchkey_platform_data *pdata;
|
|
struct input_dev *input_dev;
|
|
struct early_suspend early_suspend;
|
|
char phys[32];
|
|
unsigned char keycode[NUM_OF_KEY];
|
|
u8 sensitivity[NUM_OF_KEY];
|
|
int irq;
|
|
void (*power_onoff)(int);
|
|
u8 touchkey_update_status;
|
|
u8 ic_vendor;
|
|
struct regulator *vcc_en;
|
|
struct regulator *vdd_led;
|
|
#ifdef CONFIG_GLOVE_TOUCH
|
|
#if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY)
|
|
struct delayed_work glove_work;
|
|
struct mutex tkey_glove_lock;
|
|
#else
|
|
struct workqueue_struct *glove_wq;
|
|
struct work_struct glove_work;
|
|
#endif
|
|
int glove_value;
|
|
#endif
|
|
#ifdef USE_TKEY_UPDATE_WORK
|
|
struct workqueue_struct *fw_wq;
|
|
struct work_struct update_work;
|
|
#endif
|
|
bool is_powering_on;
|
|
bool enabled;
|
|
bool done_ta_setting;
|
|
|
|
#ifdef TKEY_FLIP_MODE
|
|
bool enabled_flip;
|
|
#endif
|
|
#ifdef TKEY_1MM_MODE
|
|
bool enabled_1mm;
|
|
#endif
|
|
|
|
#ifdef TSP_BOOSTER
|
|
struct delayed_work work_dvfs_off;
|
|
struct delayed_work work_dvfs_chg;
|
|
struct mutex dvfs_lock;
|
|
bool dvfs_lock_status;
|
|
int dvfs_old_stauts;
|
|
int dvfs_boost_mode;
|
|
int dvfs_freq;
|
|
#endif
|
|
|
|
#ifdef TK_INFORM_CHARGER
|
|
struct touchkey_callbacks callbacks;
|
|
bool charging_mode;
|
|
#endif
|
|
#ifdef TKEY_REQUEST_FW_UPDATE
|
|
const struct firmware *fw;
|
|
struct fw_image *fw_img;
|
|
u8 cur_fw_path;
|
|
#endif
|
|
int src_fw_ver;
|
|
int ic_fw_ver;
|
|
int module_ver;
|
|
int device_ver;
|
|
u32 fw_id;
|
|
|
|
u8 touchkeyid;
|
|
bool support_fw_update;
|
|
bool do_checksum;
|
|
struct wake_lock fw_wakelock;
|
|
};
|
|
|
|
#ifdef TK_INFORM_CHARGER
|
|
void touchkey_charger_infom(bool en);
|
|
#endif
|
|
|
|
/* TKEY MODULE 0x6 */
|
|
#if defined(CONFIG_MACH_KLTE_EUR) || defined(CONFIG_MACH_KWIFI_LDU)
|
|
#define TKEY_MODULE_CHECK_REV 0xA
|
|
#elif defined(CONFIG_MACH_KLTE_ATT) || defined(CONFIG_MACH_KLTE_AUS_TEL)
|
|
#define TKEY_MODULE_CHECK_REV 0xE
|
|
#elif defined(CONFIG_MACH_KLTE_CHN) || defined(CONFIG_MACH_KLTE_KOR) || defined(CONFIG_MACH_KLTE_JPN) \
|
|
|| defined(CONFIG_MACH_KLTE_SPR) || defined(CONFIG_MACH_KLTE_VZW) || defined(CONFIG_MACH_KLTE_LRA) \
|
|
|| defined(CONFIG_MACH_KLTE_TMO) || defined(CONFIG_MACH_KLTE_CAN) || defined(CONFIG_MACH_KLTE_MTR) \
|
|
|| defined(CONFIG_MACH_KLTE_USC) || defined(CONFIG_MACH_KLTE_ACG) || defined(CONFIG_MACH_K3GDUOS_CTC)
|
|
#define TKEY_MODULE_CHECK_REV 0x9
|
|
#else
|
|
#define TKEY_MODULE_CHECK_REV 0xFF
|
|
#endif
|
|
|
|
extern int coreriver_fw_update(struct cypress_touchkey_info *info, bool force);
|
|
|
|
#define PM8921_IRQ_BASE (NR_MSM_IRQS + NR_GPIO_IRQS)
|
|
#if defined(CONFIG_KEYBOARD_CYPRESS_TOUCHKEY_C)
|
|
#define GPIO_TOUCHKEY_SDA 22
|
|
#define GPIO_TOUCHKEY_SCL 23
|
|
#define PMIC_GPIO_TKEY_INT 49
|
|
#elif defined(CONFIG_SEC_KLIMT_PROJECT)
|
|
#define GPIO_TOUCHKEY_SDA 10
|
|
#define GPIO_TOUCHKEY_SCL 11
|
|
#define GPIO_TKEY_INT 144
|
|
#else
|
|
#define GPIO_TOUCHKEY_SDA 95
|
|
#define GPIO_TOUCHKEY_SCL 96
|
|
#define PMIC_GPIO_TKEY_INT 79
|
|
#endif
|
|
extern void cypress_power_onoff(struct cypress_touchkey_info *info, int onoff);
|
|
#endif /* __LINUX_CYPRESS_TOUCHKEY_H */
|