diff --git a/drivers/staging/media/lirc/lirc_rpi.c b/drivers/staging/media/lirc/lirc_rpi.c index 697c06708dac3..126bf2277b718 100644 --- a/drivers/staging/media/lirc/lirc_rpi.c +++ b/drivers/staging/media/lirc/lirc_rpi.c @@ -79,8 +79,7 @@ static bool softcarrier = 1; static bool invert = 0; struct gpio_chip *gpiochip; -struct irq_chip *irqchip; -struct irq_data *irqdata; +static int irq_num; /* forward declarations */ static long send_pulse(unsigned long length); @@ -247,7 +246,7 @@ static irqreturn_t irq_handler(int i, void *blah, struct pt_regs *regs) signal = gpiochip->get(gpiochip, gpio_in_pin); /* unmask the irq */ - irqchip->irq_unmask(irqdata); + enable_irq(irq_num); if (sense != -1) { /* get current time */ @@ -341,7 +340,7 @@ static void read_pin_settings(struct device_node *node) static int init_port(void) { - int i, nlow, nhigh, ret, irq; + int i, nlow, nhigh, ret; struct device_node *node; node = lirc_rpi_dev->dev.of_node; @@ -413,16 +412,8 @@ static int init_port(void) gpiochip->set(gpiochip, gpio_out_pin, invert); - irq = gpiochip->to_irq(gpiochip, gpio_in_pin); - dprintk("to_irq %d\n", irq); - irqdata = irq_get_irq_data(irq); - - if (irqdata && irqdata->chip) { - irqchip = irqdata->chip; - } else { - ret = -ENODEV; - goto exit_gpio_free_in_pin; - } + irq_num = gpiochip->to_irq(gpiochip, gpio_in_pin); + dprintk("to_irq %d\n", irq_num); /* if pin is high, then this must be an active low receiver. */ if (sense == -1) { @@ -454,7 +445,6 @@ static int init_port(void) return 0; - exit_gpio_free_in_pin: gpio_free(gpio_in_pin); exit_gpio_free_out_pin: @@ -468,12 +458,11 @@ static int init_port(void) static int set_use_inc(void *data) { int result; - unsigned long flags; /* initialize timestamp */ do_gettimeofday(&lasttv); - result = request_irq(gpiochip->to_irq(gpiochip, gpio_in_pin), + result = request_irq(irq_num, (irq_handler_t) irq_handler, 0, LIRC_DRIVER_NAME, (void*) 0); @@ -481,7 +470,7 @@ static int set_use_inc(void *data) case -EBUSY: printk(KERN_ERR LIRC_DRIVER_NAME ": IRQ %d is busy\n", - gpiochip->to_irq(gpiochip, gpio_in_pin)); + irq_num); return -EBUSY; case -EINVAL: printk(KERN_ERR LIRC_DRIVER_NAME @@ -489,43 +478,32 @@ static int set_use_inc(void *data) return -EINVAL; default: dprintk("Interrupt %d obtained\n", - gpiochip->to_irq(gpiochip, gpio_in_pin)); + irq_num); break; }; /* initialize pulse/space widths */ init_timing_params(duty_cycle, freq); - spin_lock_irqsave(&lock, flags); - /* GPIO Pin Falling/Rising Edge Detect Enable */ - irqchip->irq_set_type(irqdata, - IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING); + irq_set_irq_type(irq_num, IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING); - /* unmask the irq */ - irqchip->irq_unmask(irqdata); - - spin_unlock_irqrestore(&lock, flags); + /* enable the irq */ + enable_irq(irq_num); return 0; } static void set_use_dec(void *data) { - unsigned long flags; - - spin_lock_irqsave(&lock, flags); - /* GPIO Pin Falling/Rising Edge Detect Disable */ - irqchip->irq_set_type(irqdata, 0); - irqchip->irq_mask(irqdata); - - spin_unlock_irqrestore(&lock, flags); + irq_set_irq_type(irq_num, 0); + disable_irq(irq_num); - free_irq(gpiochip->to_irq(gpiochip, gpio_in_pin), (void *) 0); + free_irq(irq_num, (void *) 0); dprintk(KERN_INFO LIRC_DRIVER_NAME - ": freed IRQ %d\n", gpiochip->to_irq(gpiochip, gpio_in_pin)); + ": freed IRQ %d\n", irq_num); } static ssize_t lirc_write(struct file *file, const char *buf,