Skip to contentSkip to conversation

pcmcia: at91_cf: clean up and add DT support

PATCH In review Nicolas Ferre 2 participants 10 messages Jun 6, 2013

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v3 cover pcmcia: at91_cf: clean up and add DT support

These patches clean up at91_cf a bit and add DT bindings.
They are based on a previous series from Joachim Eastwood and other cleanup patches by Fabio and Laurent.
I have collected them together as they are lying around for some time.

Greg kindly told me that he can take them through his char/misc driver tree, so I resend the series.

Thanks for your help, best regards.

v3: rebased on top of 3.10-rc4

v2: add 2 more cleanup patches:
- move to module_platform_driver_probe()
- little trivial indentation fix

Fabio Porcedda (1):
pcmcia: at91_cf: use module_platform_driver_probe()

Joachim Eastwood (5):
pcmcia: at91_cf: fix gpio_get_value in at91_cf_get_status
pcmcia: at91_cf: convert to dev_ print functions
pcmcia: at91_cf: use devm_ functions for allocations
pcmcia: at91_cf: clean up header includes
pcmcia: at91_cf: add support for DT

Laurent Navet (1):
pcmcia/trivial: at91_cf: fix checkpatch error

 .../devicetree/bindings/ata/atmel-at91_cf.txt      |  19 +++
 drivers/pcmcia/Kconfig                             |   2 +-
 drivers/pcmcia/at91_cf.c                           | 176 ++++++++++-----------
 3 files changed, 108 insertions(+), 89 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/ata/atmel-at91_cf.txt
Signature · 1 line
1.8.2.2
#1 lore raw

PATCH v3 1/7 pcmcia: at91_cf: fix gpio_get_value in at91_cf_get_status

From: Joachim Eastwood <[email protected]>

Commit 80af9e6d (pcmcia at91_cf: fix raw gpio number usage) forgot to change the parameter in gpio_get_value after adding gpio validation.

---
 drivers/pcmcia/at91_cf.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pcmcia/at91_cf.c +2 -2
index 01463c7..1b2c631 100644
@@ -100,9 +100,9 @@ static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp)
 		int vcc	= gpio_is_valid(cf->board->vcc_pin);
 
 		*sp = SS_DETECT | SS_3VCARD;
-		if (!rdy || gpio_get_value(rdy))
+		if (!rdy || gpio_get_value(cf->board->irq_pin))
 			*sp |= SS_READY;
-		if (!vcc || gpio_get_value(vcc))
+		if (!vcc || gpio_get_value(cf->board->vcc_pin))
 			*sp |= SS_POWERON;
 	} else
 		*sp = 0;
Signature · 1 line
1.8.2.2
#2 lore raw

Re: [PATCH v3 1/7] pcmcia: at91_cf: fix gpio_get_value in at91_cf_get_status

Quoted 5 lines · Nicolas Ferre

From: Joachim Eastwood <[email protected]>

Commit 80af9e6d (pcmcia at91_cf: fix raw gpio number usage) forgot to change the parameter in gpio_get_value after adding gpio validation.

this is a fix so should for in stable tree too

since #3.4

Best Regards,
J.

Quoted 31 lines
---
 drivers/pcmcia/at91_cf.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/pcmcia/at91_cf.c +2 -2
index 01463c7..1b2c631 100644
@@ -100,9 +100,9 @@ static int at91_cf_get_status(struct pcmcia_socket *s, u_int *sp)
 		int vcc	= gpio_is_valid(cf->board->vcc_pin);
 
 		*sp = SS_DETECT | SS_3VCARD;
-		if (!rdy || gpio_get_value(rdy))
+		if (!rdy || gpio_get_value(cf->board->irq_pin))
 			*sp |= SS_READY;
-		if (!vcc || gpio_get_value(vcc))
+		if (!vcc || gpio_get_value(cf->board->vcc_pin))
 			*sp |= SS_POWERON;
 	} else
 		*sp = 0;
Signature · 7 lines
1.8.2.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
#3 lore raw

PATCH v3 2/7 pcmcia: at91_cf: convert to dev_ print functions

In reply to Nicolas Ferre

From: Joachim Eastwood <[email protected]>

Convert all pr_* functions to equivalent dev_* functions and drop the driver_name variable.

---
 drivers/pcmcia/at91_cf.c | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)
