Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dce143c3 authored by Alistair Popple's avatar Alistair Popple Committed by Michael Ellerman
Browse files

ipmi/powernv: Convert to irq event interface



Convert the opal ipmi driver to use the new irq interface for events.

Signed-off-by: default avatarAlistair Popple <alistair@popple.id.au>
Acked-by: default avatarCorey Minyard <cminyard@mvista.com>
Cc: Corey Minyard <minyard@acm.org>
Cc: openipmi-developer@lists.sourceforge.net
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 9f0fd049
Loading
Loading
Loading
Loading
+22 −17
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
#include <linux/list.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>

#include <asm/opal.h>

@@ -23,8 +25,7 @@ struct ipmi_smi_powernv {
	u64			interface_id;
	struct ipmi_device_id	ipmi_id;
	ipmi_smi_t		intf;
	u64			event;
	struct notifier_block	event_nb;
	unsigned int		irq;

	/**
	 * We assume that there can only be one outstanding request, so
@@ -197,15 +198,12 @@ static struct ipmi_smi_handlers ipmi_powernv_smi_handlers = {
	.poll			= ipmi_powernv_poll,
};

static int ipmi_opal_event(struct notifier_block *nb,
			  unsigned long events, void *change)
static irqreturn_t ipmi_opal_event(int irq, void *data)
{
	struct ipmi_smi_powernv *smi = container_of(nb,
					struct ipmi_smi_powernv, event_nb);
	struct ipmi_smi_powernv *smi = data;

	if (events & smi->event)
	ipmi_powernv_recv(smi);
	return 0;
	return IRQ_HANDLED;
}

static int ipmi_powernv_probe(struct platform_device *pdev)
@@ -240,13 +238,16 @@ static int ipmi_powernv_probe(struct platform_device *pdev)
		goto err_free;
	}

	ipmi->event = 1ull << prop;
	ipmi->event_nb.notifier_call = ipmi_opal_event;
	ipmi->irq = irq_of_parse_and_map(dev->of_node, 0);
	if (!ipmi->irq) {
		dev_info(dev, "Unable to map irq from device tree\n");
		ipmi->irq = opal_event_request(prop);
	}

	rc = opal_notifier_register(&ipmi->event_nb);
	if (rc) {
		dev_warn(dev, "OPAL notifier registration failed (%d)\n", rc);
		goto err_free;
	if (request_irq(ipmi->irq, ipmi_opal_event, IRQ_TYPE_LEVEL_HIGH,
				"opal-ipmi", ipmi)) {
		dev_warn(dev, "Unable to request irq\n");
		goto err_dispose;
	}

	ipmi->opal_msg = devm_kmalloc(dev,
@@ -271,7 +272,9 @@ static int ipmi_powernv_probe(struct platform_device *pdev)
err_free_msg:
	devm_kfree(dev, ipmi->opal_msg);
err_unregister:
	opal_notifier_unregister(&ipmi->event_nb);
	free_irq(ipmi->irq, ipmi);
err_dispose:
	irq_dispose_mapping(ipmi->irq);
err_free:
	devm_kfree(dev, ipmi);
	return rc;
@@ -282,7 +285,9 @@ static int ipmi_powernv_remove(struct platform_device *pdev)
	struct ipmi_smi_powernv *smi = dev_get_drvdata(&pdev->dev);

	ipmi_unregister_smi(smi->intf);
	opal_notifier_unregister(&smi->event_nb);
	free_irq(smi->irq, smi);
	irq_dispose_mapping(smi->irq);

	return 0;
}