static void ts_interrupt_main(struct corgi_ts *corgi_ts, int isTimer) { if ((GPLR(IRQ_TO_GPIO(corgi_ts->irq_gpio)) & GPIO_bit(IRQ_TO_GPIO(corgi_ts->irq_gpio))) == 0) { /* Disable Interrupt */ set_irq_type(corgi_ts->irq_gpio, IRQ_TYPE_NONE); if (read_xydata(corgi_ts)) { corgi_ts->pendown = 1; new_data(corgi_ts); } mod_timer(&corgi_ts->timer, jiffies + HZ / 100); } else { if (corgi_ts->pendown == 1 || corgi_ts->pendown == 2) { mod_timer(&corgi_ts->timer, jiffies + HZ / 100); corgi_ts->pendown++; return; } if (corgi_ts->pendown) { corgi_ts->tc.pressure = 0; new_data(corgi_ts); } /* Enable Falling Edge */ set_irq_type(corgi_ts->irq_gpio, IRQ_TYPE_EDGE_FALLING); corgi_ts->pendown = 0; } }
static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt) { soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_CD_VALID), IRQ_TYPE_NONE); set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_CD_VALID), IRQ_TYPE_NONE); set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_RDYINT), IRQ_TYPE_NONE); set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_RDYINT), IRQ_TYPE_NONE); }
static void __init cmx270_init_irq(void) { pxa27x_init_irq(); cmx270_pci_init_irq(); /* Setup interrupt for dm9000 */ pxa_gpio_mode(IRQ_TO_GPIO(CMX270_ETHIRQ)); set_irq_type(CMX270_ETHIRQ, IRQT_RISING); /* Setup interrupt for 2700G */ pxa_gpio_mode(IRQ_TO_GPIO(CMX270_GFXIRQ)); set_irq_type(CMX270_GFXIRQ, IRQT_FALLING); }
static int cmx270_mci_init(struct device *dev, irq_handler_t cmx270_detect_int, void *data) { int err; /* * setup GPIO for PXA27x MMC controller */ pxa_gpio_mode(GPIO32_MMCCLK_MD); pxa_gpio_mode(GPIO112_MMCCMD_MD); pxa_gpio_mode(GPIO92_MMCDAT0_MD); pxa_gpio_mode(GPIO109_MMCDAT1_MD); pxa_gpio_mode(GPIO110_MMCDAT2_MD); pxa_gpio_mode(GPIO111_MMCDAT3_MD); /* SB-X270 uses GPIO105 as SD power enable */ pxa_gpio_mode(105 | GPIO_OUT); /* card detect IRQ on GPIO 83 */ pxa_gpio_mode(IRQ_TO_GPIO(CMX270_MMC_IRQ)); set_irq_type(CMX270_MMC_IRQ, IRQT_FALLING); err = request_irq(CMX270_MMC_IRQ, cmx270_detect_int, IRQF_DISABLED | IRQF_TRIGGER_FALLING, "MMC card detect", data); if (err) { printk(KERN_ERR "cmx270_mci_init: MMC/SD: can't" " request MMC card detect IRQ\n"); return -1; } return 0; }
// open() 함수를 이용하여 디바이스 드라이버가 열린 경우 호출되는 함수 static int cis_open(struct inode *minode, struct file *mfile) { int res; GPDR(IRQ_TO_GPIO(IRQ_CMOS)) &= ~GPIO_bit(IRQ_TO_GPIO(IRQ_CMOS)); set_irq_type(IRQ_CMOS, IRQ_TYPE_EDGE_RISING); res = request_irq(IRQ_CMOS,cis_interrupt,IRQF_DISABLED,"FPGA CAMERA",NULL); if(res < 0) printk(KERN_ERR "%s: Request for IRQ %d failed\n",__FUNCTION__,IRQ_CMOS); *mode_select = 0x00; *sub_sampling = 0x00; return 0; }
void __cmx270_pci_init_irq(void) { it8152_init_irq(); pxa_gpio_mode(IRQ_TO_GPIO(GPIO_IT8152_IRQ)); set_irq_type(IRQ_GPIO(GPIO_IT8152_IRQ), IRQT_RISING); set_irq_chained_handler(IRQ_GPIO(GPIO_IT8152_IRQ), cmx270_it8152_irq_demux); }
/**************************************************************************** * * Interrupt handler, called whenever a keypress/release occurs * ***************************************************************************/ static irqreturn_t keypad_gpio_irq(int irq, void *dev_id) { struct CBLK *bcm_kp = dev_id; int gpio_pin = IRQ_TO_GPIO(irq); disable_irq(irq); reg_gpio_set_debounce_disable( gpio_pin ); keypad_scan( gpio_pin, bcm_kp ); reg_gpio_set_debounce_enable( gpio_pin ); reg_gpio_clear_interrupt( gpio_pin ); enable_irq(irq); return IRQ_HANDLED; }
static int pxa_gpio_irq_type(unsigned int irq, unsigned int type) { int gpio, idx; gpio = IRQ_TO_GPIO(irq); idx = gpio >> 5; if (type == IRQT_PROBE) { /* Don't mess with enabled GPIOs using preconfigured edges or GPIOs set to alternate function or to output during probe */ if ((GPIO_IRQ_rising_edge[idx] | GPIO_IRQ_falling_edge[idx] | GPDR(gpio)) & GPIO_bit(gpio)) return 0; if (GAFR(gpio) & (0x3 << (((gpio) & 0xf)*2))) return 0; type = __IRQT_RISEDGE | __IRQT_FALEDGE; } /* printk(KERN_DEBUG "IRQ%d (GPIO%d): ", irq, gpio); */ pxa_gpio_mode(gpio | GPIO_IN); if (type & __IRQT_RISEDGE) { /* printk("rising "); */ __set_bit (gpio, GPIO_IRQ_rising_edge); } else __clear_bit (gpio, GPIO_IRQ_rising_edge); if (type & __IRQT_FALEDGE) { /* printk("falling "); */ __set_bit (gpio, GPIO_IRQ_falling_edge); } else __clear_bit (gpio, GPIO_IRQ_falling_edge); /* printk("edges\n"); */ GRER(gpio) = GPIO_IRQ_rising_edge[idx] & GPIO_IRQ_mask[idx]; GFER(gpio) = GPIO_IRQ_falling_edge[idx] & GPIO_IRQ_mask[idx]; return 0; }
static irqreturn_t db5500_keypad_gpio_irq(int irq, void *dev_id) { struct db5500_keypad *keypad = dev_id; if (!gpio_get_value(IRQ_TO_GPIO(irq))) { db5500_manual_scan(keypad); if (!keypad->enable) { keypad->enable = true; db5500_mode_enable(keypad, true); } /* * Schedule the work queue to change it to * report the key pressed, if it is not detected in keypad mode. */ if (keypad->valid_key) { schedule_delayed_work(&keypad->gpio_work, KEY_PRESSED_DELAY); } } return IRQ_HANDLED; }
static int __init corgits_probe(struct platform_device *pdev) { struct corgi_ts *corgi_ts; struct input_dev *input_dev; int err = -ENOMEM; corgi_ts = kzalloc(sizeof(struct corgi_ts), GFP_KERNEL); input_dev = input_allocate_device(); if (!corgi_ts || !input_dev) goto fail1; platform_set_drvdata(pdev, corgi_ts); corgi_ts->machinfo = pdev->dev.platform_data; corgi_ts->irq_gpio = platform_get_irq(pdev, 0); if (corgi_ts->irq_gpio < 0) { err = -ENODEV; goto fail1; } corgi_ts->input = input_dev; init_timer(&corgi_ts->timer); corgi_ts->timer.data = (unsigned long) corgi_ts; corgi_ts->timer.function = corgi_ts_timer; input_dev->name = "Corgi Touchscreen"; input_dev->phys = "corgits/input0"; input_dev->id.bustype = BUS_HOST; input_dev->id.vendor = 0x0001; input_dev->id.product = 0x0002; input_dev->id.version = 0x0100; input_dev->dev.parent = &pdev->dev; input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS); input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); input_set_abs_params(input_dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0); input_set_abs_params(input_dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0); input_set_abs_params(input_dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0); pxa_gpio_mode(IRQ_TO_GPIO(corgi_ts->irq_gpio) | GPIO_IN); /* Initiaize ADS7846 Difference Reference mode */ corgi_ssp_ads7846_putget((1u << ADSCTRL_ADR_SH) | ADSCTRL_STS); mdelay(5); corgi_ssp_ads7846_putget((3u << ADSCTRL_ADR_SH) | ADSCTRL_STS); mdelay(5); corgi_ssp_ads7846_putget((4u << ADSCTRL_ADR_SH) | ADSCTRL_STS); mdelay(5); corgi_ssp_ads7846_putget((5u << ADSCTRL_ADR_SH) | ADSCTRL_STS); mdelay(5); if (request_irq(corgi_ts->irq_gpio, ts_interrupt, IRQF_DISABLED, "ts", corgi_ts)) { err = -EBUSY; goto fail1; } err = input_register_device(corgi_ts->input); if (err) goto fail2; corgi_ts->power_mode = PWR_MODE_ACTIVE; /* Enable Falling Edge */ set_irq_type(corgi_ts->irq_gpio, IRQ_TYPE_EDGE_FALLING); return 0; fail2: free_irq(corgi_ts->irq_gpio, corgi_ts); fail1: input_free_device(input_dev); kfree(corgi_ts); return err; }
static void lh7a404_vic2_ack_gpio_irq (u32 irq) { GPIO_GPIOFEOI = (1 << IRQ_TO_GPIO (irq)); VIC2_INTENCLR = (1 << irq); }
static void lh7a400_ack_gpio_irq (u32 irq) { GPIO_GPIOFEOI = (1 << IRQ_TO_GPIO (irq)); INTC_INTENC = (1 << irq); }
static void lh7a400_ack_gpio_irq(struct irq_data *d) { GPIO_GPIOFEOI = (1 << IRQ_TO_GPIO (d->irq)); INTC_INTENC = (1 << d->irq); }