static irqreturn_t touchkey_interrupt_thread(int irq, void *touchkey_devdata) { u8 data; int i; int ret; int scancode; struct cypress_touchkey_devdata *devdata = touchkey_devdata; ret = i2c_touchkey_read_byte(devdata, &data); if (ret || (data & ESD_STATE_MASK)) { ret = recovery_routine(devdata); if (ret) { printk("%s: touchkey recovery " "failed!\n", __func__); goto err; } } if (data & UPDOWN_EVENT_MASK) { scancode = (data & SCANCODE_MASK) - 1; input_report_key(devdata->input_dev, devdata->pdata->keycode[scancode], 0); input_sync(devdata->input_dev); #ifdef CONFIG_SEC_KEY_DBG printk("[t_key]R:%d \n", devdata->pdata->keycode[scancode]); #else printk("[t_key] released\n"); #endif } else { if (!touch_state_val) { if (devdata->has_legacy_keycode) { scancode = (data & SCANCODE_MASK) - 1; if (scancode < 0 || scancode >= devdata->pdata->keycode_cnt) { printk("%s: scancode is out of " "range\n", __func__); goto err; } if (scancode == 1) TSP_forced_release(); input_report_key(devdata->input_dev, devdata->pdata->keycode[scancode], 1); #ifdef CONFIG_SEC_KEY_DBG printk("[t_key]P:%d\n", devdata->pdata->keycode[scancode]); #else printk("[t_key] pressed\n"); #endif } else { for (i = 0; i < devdata->pdata->keycode_cnt; i++) input_report_key(devdata->input_dev, devdata->pdata->keycode[i], !!(data & (1U << i))); } input_sync(devdata->input_dev); } } err: return IRQ_HANDLED; }
static irqreturn_t touchkey_interrupt_thread(int irq, void *touchkey_devdata) { u8 data; int i; int ret; int scancode; struct cypress_touchkey_devdata *devdata = touchkey_devdata; ret = i2c_touchkey_read_byte(devdata, &data); if (ret || (data & ESD_STATE_MASK)) { ret = recovery_routine(devdata); if (ret) { dev_err(&devdata->client->dev, "%s: touchkey recovery " "failed!\n", __func__); goto err; } } if (data & UPDOWN_EVENT_MASK) { scancode = (data & SCANCODE_MASK) - 1; input_report_key(devdata->input_dev, devdata->pdata->keycode[scancode], 0); input_sync(devdata->input_dev); dev_dbg(&devdata->client->dev, "[release] cypress touch key : %d \n", devdata->pdata->keycode[scancode]); } else { if (!touch_state_val) { if (devdata->has_legacy_keycode) { scancode = (data & SCANCODE_MASK) - 1; if (scancode < 0 || scancode >= devdata->pdata->keycode_cnt) { dev_err(&devdata->client->dev, "%s: scancode is out of " "range\n", __func__); goto err; } if (scancode == 1) TSP_forced_release(); input_report_key(devdata->input_dev, devdata->pdata->keycode[scancode], 1); dev_dbg(&devdata->client->dev, "[press] cypress touch key : %d \n", devdata->pdata->keycode[scancode]); } else { for (i = 0; i < devdata->pdata->keycode_cnt; i++) input_report_key(devdata->input_dev, devdata->pdata->keycode[i], !!(data & (1U << i))); } input_sync(devdata->input_dev); mod_timer(&bl_timer, jiffies + msecs_to_jiffies(backlight_timeout)); } } err: return IRQ_HANDLED; }
void touchkey_work_func(struct work_struct * p) { u8 data[3]; //printk("touchkey workqueue %s\n",__func__); if(!gpio_get_value(_3_GPIO_TOUCH_INT)) { if(i2c_touchkey_read(KEYCODE_REG, &data, 1) < 0) { printk("%s %d i2c transfer error\n", __func__, __LINE__); return; } #ifdef CONFIG_CPU_FREQ set_dvfs_target_level(LEV_400MHZ); #endif if(data[0] & UPDOWN_EVENT_BIT) { input_report_key(touchkey_driver->input_dev, touchkey_keycode[data[0] & KEYCODE_BIT], 0); input_sync(touchkey_driver->input_dev); //printk(" touchkey release keycode: %d\n", touchkey_keycode[data[0] & KEYCODE_BIT]); } else { if(touch_state_val == 1) { //printk(KERN_DEBUG "touchkey pressed but don't send event because touch is pressed. \n"); //set_touchkey_debug('P'); } else { if((data[0] & KEYCODE_BIT) == 2){ // if back key is pressed, release multitouch //printk("touchkey release tsp input. \n"); TSP_forced_release(); } input_report_key(touchkey_driver->input_dev, touchkey_keycode[data[0] & KEYCODE_BIT],1); input_sync(touchkey_driver->input_dev); //printk(" touchkey press keycode: %d\n", touchkey_keycode[data[0] & KEYCODE_BIT]); } } } enable_irq(IRQ_TOUCH_INT); return ; }
void touchkey_work_func(struct work_struct *p) { u8 data[3]; int ret; int retry = 10; set_touchkey_debug('a'); if (!gpio_get_value(_3_GPIO_TOUCH_INT)) { #ifdef CONFIG_CPU_FREQ set_dvfs_target_level(LEV_800MHZ); #endif ret = i2c_touchkey_read(KEYCODE_REG, data, 1); set_touchkey_debug(data[0]); if ((data[0] & ESD_STATE_BIT) || (ret != 0)) { printk ("ESD_STATE_BIT set or I2C fail: data: %d, retry: %d\n", data[0], retry); //releae key input_report_key(touchkey_driver->input_dev, touchkey_keycode[1], 0); input_report_key(touchkey_driver->input_dev, touchkey_keycode[2], 0); retry = 10; while (retry--) { #ifndef CONFIG_S5PC110_DEMPSEY_BOARD gpio_direction_output(_3_GPIO_TOUCH_EN, 0); #endif mdelay(300); init_hw(); if (i2c_touchkey_read(KEYCODE_REG, data, 3) >= 0) { printk("%s touchkey init success\n", __func__); set_touchkey_debug('O'); #ifndef CONFIG_S5PC110_DEMPSEY_BOARD enable_irq(IRQ_TOUCH_INT); #endif return; } printk("%s %d i2c transfer error retry = %d\n", __func__, __LINE__, retry); } //touchkey die , do not enable touchkey //enable_irq(IRQ_TOUCH_INT); touchkey_enable = -1; #ifndef CONFIG_S5PC110_DEMPSEY_BOARD gpio_direction_output(_3_GPIO_TOUCH_EN, 0); #endif #if !(defined(CONFIG_ARIES_NTT) || defined(CONFIG_S5PC110_DEMPSEY_BOARD)) gpio_direction_output(_3_GPIO_TOUCH_CE, 0); #endif gpio_direction_output(_3_TOUCH_SDA_28V, 0); gpio_direction_output(_3_TOUCH_SCL_28V, 0); printk("%s touchkey died\n", __func__); set_touchkey_debug('D'); return; } if (data[0] & UPDOWN_EVENT_BIT) { input_report_key(touchkey_driver->input_dev, touchkey_keycode[data[0] & KEYCODE_BIT], 0); input_sync(touchkey_driver->input_dev); //printk(" touchkey release keycode: %d\n", touchkey_keycode[data[0] & KEYCODE_BIT]); printk(KERN_DEBUG "touchkey release keycode:%d \n", touchkey_keycode[data[0] & KEYCODE_BIT]); } else { if (touch_state_val == 1) { printk(KERN_DEBUG "touchkey pressed but don't send event because touch is pressed. \n"); set_touchkey_debug('P'); } else { if ((data[0] & KEYCODE_BIT) == 2) { // if back key is pressed, release multitouch //printk("touchkey release tsp input. \n"); TSP_forced_release(); } input_report_key(touchkey_driver->input_dev, touchkey_keycode[data[0] & KEYCODE_BIT], 1); input_sync(touchkey_driver->input_dev); //printk(" touchkey press keycode: %d\n", touchkey_keycode[data[0] & KEYCODE_BIT]); printk(KERN_DEBUG "touchkey press keycode:%d \n", touchkey_keycode[data[0] & KEYCODE_BIT]); } } } //clear interrupt #ifndef CONFIG_S5PC110_DEMPSEY_BOARD if (readl(gpio_pend_mask_mem) & (0x1 << 1)) writel(readl(gpio_pend_mask_mem) | (0x1 << 1), gpio_pend_mask_mem); set_touchkey_debug('A'); enable_irq(IRQ_TOUCH_INT); #endif set_touchkey_debug('A'); }
static int i2c_touchkey_write(u8 * val, unsigned int len) { int err; struct i2c_msg msg[1]; unsigned char data[2]; int retry = 2; #ifdef CONFIG_KEYPAD_CYPRESS_TOUCH_USE_BLN if (touchkey_driver == NULL) { #else if ((touchkey_driver == NULL) || !(touchkey_enable == 1)) { #endif printk(KERN_DEBUG "touchkey is not enabled.W\n"); return -ENODEV; } while (retry--) { data[0] = *val; msg->addr = touchkey_driver->client->addr; msg->flags = I2C_M_WR; msg->len = len; msg->buf = data; err = i2c_transfer(touchkey_driver->client->adapter, msg, 1); if (err >= 0) return 0; printk(KERN_DEBUG "%s %d i2c transfer error\n", __func__, __LINE__); mdelay(10); } return err; } extern unsigned int touch_state_val; extern void TSP_forced_release(void); void touchkey_work_func(struct work_struct *p) { u8 data[3]; int ret; int retry = 10; set_touchkey_debug('a'); if (!gpio_get_value(_3_GPIO_TOUCH_INT)) { #ifdef CONFIG_CPU_FREQ set_dvfs_target_level(LEV_800MHZ); #endif ret = i2c_touchkey_read(KEYCODE_REG, data, 1); set_touchkey_debug(data[0]); if ((data[0] & ESD_STATE_BIT) || (ret != 0)) { printk ("ESD_STATE_BIT set or I2C fail: data: %d, retry: %d\n", data[0], retry); //releae key input_report_key(touchkey_driver->input_dev, touchkey_keycode[1], 0); input_report_key(touchkey_driver->input_dev, touchkey_keycode[2], 0); retry = 10; while (retry--) { #ifdef CONFIG_KEYPAD_CYPRESS_TOUCH_USE_BLN touchkey_power_off(); #else gpio_direction_output(_3_GPIO_TOUCH_EN, 0); #endif mdelay(300); init_hw(); if (i2c_touchkey_read(KEYCODE_REG, data, 3) >= 0) { printk("%s touchkey init success\n", __func__); set_touchkey_debug('O'); enable_irq(IRQ_TOUCH_INT); return; } printk("%s %d i2c transfer error retry = %d\n", __func__, __LINE__, retry); } //touchkey die , do not enable touchkey //enable_irq(IRQ_TOUCH_INT); touchkey_enable = -1; #ifdef CONFIG_KEYPAD_CYPRESS_TOUCH_USE_BLN touchkey_power_off_with_i2c(); #else gpio_direction_output(_3_GPIO_TOUCH_EN, 0); #if !defined(CONFIG_ARIES_NTT) gpio_direction_output(_3_GPIO_TOUCH_CE, 0); #endif gpio_direction_output(_3_TOUCH_SDA_28V, 0); gpio_direction_output(_3_TOUCH_SCL_28V, 0); #endif printk("%s touchkey died\n", __func__); set_touchkey_debug('D'); return; } if (data[0] & UPDOWN_EVENT_BIT) { input_report_key(touchkey_driver->input_dev, touchkey_keycode[data[0] & KEYCODE_BIT], 0); input_sync(touchkey_driver->input_dev); //printk(" touchkey release keycode: %d\n", touchkey_keycode[data[0] & KEYCODE_BIT]); printk(KERN_DEBUG "touchkey release keycode:%d \n", touchkey_keycode[data[0] & KEYCODE_BIT]); } else { if (touch_state_val == 1) { printk(KERN_DEBUG "touchkey pressed but don't send event because touch is pressed. \n"); set_touchkey_debug('P'); } else { if ((data[0] & KEYCODE_BIT) == 2) { // if back key is pressed, release multitouch //printk("touchkey release tsp input. \n"); TSP_forced_release(); } input_report_key(touchkey_driver->input_dev, touchkey_keycode[data[0] & KEYCODE_BIT], 1); input_sync(touchkey_driver->input_dev); //printk(" touchkey press keycode: %d\n", touchkey_keycode[data[0] & KEYCODE_BIT]); printk(KERN_DEBUG "touchkey press keycode:%d \n", touchkey_keycode[data[0] & KEYCODE_BIT]); } } } //clear interrupt if (readl(gpio_pend_mask_mem) & (0x1 << 1)) writel(readl(gpio_pend_mask_mem) | (0x1 << 1), gpio_pend_mask_mem); set_touchkey_debug('A'); enable_irq(IRQ_TOUCH_INT); }