Skip to content

Commit

Permalink
lirc-rpi: Use the higher-level irq control functions
Browse files Browse the repository at this point in the history
This module used to access the irq_chip methods of the
gpio controller directly, rather than going through the
standard enable_irq/irq_set_irq_type functions. This
caused problems on pinctrl-bcm2835 which only implements
the irq_enable/disable methods and not irq_unmask/mask.
  • Loading branch information
Phil Elwell authored and popcornmix committed Jan 8, 2015
1 parent e46993c commit b9c9f8f
Showing 1 changed file with 15 additions and 37 deletions.
52 changes: 15 additions & 37 deletions drivers/staging/media/lirc/lirc_rpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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:
Expand All @@ -468,64 +458,52 @@ 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);

switch (result) {
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
": Bad irq number or handler\n");
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,
Expand Down

0 comments on commit b9c9f8f

Please sign in to comment.