drivers/pcmcia/at91_cf.c +10 -12
index 1b2c631..4eec14b 100644
@@ -41,8 +41,6 @@
 
 /*--------------------------------------------------------------------------*/
 
-static const char driver_name[] = "at91_cf";
-
 struct at91_cf_socket {
 	struct pcmcia_socket	socket;
 
@@ -76,7 +74,7 @@ static irqreturn_t at91_cf_irq(int irq, void *_cf)
 		/* kick pccard as needed */
 		if (present != cf->present) {
 			cf->present = present;
-			pr_debug("%s: card %s\n", driver_name,
+			dev_dbg(&cf->pdev->dev, "card %s\n",
 					present ? "present" : "gone");
 			pcmcia_parse_events(&cf->socket, SS_DETECT);
 		}
@@ -134,8 +132,8 @@ at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
 	/* toggle reset if needed */
 	gpio_set_value(cf->board->rst_pin, s->flags & SS_RESET);
 
-	pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n",
-		driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask);
+	dev_dbg(&cf->pdev->dev, "Vcc %d, io_irq %d, flags %04x csc %04x\n",
+				s->Vcc, s->io_irq, s->flags, s->csc_mask);
 
 	return 0;
 }
@@ -171,10 +169,10 @@ static int at91_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io)
 	 */
 	if (!(io->flags & (MAP_16BIT | MAP_AUTOSZ))) {
 		csr |= AT91_SMC_DBW_8;
-		pr_debug("%s: 8bit i/o bus\n", driver_name);
+		dev_dbg(&cf->pdev->dev, "8bit i/o bus\n");
 	} else {
 		csr |= AT91_SMC_DBW_16;
-		pr_debug("%s: 16bit i/o bus\n", driver_name);
+		dev_dbg(&cf->pdev->dev, "16bit i/o bus\n");
 	}
 	at91_ramc_write(0, AT91_SMC_CSR(cf->board->chipselect), csr);
 
@@ -242,7 +240,7 @@ static int __init at91_cf_probe(struct platform_device *pdev)
 	status = gpio_request(board->det_pin, "cf_det");
 	if (status < 0)
 		goto fail0;
-	status = request_irq(gpio_to_irq(board->det_pin), at91_cf_irq, 0, driver_name, cf);
+	status = request_irq(gpio_to_irq(board->det_pin), at91_cf_irq, 0, "at91_cf detect", cf);
 	if (status < 0)
 		goto fail00;
 	device_init_wakeup(&pdev->dev, 1);
@@ -268,7 +266,7 @@ static int __init at91_cf_probe(struct platform_device *pdev)
 		if (status < 0)
 			goto fail0c;
 		status = request_irq(gpio_to_irq(board->irq_pin), at91_cf_irq,
-				IRQF_SHARED, driver_name, cf);
+				IRQF_SHARED, "at91_cf", cf);
 		if (status < 0)
 			goto fail0d;
 		cf->socket.pci_irq = gpio_to_irq(board->irq_pin);
@@ -284,12 +282,12 @@ static int __init at91_cf_probe(struct platform_device *pdev)
 	}
 
 	/* reserve chip-select regions */
