[PATCH] Xilinx: SPI: driver not releasing memory

Subsystems: spi subsystem, the rest

STALE6385d

4 messages, 3 authors, 2009-03-06 · open the first message on its own page

[PATCH] Xilinx: SPI: driver not releasing memory

From: John Linn <hidden>
Date: 2009-02-28 00:10:06

The driver was not releasing memory when it was removed or
when there was a failure during probe. This fixes it.

Signed-off-by: John Linn <redacted>

---
This is an incremental patch to the patch (updated driver
for device tree) that is in the next branch.
---
 drivers/spi/xilinx_spi.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c
index fe7e5f3..494d3f7 100644
--- a/drivers/spi/xilinx_spi.c
+++ b/drivers/spi/xilinx_spi.c
@@ -354,7 +354,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev,
 	if (xspi->regs == NULL) {
 		rc = -ENOMEM;
 		dev_warn(&ofdev->dev, "ioremap failure\n");
-		goto put_master;
+		goto release_mem;
 	}
 	xspi->irq = r_irq->start;
 
@@ -365,7 +365,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev,
 	prop = of_get_property(ofdev->node, "xlnx,num-ss-bits", &len);
 	if (!prop || len < sizeof(*prop)) {
 		dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n");
-		goto put_master;
+		goto unmap_io;
 	}
 	master->num_chipselect = *prop;
 
@@ -397,6 +397,8 @@ free_irq:
 	free_irq(xspi->irq, xspi);
 unmap_io:
 	iounmap(xspi->regs);
+release_mem:
+	release_mem_region(r_mem->start, resource_size(r_mem));
 put_master:
 	spi_master_put(master);
 	return rc;
@@ -406,6 +408,7 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev)
 {
 	struct xilinx_spi *xspi;
 	struct spi_master *master;
+	struct resource r_mem;
 
 	master = platform_get_drvdata(ofdev);
 	xspi = spi_master_get_devdata(master);
@@ -413,6 +416,8 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev)
 	spi_bitbang_stop(&xspi->bitbang);
 	free_irq(xspi->irq, xspi);
 	iounmap(xspi->regs);
+	if (!of_address_to_resource(ofdev->node, 0, &r_mem))
+		release_mem_region(r_mem.start, resource_size(&r_mem));
 	dev_set_drvdata(&ofdev->dev, 0);
 	spi_master_put(xspi->bitbang.master);
 
-- 
1.5.3.4



This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.

Re: [PATCH] Xilinx: SPI: driver not releasing memory

From: Grant Likely <hidden>
Date: 2009-03-01 04:09:11

On Fri, Feb 27, 2009 at 4:54 PM, John Linn [off-list ref] wrote:
The driver was not releasing memory when it was removed or
when there was a failure during probe. This fixes it.

Signed-off-by: John Linn <redacted>
Looks good.

Acked-by: Grant Likely <redacted>

I'll pick this up into my -next branch and ask Ben to pull it in the
next week or so.

g.

-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

Re: [PATCH] Xilinx: SPI: driver not releasing memory

From: Grant Likely <hidden>
Date: 2009-03-06 15:49:39

David,

Are you okay with this patch and okay with it going in via Ben's
powerpc tree?  Ben wants to ensure that changes outside arch/powerpc/
are properly acked before going into his tree.

Thanks,
g.

On Sat, Feb 28, 2009 at 9:09 PM, Grant Likely [off-list ref] w=
rote:
On Fri, Feb 27, 2009 at 4:54 PM, John Linn [off-list ref] wrote:
quoted
The driver was not releasing memory when it was removed or
when there was a failure during probe. This fixes it.

Signed-off-by: John Linn <redacted>
Looks good.

Acked-by: Grant Likely <redacted>

