static void keypad_timer_handler(unsigned long data) { u32 press_mask; u32 release_mask; u32 restart_timer = 0; int i,col; struct s3c_keypad *pdata = (struct s3c_keypad *)data; struct input_dev *dev = pdata->dev; keypad_scan(); for(col=0; col < KEYPAD_COLUMNS; col++) { press_mask = ((keymask[col] ^ prevmask[col]) & keymask[col]); release_mask = ((keymask[col] ^ prevmask[col]) & prevmask[col]); #ifdef CONFIG_CPU_FREQ #if USE_PERF_LEVEL_KEYPAD if (press_mask || release_mask) set_dvfs_perf_level(); #endif #endif i = col * KEYPAD_ROWS; while (press_mask) { if (press_mask & 1) { input_report_key(dev,pdata->keycodes[i],1); pr_err("[key_press] keycode=%d\n", i+1); //DPRINTK("\nkey Pressed : key %d map %d\n",i, pdata->keycodes[i]); } press_mask >>= 1; i++; } i = col * KEYPAD_ROWS; while (release_mask) { if (release_mask & 1) { input_report_key(dev,pdata->keycodes[i],0); pr_err("[key_release] keycode=%d\n", i+1); //DPRINTK("\nkey Released : %d map %d\n",i,pdata->keycodes[i]); } release_mask >>= 1; i++; } prevmask[col] = keymask[col]; restart_timer |= keymask[col]; } if (restart_timer) { mod_timer(&keypad_timer,jiffies + HZ/10); } else { writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON); is_timer_on = FALSE; } }
static irqreturn_t s3c_keypad_isr(int irq, void *dev_id) { #ifdef CONFIG_CPU_FREQ set_dvfs_perf_level(); #endif /* disable keypad interrupt and schedule for keypad timer handler */ writel(readl(key_base+S3C_KEYIFCON) & ~(INT_F_EN|INT_R_EN), key_base+S3C_KEYIFCON); keypad_timer.expires = jiffies + FIRST_SCAN_INTERVAL; mod_timer(&keypad_timer,keypad_timer.expires); /*Clear the keypad interrupt status*/ writel(KEYIFSTSCLR_CLEAR, key_base+S3C_KEYIFSTSCLR); return IRQ_HANDLED; }
static irqreturn_t slide_int_handler(int irq, void *dev_id) { struct s3c_keypad *s3c_keypad = (struct s3c_keypad *) dev_id; struct s3c_keypad_slide *slide = s3c_keypad->extra->slide; int state; #ifdef CONFIG_CPU_FREQ set_dvfs_perf_level(); #endif state = gpio_get_value(slide->gpio) ^ slide->state_upset; // DPRINTK(": changed Slide state (%d)\n", state); printk("[SLIDE] changed Slide state (%d)\n", state); input_report_switch(s3c_keypad->dev, SW_LID, state); input_sync(s3c_keypad->dev); return IRQ_HANDLED; }
static void s3c_ts_done_callback (struct s3c_adcts_value *ts_value) { long i; int x, y; int x_sum = 0, y_sum = 0; if (ts_value->status == TS_STATUS_UP) { input_report_key(data->dev, BTN_TOUCH, 0); input_sync(data->dev); touch_count = 0; return; } for (i = 0; i < ts->sampling_time; i++) { x_sum += ts_value->xp[i]; y_sum += ts_value->yp[i]; } x = (int) x_sum / (ts->sampling_time); y = (int) y_sum / (ts->sampling_time); #ifdef CONFIG_FB_S3C_LTE480WV y = 4000 - y; #endif /* CONFIG_FB_S3C_LTE480WV */ touch_count++; if (touch_count == 1) { //check first touch #ifdef CONFIG_CPU_FREQ set_dvfs_perf_level(); #endif /* CONFIG_CPU_FREQ */ #ifdef CONFIG_TOUCHSCREEN_S3C_DEBUG printk(KERN_INFO "\nFirst BTN_TOUCH Event(%03d, %03d) is discard\n", x, y); #endif return; } input_report_abs(data->dev, ABS_X, x); input_report_abs(data->dev, ABS_Y, y); input_report_abs(data->dev, ABS_Z, 0); input_report_key(data->dev, BTN_TOUCH, 1); input_sync(data->dev); }
static irqreturn_t gpio_int_handler(int irq, void *dev_id) { struct s3c_keypad *s3c_keypad = (struct s3c_keypad *) dev_id; DPRINTK(": gpio interrupt (IRQ: %d)\n", irq); #ifdef CONFIG_CPU_FREQ set_dvfs_perf_level(); #endif if(timer_pending(&gpiokey_timer)) del_timer(&gpiokey_timer); gpiokey_timer.expires = jiffies + 2; gpiokey_cnt = 0; add_timer(&gpiokey_timer); return IRQ_HANDLED; }
static irqreturn_t slide_int_handler(int irq, void *dev_id) { struct s3c_keypad *s3c_keypad = (struct s3c_keypad *) dev_id; struct s3c_keypad_slide *slide = s3c_keypad->extra->slide; int state; int test = 0; #ifdef CONFIG_CPU_FREQ set_dvfs_perf_level(); #endif test = gpio_get_value(slide->gpio); state = test ^ slide->state_upset; pr_debug("[SLIDE] gpio(%d-%d) state_upset(%d) state(%d) LINE(%d)\n", slide->gpio, test, slide->state_upset, state, __LINE__); #if defined(CONFIG_MACH_VINSQ) || defined(CONFIG_MACH_MAX) || defined(CONFIG_MACH_VITAL) input_report_switch(s3c_keypad->dev, SW_LID, !state); #else input_report_switch(s3c_keypad->dev, SW_LID, state); #endif input_sync(s3c_keypad->dev); return IRQ_HANDLED; }