提交 dce143c3 编写于 作者: A Alistair Popple 提交者: Michael Ellerman

ipmi/powernv: Convert to irq event interface

Convert the opal ipmi driver to use the new irq interface for events.
Signed-off-by: NAlistair Popple <alistair@popple.id.au>
Acked-by: NCorey Minyard <cminyard@mvista.com>
Cc: Corey Minyard <minyard@acm.org>
Cc: openipmi-developer@lists.sourceforge.net
Signed-off-by: NMichael Ellerman <mpe@ellerman.id.au>
上级 9f0fd049
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <linux/list.h> #include <linux/list.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/interrupt.h>
#include <asm/opal.h> #include <asm/opal.h>
...@@ -23,8 +25,7 @@ struct ipmi_smi_powernv { ...@@ -23,8 +25,7 @@ struct ipmi_smi_powernv {
u64 interface_id; u64 interface_id;
struct ipmi_device_id ipmi_id; struct ipmi_device_id ipmi_id;
ipmi_smi_t intf; ipmi_smi_t intf;
u64 event; unsigned int irq;
struct notifier_block event_nb;
/** /**
* We assume that there can only be one outstanding request, so * We assume that there can only be one outstanding request, so
...@@ -197,15 +198,12 @@ static struct ipmi_smi_handlers ipmi_powernv_smi_handlers = { ...@@ -197,15 +198,12 @@ static struct ipmi_smi_handlers ipmi_powernv_smi_handlers = {
.poll = ipmi_powernv_poll, .poll = ipmi_powernv_poll,
}; };
static int ipmi_opal_event(struct notifier_block *nb, static irqreturn_t ipmi_opal_event(int irq, void *data)
unsigned long events, void *change)
{ {
struct ipmi_smi_powernv *smi = container_of(nb, struct ipmi_smi_powernv *smi = data;
struct ipmi_smi_powernv, event_nb);
if (events & smi->event)
ipmi_powernv_recv(smi); ipmi_powernv_recv(smi);
return 0; return IRQ_HANDLED;
} }
static int ipmi_powernv_probe(struct platform_device *pdev) static int ipmi_powernv_probe(struct platform_device *pdev)
...@@ -240,13 +238,16 @@ 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; goto err_free;
} }
ipmi->event = 1ull << prop; ipmi->irq = irq_of_parse_and_map(dev->of_node, 0);
ipmi->event_nb.notifier_call = ipmi_opal_event; 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 (request_irq(ipmi->irq, ipmi_opal_event, IRQ_TYPE_LEVEL_HIGH,
if (rc) { "opal-ipmi", ipmi)) {
dev_warn(dev, "OPAL notifier registration failed (%d)\n", rc); dev_warn(dev, "Unable to request irq\n");
goto err_free; goto err_dispose;
} }
ipmi->opal_msg = devm_kmalloc(dev, ipmi->opal_msg = devm_kmalloc(dev,
...@@ -271,7 +272,9 @@ static int ipmi_powernv_probe(struct platform_device *pdev) ...@@ -271,7 +272,9 @@ static int ipmi_powernv_probe(struct platform_device *pdev)
err_free_msg: err_free_msg:
devm_kfree(dev, ipmi->opal_msg); devm_kfree(dev, ipmi->opal_msg);
err_unregister: err_unregister:
opal_notifier_unregister(&ipmi->event_nb); free_irq(ipmi->irq, ipmi);
err_dispose:
irq_dispose_mapping(ipmi->irq);
err_free: err_free:
devm_kfree(dev, ipmi); devm_kfree(dev, ipmi);
return rc; return rc;
...@@ -282,7 +285,9 @@ static int ipmi_powernv_remove(struct platform_device *pdev) ...@@ -282,7 +285,9 @@ static int ipmi_powernv_remove(struct platform_device *pdev)
struct ipmi_smi_powernv *smi = dev_get_drvdata(&pdev->dev); struct ipmi_smi_powernv *smi = dev_get_drvdata(&pdev->dev);
ipmi_unregister_smi(smi->intf); ipmi_unregister_smi(smi->intf);
opal_notifier_unregister(&smi->event_nb); free_irq(smi->irq, smi);
irq_dispose_mapping(smi->irq);
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册