static irqreturn_t s3c_keygpio_isr(int irq, void *dev_id) { unsigned int key_status; static unsigned int prev_key_status = (1 << 6); struct s3c_keypad *pdata = (struct s3c_keypad *)dev_id; struct input_dev *dev = pdata->dev; #define KEY_POWER_EVT 116 // Beware that we may not obtain exact key up/down status at // this point. key_status = (readl(S5PV210_GPH2DAT)) & (1 << 6); // If ISR is called and up/down status remains the same, we // must have lost one and should report that first with // upside/down. if(in_sleep) { if (key_status == prev_key_status) { INPUT_REPORT_KEY(dev, KEY_POWER_EVT, key_status ? 1 : 0); } in_sleep = 0; } INPUT_REPORT_KEY(dev, KEY_POWER_EVT, key_status ? 0 : 1); keyled_timer_start(); /* keypad_led */ prev_key_status = key_status; printk(KERN_DEBUG "s3c_keygpio_isr pwr key_status =%d,\n", key_status); return IRQ_HANDLED; }
static irqreturn_t s3c_keygpio_keysense_isr(int irq, void *dev_id) { struct s3c_keypad *pdata = (struct s3c_keypad *)dev_id; struct input_dev *dev = pdata->dev; #define KEY_POWER_EVT 116 //Report Pressed key event INPUT_REPORT_KEY(dev, KEY_POWER_EVT, 1); // If ISR is called when wny any key is pressed while Target is call and in sleep mode. //Report released key event INPUT_REPORT_KEY(dev, KEY_POWER_EVT, 0); #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_MACH_TREBON) keyled_timer_start(); /* keypad_led */ #endif return IRQ_HANDLED; }
void keyled_lcd_on_Ext(void){ keyled_lcdOn = 1; if(keypad_clock) keyled_timer_start(); }
static void s3c_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; struct timer_list * timer = &pdata->keypad_timer; #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON) int skipcol=0; #endif 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_target_level(LEV_400MHZ); #endif #endif i = col * KEYPAD_ROWS; while (press_mask) { if (press_mask & 1) { #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON) /* * when camera & focus key press is detected simultaneously, * report focus first and camera second, so that platform * detects camera key repeat event (for key long press) */ if ( col==2 && ((keymask[3] ^ prevmask[3]) & keymask[3])) { input_report_key(dev,pdata->keycodes[3],1); #ifdef DEBUG_LOG_ENABLE printk(KERN_DEBUG"[KEYPAD] key Pressed : key %d map %d\n",3, pdata->keycodes[3]); #else printk(KERN_DEBUG"[KEYPAD] key Pressed\n"); #endif skipcol = 1; } #endif input_report_key(dev,pdata->keycodes[i],1); #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON) keyled_timer_start(); /* keypad_led */ #endif /* #ifdef CONFIG_KERNEL_DEBUG_SEC */ #ifdef DEBUG_LOG_ENABLE printk(KERN_DEBUG"[KEYPAD] key Pressed : key %d map %d\n",i, pdata->keycodes[i]); #else printk(KERN_DEBUG"[KEYPAD] key Pressed\n"); #endif } press_mask >>= 1; i++; #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON) if (skipcol) { press_mask >>= 1; i++; } #endif } i = col * KEYPAD_ROWS; while (release_mask) { if (release_mask & 1) { input_report_key(dev,pdata->keycodes[i],0); #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON) keyled_timer_start(); /* keypad_led */ #endif /* #ifdef CONFIG_KERNEL_DEBUG_SEC */ #ifdef DEBUG_LOG_ENABLE printk(KERN_DEBUG"[KEYPAD] key Released : %d map %d\n",i,pdata->keycodes[i]); #else printk(KERN_DEBUG"[KEYPAD] key Released\n"); #endif } release_mask >>= 1; i++; } prevmask[col] = keymask[col]; restart_timer |= keymask[col]; #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON) /* skip next column, we've already proccessed this*/ if (skipcol) { col++; skipcol = 0; } #endif } if (restart_timer) { #if defined(CONFIG_MACH_CHIEF) mod_timer(timer,jiffies + (5*HZ/100)); #else mod_timer(timer, timer->expires); #endif } else { writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON); pdata->keypad_timer_on = FALSE; } }
static void s3c_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; struct timer_list * timer = &pdata->keypad_timer; 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_target_level(LEV_400MHZ); #endif #endif i = col * KEYPAD_ROWS; while (press_mask) { if (press_mask & 1) { input_report_key(dev,pdata->keycodes[i],1); #ifdef CONFIG_MACH_CHIEF keyled_timer_start(); /* keypad_led */ #endif /* #ifdef CONFIG_KERNEL_DEBUG_SEC */ #ifdef DEBUG_LOG_ENABLE printk(KERN_DEBUG"[KEYPAD] key Pressed : key %d map %d\n",i, pdata->keycodes[i]); #else printk(KERN_DEBUG"[KEYPAD] key Pressed\n"); #endif } press_mask >>= 1; i++; } i = col * KEYPAD_ROWS; while (release_mask) { if (release_mask & 1) { input_report_key(dev,pdata->keycodes[i],0); #ifdef CONFIG_MACH_CHIEF keyled_timer_start(); /* keypad_led */ #endif /* #ifdef CONFIG_KERNEL_DEBUG_SEC */ #ifdef DEBUG_LOG_ENABLE printk(KERN_DEBUG"[KEYPAD] key Released : %d map %d\n",i,pdata->keycodes[i]); #else printk(KERN_DEBUG"[KEYPAD] key Released\n"); #endif } release_mask >>= 1; i++; } prevmask[col] = keymask[col]; restart_timer |= keymask[col]; } if (restart_timer) { mod_timer(timer, timer->expires); } else { writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON); pdata->keypad_timer_on = FALSE; } }