struct gpio_desc *gpio;
        unsigned int carrier;
        unsigned int duty_cycle;
-       /* we need a spinlock to hold the cpu while transmitting */
-       spinlock_t lock;
 };
 
 static const struct of_device_id gpio_ir_tx_of_match[] = {
 static void gpio_ir_tx_unmodulated(struct gpio_ir *gpio_ir, uint *txbuf,
                                   uint count)
 {
-       unsigned long flags;
        ktime_t edge;
        s32 delta;
        int i;
 
-       spin_lock_irqsave(&gpio_ir->lock, flags);
+       local_irq_disable();
 
        edge = ktime_get();
 
        }
 
        gpiod_set_value(gpio_ir->gpio, 0);
-
-       spin_unlock_irqrestore(&gpio_ir->lock, flags);
 }
 
 static void gpio_ir_tx_modulated(struct gpio_ir *gpio_ir, uint *txbuf,
                                 uint count)
 {
-       unsigned long flags;
        ktime_t edge;
        /*
         * delta should never exceed 0.5 seconds (IR_MAX_DURATION) and on
        space = DIV_ROUND_CLOSEST((100 - gpio_ir->duty_cycle) *
                                  (NSEC_PER_SEC / 100), gpio_ir->carrier);
 
-       spin_lock_irqsave(&gpio_ir->lock, flags);
+       local_irq_disable();
 
        edge = ktime_get();
 
                        edge = last;
                }
        }
-
-       spin_unlock_irqrestore(&gpio_ir->lock, flags);
 }
 
 static int gpio_ir_tx(struct rc_dev *dev, unsigned int *txbuf,
                      unsigned int count)
 {
        struct gpio_ir *gpio_ir = dev->priv;
+       unsigned long flags;
 
+       local_irq_save(flags);
        if (gpio_ir->carrier)
                gpio_ir_tx_modulated(gpio_ir, txbuf, count);
        else
                gpio_ir_tx_unmodulated(gpio_ir, txbuf, count);
+       local_irq_restore(flags);
 
        return count;
 }
 
        gpio_ir->carrier = 38000;
        gpio_ir->duty_cycle = 50;
-       spin_lock_init(&gpio_ir->lock);
 
        rc = devm_rc_register_device(&pdev->dev, rcdev);
        if (rc < 0)