void __init imx_init_irq(void) { unsigned int irq; DEBUG_IRQ("Initializing imx interrupts\n"); /* Mask all interrupts initially */ IMR(0) = 0; IMR(1) = 0; IMR(2) = 0; IMR(3) = 0; for (irq = 0; irq < IMX_IRQS; irq++) { set_irq_chip(irq, &imx_internal_chip); set_irq_handler(irq, do_level_IRQ); set_irq_flags(irq, IRQF_VALID); } for (irq = IRQ_GPIOA(0); irq < IRQ_GPIOD(32); irq++) { set_irq_chip(irq, &imx_gpio_chip); set_irq_handler(irq, do_edge_IRQ); set_irq_flags(irq, IRQF_VALID); } set_irq_chained_handler(GPIO_INT_PORTA, imx_gpioa_demux_handler); set_irq_chained_handler(GPIO_INT_PORTB, imx_gpiob_demux_handler); set_irq_chained_handler(GPIO_INT_PORTC, imx_gpioc_demux_handler); set_irq_chained_handler(GPIO_INT_PORTD, imx_gpiod_demux_handler); /* Disable all interrupts initially. */ /* In IMX this is done in the bootloader. */ }
static void imx_gpiod_demux_handler(unsigned int irq_unused, struct irq_desc *desc) { unsigned int mask, irq; mask = ISR(3); irq = IRQ_GPIOD(0); imx_gpio_handler(mask, irq, desc); }
static int mx21ads_sdhc_init(struct device *dev, irq_handler_t detect_irq, void *data) { int ret; ret = request_irq(IRQ_GPIOD(25), detect_irq, IRQF_TRIGGER_FALLING, "mmc-detect", data); if (ret) goto out; return 0; out: return ret; }
/* init and exit */ int cbob_uart_init(void) { int error, i; cbob_uart_tty_driver = alloc_tty_driver(CBOB_UART_MINORS); if(!cbob_uart_tty_driver) return -ENOMEM; cbob_uart_tty_driver->owner = THIS_MODULE; cbob_uart_tty_driver->driver_name = "cbob_uart"; cbob_uart_tty_driver->name = "uart"; cbob_uart_tty_driver->devfs_name = "cbc/uart%d"; cbob_uart_tty_driver->major = CBOB_UART_MAJOR; cbob_uart_tty_driver->type = TTY_DRIVER_TYPE_SERIAL, cbob_uart_tty_driver->subtype = SERIAL_TYPE_NORMAL; cbob_uart_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS; cbob_uart_tty_driver->init_termios = tty_std_termios; cbob_uart_tty_driver->init_termios.c_iflag = IGNBRK | IGNPAR; cbob_uart_tty_driver->init_termios.c_oflag = 0; cbob_uart_tty_driver->init_termios.c_cflag = B115200 | CS8 | CREAD | CLOCAL; cbob_uart_tty_driver->init_termios.c_lflag = 0; cbob_uart_tty_driver->init_termios.c_cc[VMIN] = 1; cbob_uart_tty_driver->init_termios.c_cc[VTIME] = 0; tty_set_operations(cbob_uart_tty_driver, &cbob_uart_ops); error = tty_register_driver(cbob_uart_tty_driver); if(error) { printk(KERN_ERR "failed to register cbob uart tty driver"); put_tty_driver(cbob_uart_tty_driver); return error; } for(i = 0;i < CBOB_UART_MINORS; i++) { tty_register_device(cbob_uart_tty_driver, i, NULL); cbob_uarts[i] = NULL; } cbob_uart_workqueue = create_singlethread_workqueue("CBOB UART"); imx_gpio_mode(GPIO_PORTD | 27 | GPIO_IN | GPIO_GPIO | GPIO_IRQ_RISING); request_irq(IRQ_GPIOD(27), cbob_uart_handler, 0, "CBOB", 0); return error; }
void __init imx_init_irq(void) { unsigned int irq; DEBUG_IRQ("Initializing imx interrupts\n"); /* Disable all interrupts initially. */ /* Do not rely on the bootloader. */ __raw_writel(0, IMX_AITC_INTENABLEH); __raw_writel(0, IMX_AITC_INTENABLEL); /* Mask all GPIO interrupts as well */ IMR(0) = 0; IMR(1) = 0; IMR(2) = 0; IMR(3) = 0; for (irq = 0; irq < IMX_IRQS; irq++) { set_irq_chip(irq, &imx_internal_chip); set_irq_handler(irq, handle_level_irq); set_irq_flags(irq, IRQF_VALID); } for (irq = IRQ_GPIOA(0); irq < IRQ_GPIOD(32); irq++) { set_irq_chip(irq, &imx_gpio_chip); set_irq_handler(irq, handle_edge_irq); set_irq_flags(irq, IRQF_VALID); } set_irq_chained_handler(GPIO_INT_PORTA, imx_gpioa_demux_handler); set_irq_chained_handler(GPIO_INT_PORTB, imx_gpiob_demux_handler); set_irq_chained_handler(GPIO_INT_PORTC, imx_gpioc_demux_handler); set_irq_chained_handler(GPIO_INT_PORTD, imx_gpiod_demux_handler); /* Release masking of interrupts according to priority */ __raw_writel(-1, IMX_AITC_NIMASK); #ifdef CONFIG_FIQ /* Initialize FIQ */ init_FIQ(); #endif }
void cbob_uart_exit(void) { struct cbob_uart *uart; int i; free_irq(IRQ_GPIOD(27), 0); for(i = 0;i < CBOB_UART_MINORS;i++) tty_unregister_device(cbob_uart_tty_driver, i); tty_unregister_driver(cbob_uart_tty_driver); for(i = 0;i < CBOB_UART_MINORS;i++) { uart = cbob_uarts[i]; if(uart) { while(uart->open_count) do_close(uart); kfree(uart); cbob_uarts[i] = NULL; } } flush_workqueue(cbob_uart_workqueue); destroy_workqueue(cbob_uart_workqueue); }
static void mx21ads_sdhc_exit(struct device *dev, void *data) { free_irq(IRQ_GPIOD(25), data); }
} static struct ads7846_platform_data ads7846_config __initdata = { .get_pendown_state = ads7846_get_pendown_state, .keep_vref_on = 1, }; #endif #if defined(CONFIG_SPI_IMX) || defined(CONFIG_SPI_IMX_MODULE) static struct spi_board_info eukrea_mbimx27_spi_board_info[] __initdata = { [0] = { .modalias = "ads7846", .bus_num = 0, .chip_select = 0, .max_speed_hz = 1500000, .irq = IRQ_GPIOD(25), .platform_data = &ads7846_config, .mode = SPI_MODE_2, }, }; static int eukrea_mbimx27_spi_cs[] = {GPIO_PORTD | 28}; static const struct spi_imx_master eukrea_mbimx27_spi0_data __initconst = { .chipselect = eukrea_mbimx27_spi_cs, .num_chipselect = ARRAY_SIZE(eukrea_mbimx27_spi_cs), }; #endif static struct i2c_board_info eukrea_mbimx27_i2c_devices[] = { {
static int mx21ads_sdhc_init(struct device *dev, irq_handler_t detect_irq, void *data) { return request_irq(IRQ_GPIOD(25), detect_irq, IRQF_TRIGGER_FALLING, "mmc-detect", data); }