162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright IBM Corp. 2001,2008 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * This file contains the IRQ specific code for hvc_console 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/interrupt.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "hvc_console.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cistatic irqreturn_t hvc_handle_interrupt(int irq, void *dev_instance) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci /* if hvc_poll request a repoll, then kick the hvcd thread */ 1662306a36Sopenharmony_ci if (hvc_poll(dev_instance)) 1762306a36Sopenharmony_ci hvc_kick(); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci /* 2062306a36Sopenharmony_ci * We're safe to always return IRQ_HANDLED as the hvcd thread will 2162306a36Sopenharmony_ci * iterate through each hvc_struct. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_ci return IRQ_HANDLED; 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci/* 2762306a36Sopenharmony_ci * For IRQ based systems these callbacks can be used 2862306a36Sopenharmony_ci */ 2962306a36Sopenharmony_ciint notifier_add_irq(struct hvc_struct *hp, int irq) 3062306a36Sopenharmony_ci{ 3162306a36Sopenharmony_ci int rc; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci if (!irq) { 3462306a36Sopenharmony_ci hp->irq_requested = 0; 3562306a36Sopenharmony_ci return 0; 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci rc = request_irq(irq, hvc_handle_interrupt, hp->flags, 3862306a36Sopenharmony_ci "hvc_console", hp); 3962306a36Sopenharmony_ci if (!rc) 4062306a36Sopenharmony_ci hp->irq_requested = 1; 4162306a36Sopenharmony_ci return rc; 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_civoid notifier_del_irq(struct hvc_struct *hp, int irq) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci if (!hp->irq_requested) 4762306a36Sopenharmony_ci return; 4862306a36Sopenharmony_ci free_irq(irq, hp); 4962306a36Sopenharmony_ci hp->irq_requested = 0; 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_civoid notifier_hangup_irq(struct hvc_struct *hp, int irq) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci notifier_del_irq(hp, irq); 5562306a36Sopenharmony_ci} 56