static ssize_t keyshort_test(struct device *dev, struct device_attribute *attr, char *buf) { int count; int mask=0; u32 col=0,cval=0,rval=0; if(!gpio_get_value(S5PC11X_GPH2(6)))//Power Key { mask |= 0x1; } if(!gpio_get_value(S5PC11X_GPH3(3)))//Volume Up { mask |= 0x10; } if(HWREV >= 0x2) //yhkim change to 0x2 for Verizon ATLAS. { if(!gpio_get_value(S5PC11X_GPH3(1)) ) //volume down { mask |= 0x100; } } else { //for Volume Down col = 1; cval = KEYCOL_DMASK & ~((1 << col) | (1 << (col + 8))); // clear that column number and writel(cval, key_base+S3C_KEYIFCOL); // make that Normal output. // others shuld be High-Z output. udelay(KEYPAD_DELAY); rval = ~(readl(key_base+S3C_KEYIFROW)) & ((1<<KEYPAD_ROWS)-1) ; writel(KEYIFCOL_CLEAR, key_base+S3C_KEYIFCOL); // if((rval&0x02)) { mask |=0x100; } } if(/*!gpio_get_value(GPIO_KBR0) || !gpio_get_value(GPIO_KBR1) || !gpio_get_value(GPIO_KBR2) || */ mask) { count = sprintf(buf,"PRESS\n"); printk("keyshort_test: PRESS %d\n",mask); } else { count = sprintf(buf,"RELEASE\n"); printk("keyshort_test: RELEASE\n"); } return count; }
.ngpio = S5PC11X_GPIO_H0_NR, .label = "GPH0", }, }, { .base = S5PC11X_GPH1_BASE, .config = &gpio_cfg_noint, .chip = { .base = S5PC11X_GPH1(0), .ngpio = S5PC11X_GPIO_H1_NR, .label = "GPH1", }, }, { .base = S5PC11X_GPH2_BASE, .config = &gpio_cfg_noint, .chip = { .base = S5PC11X_GPH2(0), .ngpio = S5PC11X_GPIO_H2_NR, .label = "GPH2", }, }, { .base = S5PC11X_GPH3_BASE, .config = &gpio_cfg_noint, .chip = { .base = S5PC11X_GPH3(0), .ngpio = S5PC11X_GPIO_H3_NR, .label = "GPH3", }, }, { .base = S5PC11X_GPI_BASE, .config = &gpio_cfg, .chip = {
static int s3c_keygpio_isr_setup(void *pdev) { int ret; // if(HWREV >= 0xB) //yhkim block it for Verizon ATLAS. { if(HWREV >= 0x2) //yhkim change to 0x2 for Verizon ATLAS. { //volume down s3c_gpio_setpull(S5PC11X_GPH3(1), S3C_GPIO_PULL_UP); set_irq_type(IRQ_EINT(25), IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_EINT(25), s3c_keygpio_vol_down_isr, IRQF_DISABLED , "key vol down", (void *) pdev); if (ret) { printk("request_irq failed (IRQ_KEYPAD (key vol down)) !!!\n"); ret = -EIO; return ret; } //volume up printk("\n\n[Keypad] Setup VolUp Key interrupt(%d)!!\n",HWREV); s3c_gpio_setpull(S5PC11X_GPH3(3), S3C_GPIO_PULL_UP); set_irq_type(IRQ_EINT(27), IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_EINT(27), s3c_keygpio_vol_up_isr, IRQF_DISABLED , "key vol up", (void *) pdev); if (ret) { printk("request_irq failed (IRQ_KEYPAD (key vol up)) !!!\n"); ret = -EIO; return ret; } } else { //volume up s3c_gpio_setpull(S5PC11X_GPH3(3), S3C_GPIO_PULL_UP); set_irq_type(IRQ_EINT(27), IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_EINT(27), s3c_keygpio_vol_up_isr, IRQF_SAMPLE_RANDOM, "key vol up", (void *) pdev); if (ret) { printk("request_irq failed (IRQ_KEYPAD (key vol up)) !!!\n"); ret = -EIO; return ret; } } //ok key #if 0 //yhkim :: Verizon Atlas did not have OK key. //ok key s3c_gpio_setpull(S5PC11X_GPH3(5), S3C_GPIO_PULL_UP); set_irq_type(IRQ_EINT(29), IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_EINT(29), s3c_keygpio_ok_isr, IRQF_SAMPLE_RANDOM, "key ok", (void *) pdev); if (ret) { printk("request_irq failed (IRQ_KEYPAD (key ok)) !!!\n"); ret = -EIO; return ret; } #endif //ok key #if 0 s3c_gpio_setpull(S5PC11X_GPH3(0), S3C_GPIO_PULL_UP); set_irq_type(IRQ_EINT(24), IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_EINT(24), s3c_keygpio_ok_isr, IRQF_SAMPLE_RANDOM, "key ok", (void *) pdev); if (ret) { printk("request_irq failed (IRQ_KEYPAD (key ok)) !!!\n"); ret = -EIO; return ret; } #endif } //PWR key s3c_gpio_setpull(S5PC11X_GPH2(6), S3C_GPIO_PULL_UP); set_irq_type(IRQ_EINT(22), IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_EINT(22), s3c_keygpio_isr, IRQF_DISABLED , "key gpio", (void *) pdev); if (ret) { printk("request_irq failed (IRQ_KEYPAD (gpio)) !!!\n"); ret = -EIO; } return ret; }
static int s3c_irq_eint_set_type(unsigned int irq, unsigned int type) { int offs = eint_offset(irq); int shift; u32 ctrl, mask; u32 newvalue = 0; switch (type) { case IRQ_TYPE_NONE: printk(KERN_WARNING "No edge setting!\n"); break; case IRQ_TYPE_EDGE_RISING: newvalue = S5P_EXTINT_RISEEDGE; break; case IRQ_TYPE_EDGE_FALLING: newvalue = S5P_EXTINT_FALLEDGE; break; case IRQ_TYPE_EDGE_BOTH: newvalue = S5P_EXTINT_BOTHEDGE; break; case IRQ_TYPE_LEVEL_LOW: newvalue = S5P_EXTINT_LOWLEV; break; case IRQ_TYPE_LEVEL_HIGH: newvalue = S5P_EXTINT_HILEV; break; default: printk(KERN_ERR "No such irq type %d", type); return -1; } shift = (offs & 0x7) * 4; mask = 0x7 << shift; ctrl = __raw_readl(S5PC11X_EINTCON(eint_conf_reg(irq))); ctrl &= ~mask; ctrl |= newvalue << shift; __raw_writel(ctrl, S5PC11X_EINTCON(eint_conf_reg(irq))); #ifdef S5PC11X_ALIVEGPIO_STORE ctrl = __raw_readl(S5PC11X_EINTCON(eint_conf_reg(irq))); #endif if((0 <= offs) && (offs < 8)) s3c_gpio_cfgpin(S5PC11X_GPH0(offs&0x7), 0xf<<((offs&0x7)*4)); else if((8 <= offs) && (offs < 16)) s3c_gpio_cfgpin(S5PC11X_GPH1(offs&0x7), 0xf<<((offs&0x7)*4)); else if((16 <= offs) && (offs < 24)) s3c_gpio_cfgpin(S5PC11X_GPH2(offs&0x7), 0xf<<((offs&0x7)*4)); else if((24 <= offs) && (offs < 32)) s3c_gpio_cfgpin(S5PC11X_GPH3(offs&0x7), 0xf<<((offs&0x7)*4)); else printk(KERN_ERR "No such irq number %d", offs); return 0; }