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;
	}

}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}