I'll pick this up into my -next branch and ask Ben to pull it in the
next week or so.
quoted hunk
---
This is an incremental patch to the patch (updated driver
for device tree) that is in the next branch.
---
=A0drivers/spi/xilinx_spi.c | =A0 =A09 +++++++--
=A01 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c
index fe7e5f3..494d3f7 100644
--- a/drivers/spi/xilinx_spi.c
+++ b/drivers/spi/xilinx_spi.c
@@ -354,7 +354,7 @@ static int __init xilinx_spi_of_probe(struct of_devic=
e *ofdev,
=A0 =A0 =A0 =A0if (xspi->regs =3D=3D NULL) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0rc =3D -ENOMEM;
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev_warn(&ofdev->dev, "ioremap failure\n")=
;
quoted hunk
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto put_master;
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto release_mem;
=A0 =A0 =A0 =A0}
=A0 =A0 =A0 =A0xspi->irq =3D r_irq->start;
@@ -365,7 +365,7 @@ static int __init xilinx_spi_of_probe(struct of_devic=
e *ofdev,
=A0 =A0 =A0 =A0prop =3D of_get_property(ofdev->node, "xlnx,num-ss-bits", =
&len);
=A0 =A0 =A0 =A0if (!prop || len < sizeof(*prop)) {
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bit=
s' property\n");
quoted hunk
- =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto put_master;
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 goto unmap_io;
=A0 =A0 =A0 =A0}
=A0 =A0 =A0 =A0master->num_chipselect =3D *prop;
@@ -397,6 +397,8 @@ free_irq:
=A0 =A0 =A0 =A0free_irq(xspi->irq, xspi);
=A0unmap_io:
=A0 =A0 =A0 =A0iounmap(xspi->regs);
+release_mem:
+ =A0 =A0 =A0 release_mem_region(r_mem->start, resource_size(r_mem));
=A0put_master:
=A0 =A0 =A0 =A0spi_master_put(master);
=A0 =A0 =A0 =A0return rc;
@@ -406,6 +408,7 @@ static int __devexit xilinx_spi_remove(struct of_devi=
ce *ofdev)
quoted hunk
=A0{
=A0 =A0 =A0 =A0struct xilinx_spi *xspi;
=A0 =A0 =A0 =A0struct spi_master *master;
+ =A0 =A0 =A0 struct resource r_mem;

=A0 =A0 =A0 =A0master =3D platform_get_drvdata(ofdev);
=A0 =A0 =A0 =A0xspi =3D spi_master_get_devdata(master);
@@ -413,6 +416,8 @@ static int __devexit xilinx_spi_remove(struct of_devi=
ce *ofdev)
=A0 =A0 =A0 =A0spi_bitbang_stop(&xspi->bitbang);
=A0 =A0 =A0 =A0free_irq(xspi->irq, xspi);
=A0 =A0 =A0 =A0iounmap(xspi->regs);
+ =A0 =A0 =A0 if (!of_address_to_resource(ofdev->node, 0, &r_mem))
+ =A0 =A0 =A0 =A0 =A0 =A0 =A0 release_mem_region(r_mem.start, resource_si=
ze(&r_mem));
=A0 =A0 =A0 =A0dev_set_drvdata(&ofdev->dev, 0);
=A0 =A0 =A0 =A0spi_master_put(xspi->bitbang.master);

--
1.5.3.4



This email and any attachments are intended for the sole use of the named=
 recipient(s) and contain(s) confidential information that may be proprieta=
ry, privileged or copyrighted under applicable law. If you are not the inte=
nded recipient, do not read, copy, or forward this email message or any att=
achments. Delete this email message and any attachments immediately.


--=20
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.

Re: [PATCH] Xilinx: SPI: driver not releasing memory

From: David Brownell <hidden>
Date: 2009-03-06 20:00:53

On Friday 06 March 2009, Grant Likely wrote:
David,

Are you okay with this patch and okay with it going in via Ben's
powerpc tree?  Ben wants to ensure that changes outside arch/powerpc/
are properly acked before going into his tree.
Sure, no problem.

Thanks,
g.

On Sat, Feb 28, 2009 at 9:09 PM, Grant Likely [off-list ref] wrote:
quoted
On Fri, Feb 27, 2009 at 4:54 PM, John Linn [off-list ref] wrote:
quoted
The driver was not releasing memory when it was removed or
when there was a failure during probe. This fixes it.

Signed-off-by: John Linn <redacted>
Looks good.

Acked-by: Grant Likely <redacted>
Acked-by: David Brownell <redacted>

quoted
I'll pick this up into my -next branch and ask Ben to pull it in the
next week or so.
quoted
---
This is an incremental patch to the patch (updated driver
for device tree) that is in the next branch.
---
 drivers/spi/xilinx_spi.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c
index fe7e5f3..494d3f7 100644
--- a/drivers/spi/xilinx_spi.c
+++ b/drivers/spi/xilinx_spi.c
@@ -354,7 +354,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev,
       if (xspi->regs == NULL) {
               rc = -ENOMEM;
               dev_warn(&ofdev->dev, "ioremap failure\n");
-               goto put_master;
+               goto release_mem;
       }
       xspi->irq = r_irq->start;
@@ -365,7 +365,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev,
       prop = of_get_property(ofdev->node, "xlnx,num-ss-bits", &len);
       if (!prop || len < sizeof(*prop)) {
               dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n");
-               goto put_master;
+               goto unmap_io;
       }
       master->num_chipselect = *prop;
@@ -397,6 +397,8 @@ free_irq:
       free_irq(xspi->irq, xspi);
 unmap_io:
       iounmap(xspi->regs);
+release_mem:
+       release_mem_region(r_mem->start, resource_size(r_mem));
 put_master:
       spi_master_put(master);
       return rc;
@@ -406,6 +408,7 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev)
 {
       struct xilinx_spi *xspi;
       struct spi_master *master;
+       struct resource r_mem;

       master = platform_get_drvdata(ofdev);
       xspi = spi_master_get_devdata(master);
@@ -413,6 +416,8 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev)
       spi_bitbang_stop(&xspi->bitbang);
       free_irq(xspi->irq, xspi);
       iounmap(xspi->regs);
+       if (!of_address_to_resource(ofdev->node, 0, &r_mem))
+               release_mem_region(r_mem.start, resource_size(&r_mem));
       dev_set_drvdata(&ofdev->dev, 0);
       spi_master_put(xspi->bitbang.master);

--
1.5.3.4



This email and any attachments are intended for the sole use of the named recipient(s) and contain(s) confidential information that may be proprietary, privileged or copyrighted under applicable law. If you are not the intended recipient, do not read, copy, or forward this email message or any attachments. Delete this email message and any attachments immediately.



-- 
Grant Likely, B.Sc., P.Eng.
Secret Lab Technologies Ltd.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help