hvc_irq.c (1049B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright IBM Corp. 2001,2008 4 * 5 * This file contains the IRQ specific code for hvc_console 6 * 7 */ 8 9#include <linux/interrupt.h> 10 11#include "hvc_console.h" 12 13static irqreturn_t hvc_handle_interrupt(int irq, void *dev_instance) 14{ 15 /* if hvc_poll request a repoll, then kick the hvcd thread */ 16 if (hvc_poll(dev_instance)) 17 hvc_kick(); 18 19 /* 20 * We're safe to always return IRQ_HANDLED as the hvcd thread will 21 * iterate through each hvc_struct. 22 */ 23 return IRQ_HANDLED; 24} 25 26/* 27 * For IRQ based systems these callbacks can be used 28 */ 29int notifier_add_irq(struct hvc_struct *hp, int irq) 30{ 31 int rc; 32 33 if (!irq) { 34 hp->irq_requested = 0; 35 return 0; 36 } 37 rc = request_irq(irq, hvc_handle_interrupt, hp->flags, 38 "hvc_console", hp); 39 if (!rc) 40 hp->irq_requested = 1; 41 return rc; 42} 43 44void notifier_del_irq(struct hvc_struct *hp, int irq) 45{ 46 if (!hp->irq_requested) 47 return; 48 free_irq(irq, hp); 49 hp->irq_requested = 0; 50} 51 52void notifier_hangup_irq(struct hvc_struct *hp, int irq) 53{ 54 notifier_del_irq(hp, irq); 55}