|
@@ -29,6 +29,7 @@
|
|
|
#include <linux/of.h>
|
|
|
#include <linux/of_platform.h>
|
|
|
#include <linux/export.h>
|
|
|
+#include <linux/interrupt.h>
|
|
|
|
|
|
#include <asm/hvconsole.h>
|
|
|
#include <asm/prom.h>
|
|
@@ -61,7 +62,6 @@ static struct hvc_opal_priv *hvc_opal_privs[MAX_NR_HVC_CONSOLES];
|
|
|
/* For early boot console */
|
|
|
static struct hvc_opal_priv hvc_opal_boot_priv;
|
|
|
static u32 hvc_opal_boot_termno;
|
|
|
-static bool hvc_opal_event_registered;
|
|
|
|
|
|
static const struct hv_ops hvc_opal_raw_ops = {
|
|
|
.get_chars = opal_get_chars,
|
|
@@ -162,28 +162,15 @@ static const struct hv_ops hvc_opal_hvsi_ops = {
|
|
|
.tiocmset = hvc_opal_hvsi_tiocmset,
|
|
|
};
|
|
|
|
|
|
-static int hvc_opal_console_event(struct notifier_block *nb,
|
|
|
- unsigned long events, void *change)
|
|
|
-{
|
|
|
- if (events & OPAL_EVENT_CONSOLE_INPUT)
|
|
|
- hvc_kick();
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static struct notifier_block hvc_opal_console_nb = {
|
|
|
- .notifier_call = hvc_opal_console_event,
|
|
|
-};
|
|
|
-
|
|
|
static int hvc_opal_probe(struct platform_device *dev)
|
|
|
{
|
|
|
const struct hv_ops *ops;
|
|
|
struct hvc_struct *hp;
|
|
|
struct hvc_opal_priv *pv;
|
|
|
hv_protocol_t proto;
|
|
|
- unsigned int termno, boot = 0;
|
|
|
+ unsigned int termno, irq, boot = 0;
|
|
|
const __be32 *reg;
|
|
|
|
|
|
-
|
|
|
if (of_device_is_compatible(dev->dev.of_node, "ibm,opal-console-raw")) {
|
|
|
proto = HV_PROTOCOL_RAW;
|
|
|
ops = &hvc_opal_raw_ops;
|
|
@@ -227,18 +214,18 @@ static int hvc_opal_probe(struct platform_device *dev)
|
|
|
dev->dev.of_node->full_name,
|
|
|
boot ? " (boot console)" : "");
|
|
|
|
|
|
- /* We don't do IRQ ... */
|
|
|
- hp = hvc_alloc(termno, 0, ops, MAX_VIO_PUT_CHARS);
|
|
|
+ irq = opal_event_request(ilog2(OPAL_EVENT_CONSOLE_INPUT));
|
|
|
+ if (!irq) {
|
|
|
+ pr_err("hvc_opal: Unable to map interrupt for device %s\n",
|
|
|
+ dev->dev.of_node->full_name);
|
|
|
+ return irq;
|
|
|
+ }
|
|
|
+
|
|
|
+ hp = hvc_alloc(termno, irq, ops, MAX_VIO_PUT_CHARS);
|
|
|
if (IS_ERR(hp))
|
|
|
return PTR_ERR(hp);
|
|
|
dev_set_drvdata(&dev->dev, hp);
|
|
|
|
|
|
- /* ... but we use OPAL event to kick the console */
|
|
|
- if (!hvc_opal_event_registered) {
|
|
|
- opal_notifier_register(&hvc_opal_console_nb);
|
|
|
- hvc_opal_event_registered = true;
|
|
|
- }
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|