int __init opal_elog_init(void) { int rc = 0, irq; /* ELOG not supported by firmware */ if (!opal_check_token(OPAL_ELOG_READ)) return -1; elog_kset = kset_create_and_add("elog", NULL, opal_kobj); if (!elog_kset) { pr_warn("%s: failed to create elog kset\n", __func__); return -1; } irq = opal_event_request(ilog2(OPAL_EVENT_ERROR_LOG_AVAIL)); if (!irq) { pr_err("%s: Can't register OPAL event irq (%d)\n", __func__, irq); return irq; } rc = request_irq(irq, elog_event, IRQ_TYPE_LEVEL_HIGH, "opal-elog", NULL); if (rc) { pr_err("%s: Can't request OPAL event irq (%d)\n", __func__, rc); return rc; } /* We are now ready to pull error logs from opal. */ if (opal_check_token(OPAL_ELOG_RESEND)) opal_resend_pending_logs(); return 0; }
static int ipmi_powernv_probe(struct platform_device *pdev) { struct ipmi_smi_powernv *ipmi; struct device *dev; u32 prop; int rc; if (!pdev || !pdev->dev.of_node) return -ENODEV; dev = &pdev->dev; ipmi = devm_kzalloc(dev, sizeof(*ipmi), GFP_KERNEL); if (!ipmi) return -ENOMEM; spin_lock_init(&ipmi->msg_lock); rc = of_property_read_u32(dev->of_node, "ibm,ipmi-interface-id", &prop); if (rc) { dev_warn(dev, "No interface ID property\n"); goto err_free; } ipmi->interface_id = prop; rc = of_property_read_u32(dev->of_node, "interrupts", &prop); if (rc) { dev_warn(dev, "No interrupts property\n"); goto err_free; } 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); } 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, sizeof(*ipmi->opal_msg) + IPMI_MAX_MSG_LENGTH, GFP_KERNEL); if (!ipmi->opal_msg) { rc = -ENOMEM; goto err_unregister; } /* todo: query actual ipmi_device_id */ rc = ipmi_register_smi(&ipmi_powernv_smi_handlers, ipmi, &ipmi->ipmi_id, dev, 0); if (rc) { dev_warn(dev, "IPMI SMI registration failed (%d)\n", rc); goto err_free_msg; } dev_set_drvdata(dev, ipmi); return 0; err_free_msg: devm_kfree(dev, ipmi->opal_msg); err_unregister: free_irq(ipmi->irq, ipmi); err_dispose: irq_dispose_mapping(ipmi->irq); err_free: devm_kfree(dev, ipmi); return rc; }