Commit 28f98a12f7bac9c3e5ba85d245d32ec0910cf8e5

Authored by Moritz Fischer
Committed by Greg Kroah-Hartman
1 parent 92d94a7ec5

fpga: zynq-fpga: Fix issue with drvdata being overwritten.

Upon registering a FPGA Manager low level driver, FPGA Manager
core overwrites the platform drvdata pointer. Prior to this commit
zynq-fpga falsely relied on this pointer to still be valid at remove()
time.

Reported-by: Alan Tull <atull@opensource.altera.com>
Signed-off-by: Moritz Fischer <moritz.fischer@ettus.com>
Acked-by: Alan Tull <atull@opensource.altera.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 1 changed file with 4 additions and 3 deletions Side-by-side Diff

drivers/fpga/zynq-fpga.c
... ... @@ -416,7 +416,6 @@
416 416 if (!priv)
417 417 return -ENOMEM;
418 418  
419   - platform_set_drvdata(pdev, priv);
420 419 priv->dev = dev;
421 420  
422 421 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
423 422  
424 423  
... ... @@ -477,10 +476,12 @@
477 476 static int zynq_fpga_remove(struct platform_device *pdev)
478 477 {
479 478 struct zynq_fpga_priv *priv;
  479 + struct fpga_manager *mgr;
480 480  
481   - fpga_mgr_unregister(&pdev->dev);
  481 + mgr = platform_get_drvdata(pdev);
  482 + priv = mgr->priv;
482 483  
483   - priv = platform_get_drvdata(pdev);
  484 + fpga_mgr_unregister(&pdev->dev);
484 485  
485 486 clk_unprepare(priv->clk);
486 487