aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga/zynq-fpga.c
diff options
context:
space:
mode:
authorJason Gunthorpe <jgunthorpe@obsidianresearch.com>2016-11-21 17:26:45 -0500
committerAlan Tull <atull@opensource.altera.com>2016-11-29 16:51:48 -0500
commit340c0c53ea3073107d5bb7a61f3158e50bf189e0 (patch)
treebdabfcaac67ee4ab224aa5993010ddefbf8ba4db /drivers/fpga/zynq-fpga.c
parent80baf649c2778bb8900cb9011bc712b89faddbdb (diff)
fpga zynq: Fix incorrect ISR state on bootup
It is best practice to clear and mask all interrupts before associating the IRQ, and this should be done after the clock is enabled. This corrects a bad result from zynq_fpga_ops_state on bootup where left over latched values in INT_STS_OFFSET caused it to report an unconfigured FPGA as configured. After this change the boot up operating state for an unconfigured FPGA reports 'unknown'. Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Acked-by: Alan Tull <atull@opensource.altera.com> Acked-by: Moritz Fischer <moritz.fischer@ettus.com>
Diffstat (limited to 'drivers/fpga/zynq-fpga.c')
-rw-r--r--drivers/fpga/zynq-fpga.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/fpga/zynq-fpga.c b/drivers/fpga/zynq-fpga.c
index bc8e3ec2b134..1812bf7614e1 100644
--- a/drivers/fpga/zynq-fpga.c
+++ b/drivers/fpga/zynq-fpga.c
@@ -437,13 +437,6 @@ static int zynq_fpga_probe(struct platform_device *pdev)
437 return priv->irq; 437 return priv->irq;
438 } 438 }
439 439
440 err = devm_request_irq(dev, priv->irq, zynq_fpga_isr, 0,
441 dev_name(dev), priv);
442 if (err) {
443 dev_err(dev, "unable to request IRQ\n");
444 return err;
445 }
446
447 priv->clk = devm_clk_get(dev, "ref_clk"); 440 priv->clk = devm_clk_get(dev, "ref_clk");
448 if (IS_ERR(priv->clk)) { 441 if (IS_ERR(priv->clk)) {
449 dev_err(dev, "input clock not found\n"); 442 dev_err(dev, "input clock not found\n");
@@ -459,6 +452,16 @@ static int zynq_fpga_probe(struct platform_device *pdev)
459 /* unlock the device */ 452 /* unlock the device */
460 zynq_fpga_write(priv, UNLOCK_OFFSET, UNLOCK_MASK); 453 zynq_fpga_write(priv, UNLOCK_OFFSET, UNLOCK_MASK);
461 454
455 zynq_fpga_write(priv, INT_MASK_OFFSET, 0xFFFFFFFF);
456 zynq_fpga_write(priv, INT_STS_OFFSET, IXR_ALL_MASK);
457 err = devm_request_irq(dev, priv->irq, zynq_fpga_isr, 0, dev_name(dev),
458 priv);
459 if (err) {
460 dev_err(dev, "unable to request IRQ\n");
461 clk_disable_unprepare(priv->clk);
462 return err;
463 }
464
462 clk_disable(priv->clk); 465 clk_disable(priv->clk);
463 466
464 err = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager", 467 err = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager",