edac, highbank: Fix interrupt setup of mem and l2 controller
commit a72b8859fd3941cc1d2940d5c43026d2c6fb959e upstream. Register and enable interrupts after the edac registration. Otherwise incomming ecc error interrupts lead to crashes during device setup. Fixing this in drivers for mc and l2. Signed-off-by: Robert Richter <robert.richter@linaro.org> Acked-by: Rob Herring <rob.herring@calxeda.com> Signed-off-by: Robert Richter <rric@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
65007af07b
commit
57a5b135c2
@@ -90,28 +90,30 @@ static int highbank_l2_err_probe(struct platform_device *pdev)
|
||||
goto err;
|
||||
}
|
||||
|
||||
drvdata->db_irq = platform_get_irq(pdev, 0);
|
||||
res = devm_request_irq(&pdev->dev, drvdata->db_irq,
|
||||
highbank_l2_err_handler,
|
||||
0, dev_name(&pdev->dev), dci);
|
||||
if (res < 0)
|
||||
goto err;
|
||||
|
||||
drvdata->sb_irq = platform_get_irq(pdev, 1);
|
||||
res = devm_request_irq(&pdev->dev, drvdata->sb_irq,
|
||||
highbank_l2_err_handler,
|
||||
0, dev_name(&pdev->dev), dci);
|
||||
if (res < 0)
|
||||
goto err;
|
||||
|
||||
dci->mod_name = dev_name(&pdev->dev);
|
||||
dci->dev_name = dev_name(&pdev->dev);
|
||||
|
||||
if (edac_device_add_device(dci))
|
||||
goto err;
|
||||
|
||||
drvdata->db_irq = platform_get_irq(pdev, 0);
|
||||
res = devm_request_irq(&pdev->dev, drvdata->db_irq,
|
||||
highbank_l2_err_handler,
|
||||
0, dev_name(&pdev->dev), dci);
|
||||
if (res < 0)
|
||||
goto err2;
|
||||
|
||||
drvdata->sb_irq = platform_get_irq(pdev, 1);
|
||||
res = devm_request_irq(&pdev->dev, drvdata->sb_irq,
|
||||
highbank_l2_err_handler,
|
||||
0, dev_name(&pdev->dev), dci);
|
||||
if (res < 0)
|
||||
goto err2;
|
||||
|
||||
devres_close_group(&pdev->dev, NULL);
|
||||
return 0;
|
||||
err2:
|
||||
edac_device_del_device(&pdev->dev);
|
||||
err:
|
||||
devres_release_group(&pdev->dev, NULL);
|
||||
edac_device_free_ctl_info(dci);
|
||||
|
||||
@@ -189,14 +189,6 @@ static int highbank_mc_probe(struct platform_device *pdev)
|
||||
goto err;
|
||||
}
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
res = devm_request_irq(&pdev->dev, irq, highbank_mc_err_handler,
|
||||
0, dev_name(&pdev->dev), mci);
|
||||
if (res < 0) {
|
||||
dev_err(&pdev->dev, "Unable to request irq %d\n", irq);
|
||||
goto err;
|
||||
}
|
||||
|
||||
mci->mtype_cap = MEM_FLAG_DDR3;
|
||||
mci->edac_ctl_cap = EDAC_FLAG_NONE | EDAC_FLAG_SECDED;
|
||||
mci->edac_cap = EDAC_FLAG_SECDED;
|
||||
@@ -217,10 +209,20 @@ static int highbank_mc_probe(struct platform_device *pdev)
|
||||
if (res < 0)
|
||||
goto err;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
res = devm_request_irq(&pdev->dev, irq, highbank_mc_err_handler,
|
||||
0, dev_name(&pdev->dev), mci);
|
||||
if (res < 0) {
|
||||
dev_err(&pdev->dev, "Unable to request irq %d\n", irq);
|
||||
goto err2;
|
||||
}
|
||||
|
||||
highbank_mc_create_debugfs_nodes(mci);
|
||||
|
||||
devres_close_group(&pdev->dev, NULL);
|
||||
return 0;
|
||||
err2:
|
||||
edac_mc_del_mc(&pdev->dev);
|
||||
err:
|
||||
devres_release_group(&pdev->dev, NULL);
|
||||
edac_mc_free(mci);
|
||||
|
||||
Reference in New Issue
Block a user