-	if (!request_mem_region(io->start, resource_size(io), driver_name)) {
+	if (!request_mem_region(io->start, resource_size(io), "at91_cf")) {
 		status = -ENXIO;
 		goto fail1;
 	}
 
-	pr_info("%s: irqs det #%d, io #%d\n", driver_name,
+	dev_info(&pdev->dev, "irqs det #%d, io #%d\n",
 		gpio_to_irq(board->det_pin), gpio_to_irq(board->irq_pin));
 
 	cf->socket.owner = THIS_MODULE;
@@ -391,7 +389,7 @@ static int at91_cf_resume(struct platform_device *pdev)
 
 static struct platform_driver at91_cf_driver = {
 	.driver = {
-		.name		= (char *) driver_name,
+		.name		= "at91_cf",
 		.owner		= THIS_MODULE,
 	},
 	.remove		= __exit_p(at91_cf_remove),
Signature · 1 line
1.8.2.2
#4 lore raw

PATCH v3 3/7 pcmcia: at91_cf: use devm_ functions for allocations

In reply to Nicolas Ferre

From: Joachim Eastwood <[email protected]>

---
 drivers/pcmcia/at91_cf.c | 77 +++++++++++++++---------------------------------
 1 file changed, 24 insertions(+), 53 deletions(-)
drivers/pcmcia/at91_cf.c +24 -53
index 4eec14b..43bc342 100644
@@ -227,7 +227,7 @@ static int __init at91_cf_probe(struct platform_device *pdev)
 	if (!io)
 		return -ENODEV;
 
-	cf = kzalloc(sizeof *cf, GFP_KERNEL);
+	cf = devm_kzalloc(&pdev->dev, sizeof(*cf), GFP_KERNEL);
 	if (!cf)
 		return -ENOMEM;
 
@@ -237,22 +237,25 @@ static int __init at91_cf_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, cf);
 
 	/* must be a GPIO; ergo must trigger on both edges */
-	status = gpio_request(board->det_pin, "cf_det");
+	status = devm_gpio_request(&pdev->dev, board->det_pin, "cf_det");
 	if (status < 0)
-		goto fail0;
-	status = request_irq(gpio_to_irq(board->det_pin), at91_cf_irq, 0, "at91_cf detect", cf);
+		return status;
+
+	status = devm_request_irq(&pdev->dev, gpio_to_irq(board->det_pin),
+					at91_cf_irq, 0, "at91_cf detect", cf);
 	if (status < 0)
-		goto fail00;
+		return status;
+
 	device_init_wakeup(&pdev->dev, 1);
 
-	status = gpio_request(board->rst_pin, "cf_rst");
+	status = devm_gpio_request(&pdev->dev, board->rst_pin, "cf_rst");
 	if (status < 0)
 		goto fail0a;
 
 	if (gpio_is_valid(board->vcc_pin)) {
-		status = gpio_request(board->vcc_pin, "cf_vcc");
+		status = devm_gpio_request(&pdev->dev, board->vcc_pin, "cf_vcc");
 		if (status < 0)
-			goto fail0b;
+			goto fail0a;
 	}
 
 	/*
@@ -262,29 +265,30 @@ static int __init at91_cf_probe(struct platform_device *pdev)
 	 * (Note:  DK board doesn't wire the IRQ pin...)
 	 */
 	if (gpio_is_valid(board->irq_pin)) {
-		status = gpio_request(board->irq_pin, "cf_irq");
+		status = devm_gpio_request(&pdev->dev, board->irq_pin, "cf_irq");
 		if (status < 0)
-			goto fail0c;
-		status = request_irq(gpio_to_irq(board->irq_pin), at91_cf_irq,
-				IRQF_SHARED, "at91_cf", cf);
+			goto fail0a;
+
+		status = devm_request_irq(&pdev->dev, gpio_to_irq(board->irq_pin),
+					at91_cf_irq, IRQF_SHARED, "at91_cf", cf);
 		if (status < 0)
-			goto fail0d;
+			goto fail0a;
 		cf->socket.pci_irq = gpio_to_irq(board->irq_pin);
 	} else
 		cf->socket.pci_irq = nr_irqs + 1;
 
 	/* pcmcia layer only remaps "real" memory not iospace */
-	cf->socket.io_offset = (unsigned long)
-			ioremap(cf->phys_baseaddr + CF_IO_PHYS, SZ_2K);
+	cf->socket.io_offset = (unsigned long) devm_ioremap(&pdev->dev,
+					cf->phys_baseaddr + CF_IO_PHYS, SZ_2K);
 	if (!cf->socket.io_offset) {
 		status = -ENXIO;
-		goto fail1;
+		goto fail0a;
 	}
 
 	/* reserve chip-select regions */
-	if (!request_mem_region(io->start, resource_size(io), "at91_cf")) {
+	if (!devm_request_mem_region(&pdev->dev, io->start, resource_size(io), "at91_cf")) {
 		status = -ENXIO;
-		goto fail1;
+		goto fail0a;
 	}
 
 	dev_info(&pdev->dev, "irqs det #%d, io #%d\n",
@@ -301,55 +305,22 @@ static int __init at91_cf_probe(struct platform_device *pdev)
 
 	status = pcmcia_register_socket(&cf->socket);
 	if (status < 0)
-		goto fail2;
+		goto fail0a;
 
 	return 0;
 
-fail2:
-	release_mem_region(io->start, resource_size(io));
-fail1:
-	if (cf->socket.io_offset)
-		iounmap((void __iomem *) cf->socket.io_offset);
-	if (gpio_is_valid(board->irq_pin)) {
-		free_irq(gpio_to_irq(board->irq_pin), cf);
-fail0d:
-		gpio_free(board->irq_pin);
-	}
-fail0c:
-	if (gpio_is_valid(board->vcc_pin))
-		gpio_free(board->vcc_pin);
-fail0b:
-	gpio_free(board->rst_pin);
 fail0a:
 	device_init_wakeup(&pdev->dev, 0);
-	free_irq(gpio_to_irq(board->det_pin), cf);
-fail00:
-	gpio_free(board->det_pin);
-fail0:
-	kfree(cf);
 	return status;
 }
 
 static int __exit at91_cf_remove(struct platform_device *pdev)
 {
 	struct at91_cf_socket	*cf = platform_get_drvdata(pdev);
-	struct at91_cf_data	*board = cf->board;
-	struct resource		*io = cf->socket.io[0].res;
 
 	pcmcia_unregister_socket(&cf->socket);
-	release_mem_region(io->start, resource_size(io));
-	iounmap((void __iomem *) cf->socket.io_offset);
-	if (gpio_is_valid(board->irq_pin)) {
-		free_irq(gpio_to_irq(board->irq_pin), cf);
-		gpio_free(board->irq_pin);
-	}
-	if (gpio_is_valid(board->vcc_pin))
-		gpio_free(board->vcc_pin);
-	gpio_free(board->rst_pin);
 	device_init_wakeup(&pdev->dev, 0);
-	free_irq(gpio_to_irq(board->det_pin), cf);
-	gpio_free(board->det_pin);
-	kfree(cf);
+
 	return 0;
 }
 
Signature · 1 line
1.8.2.2
#5 lore raw

PATCH v3 4/7 pcmcia: at91_cf: clean up header includes

In reply to Nicolas Ferre

From: Joachim Eastwood <[email protected]>

Use includes from linux/ instead of asm/ and remove a unnecessary mach/ include.

---
 drivers/pcmcia/at91_cf.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/pcmcia/at91_cf.c +2 -4
index 43bc342..bce8a64 100644
@@ -18,13 +18,11 @@
 #include <linux/slab.h>
 #include <linux/gpio.h>
 #include <linux/platform_data/atmel.h>
+#include <linux/io.h>
+#include <linux/sizes.h>
 
 #include <pcmcia/ss.h>
 
-#include <mach/hardware.h>
-#include <asm/io.h>
-#include <asm/sizes.h>
-
 #include <mach/at91rm9200_mc.h>
 #include <mach/at91_ramc.h>
 
Signature · 1 line
1.8.2.2
#6 lore raw

PATCH v3 5/7 pcmcia: at91_cf: add support for DT

In reply to Nicolas Ferre

From: Joachim Eastwood <[email protected]>

---
 .../devicetree/bindings/ata/atmel-at91_cf.txt      | 19 +++++++++
 drivers/pcmcia/Kconfig                             |  2 +-
 drivers/pcmcia/at91_cf.c                           | 45 +++++++++++++++++++++-
 3 files changed, 64 insertions(+), 2 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/ata/atmel-at91_cf.txt
Documentation/devicetree/bindings/ata/atmel-at91_cf.txt new file +19 -0
new file mode 100644
index 0000000..c1d22b3
@@ -0,0 +1,19 @@
+Atmel AT91RM9200 CompactFlash
+
+Required properties:
+- compatible : "atmel,at91rm9200-cf".
+- reg : should specify localbus address and size used.
+- gpios : specifies the gpio pins to control the CF device. Detect
+  and reset gpio's are mandatory while irq and vcc gpio's are
+  optional and may be set to 0 if not present.
+
+Example:
+compact-flash at 50000000 {
+	compatible = "atmel,at91rm9200-cf";
+	reg = <0x50000000 0x30000000>;
+	gpios = <&pioC 13 0	/* irq */
+		 &pioC 15 0 	/* detect */
+		 0		/* vcc */
+		 &pioC  5 0	/* reset */
+		>;
+};
drivers/pcmcia/Kconfig +1 -1
index b90f85b..80faa56 100644
@@ -288,7 +288,7 @@ config BFIN_CFPCMCIA
 
 config AT91_CF
 	tristate "AT91 CompactFlash Controller"
-	depends on PCMCIA && ARCH_AT91RM9200
+	depends on PCMCIA && ARCH_AT91
 	help
 	  Say Y here to support the CompactFlash controller on AT91 chips.
 	  Or choose M to compile the driver as a module named "at91_cf".
drivers/pcmcia/at91_cf.c +44 -1

69 lines not on this page · raw message

Signature · 1 line
1.8.2.2
#7 lore raw

PATCH v3 6/7 pcmcia: at91_cf: use module_platform_driver_probe()

In reply to Nicolas Ferre

From: Fabio Porcedda <[email protected]>

Use module_platform_driver_probe() macro which makes the code smaller and simpler.

Cc Jean-Christophe PLAGNIOL-VILLARD <[email protected]>
---
 drivers/pcmcia/at91_cf.c | 12 +-----------
 1 file changed, 1 insertion(+), 11 deletions(-)
drivers/pcmcia/at91_cf.c +1 -11
index 149b95c..8ddc57c 100644
@@ -411,17 +411,7 @@ static struct platform_driver at91_cf_driver = {
 
 /*--------------------------------------------------------------------------*/
 
-static int __init at91_cf_init(void)
-{
-	return platform_driver_probe(&at91_cf_driver, at91_cf_probe);
-}
-module_init(at91_cf_init);
-
-static void __exit at91_cf_exit(void)
-{
-	platform_driver_unregister(&at91_cf_driver);
-}
-module_exit(at91_cf_exit);
+module_platform_driver_probe(at91_cf_driver, at91_cf_probe);
 
 MODULE_DESCRIPTION("AT91 Compact Flash Driver");
 MODULE_AUTHOR("David Brownell");
Signature · 1 line
1.8.2.2
#8 lore raw

PATCH v3 7/7 pcmcia/trivial: at91_cf: fix checkpatch error

In reply to Nicolas Ferre

From: Laurent Navet <[email protected]>

fix this checkpatch error:
- ERROR: switch and case should be at the same indent

---
 drivers/pcmcia/at91_cf.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/pcmcia/at91_cf.c +8 -8
index 8ddc57c..b8f5acf 100644
@@ -119,14 +119,14 @@ at91_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s)
 	/* switch Vcc if needed and possible */
 	if (gpio_is_valid(cf->board->vcc_pin)) {
 		switch (s->Vcc) {
-			case 0:
-				gpio_set_value(cf->board->vcc_pin, 0);
-				break;
-			case 33:
-				gpio_set_value(cf->board->vcc_pin, 1);
-				break;
-			default:
-				return -EINVAL;
+		case 0:
+			gpio_set_value(cf->board->vcc_pin, 0);
+			break;
+		case 33:
+			gpio_set_value(cf->board->vcc_pin, 1);
+			break;
+		default:
+			return -EINVAL;
 		}
 	}
 
Signature · 1 line
1.8.2.2
#9 lore raw
In reply to Nicolas Ferre
Quoted 8 lines · Nicolas Ferre

These patches clean up at91_cf a bit and add DT bindings.
They are based on a previous series from Joachim Eastwood and other cleanup patches by Fabio and Laurent.
I have collected them together as they are lying around for some time.

Greg kindly told me that he can take them through his char/misc driver tree, so I resend the series.

Quoted 7 lines

Thanks for your help, best regards.

v3: rebased on top of 3.10-rc4

v2: add 2 more cleanup patches:
- move to module_platform_driver_probe()
- little trivial indentation fix

on all Acked-by: Jean-Christophe PLAGNIOL-VILLARD <[email protected]>

Best Regards,
J.

Quoted 28 lines

Fabio Porcedda (1):
pcmcia: at91_cf: use module_platform_driver_probe()

Joachim Eastwood (5):
pcmcia: at91_cf: fix gpio_get_value in at91_cf_get_status
pcmcia: at91_cf: convert to dev_ print functions
pcmcia: at91_cf: use devm_ functions for allocations
pcmcia: at91_cf: clean up header includes
pcmcia: at91_cf: add support for DT

Laurent Navet (1):
pcmcia/trivial: at91_cf: fix checkpatch error

 .../devicetree/bindings/ata/atmel-at91_cf.txt      |  19 +++
 drivers/pcmcia/Kconfig                             |   2 +-
 drivers/pcmcia/at91_cf.c                           | 176 ++++++++++-----------
 3 files changed, 108 insertions(+), 89 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/ata/atmel-at91_cf.txt
Signature · 7 lines
1.8.2.2


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel