[PATCH 1/2] mtd: maps: physmap: Add GPIO VPP control

Pawel Moll pawel.moll at arm.com
Thu Jul 12 12:38:40 EDT 2012


Add GPIO control of the VPP signal:
* platform data fields to specify GPIO number and polarity
* set_vpp implementation setting the GPIO value

Signed-off-by: Pawel Moll <pawel.moll at arm.com>
---
 drivers/mtd/maps/physmap.c  |   22 ++++++++++++++++++++++
 include/linux/mtd/physmap.h |    2 ++
 2 files changed, 24 insertions(+)

diff --git a/drivers/mtd/maps/physmap.c b/drivers/mtd/maps/physmap.c
index 21b0b71..3ef4e1e 100644
--- a/drivers/mtd/maps/physmap.c
+++ b/drivers/mtd/maps/physmap.c
@@ -20,6 +20,7 @@
 #include <linux/mtd/physmap.h>
 #include <linux/mtd/concat.h>
 #include <linux/io.h>
+#include <linux/gpio.h>
 
 #define MAX_RESOURCES		4
 
@@ -87,6 +88,14 @@ static void physmap_set_vpp(struct map_info *map, int state)
 	spin_unlock_irqrestore(&info->vpp_lock, flags);
 }
 
+static void physmap_set_gpio_vpp(struct platform_device *pdev, int state)
+{
+	struct physmap_flash_data *physmap_data = pdev->dev.platform_data;
+
+	gpio_set_value(physmap_data->gpio_vpp,
+			!!state ^ !!physmap_data->gpio_vpp_active_low);
+}
+
 static const char *rom_probe_types[] = {
 					"cfi_probe",
 					"jedec_probe",
@@ -123,6 +132,19 @@ static int physmap_flash_probe(struct platform_device *dev)
 			goto err_out;
 	}
 
+	if (!physmap_data->set_vpp && gpio_is_valid(physmap_data->gpio_vpp)) {
+		unsigned long flags = GPIOF_DIR_OUT;
+		if (physmap_data->gpio_vpp_active_low)
+			flags |= GPIOF_INIT_HIGH;
+		else
+			flags |= GPIOF_INIT_LOW;
+		err = devm_gpio_request_one(&dev->dev, physmap_data->gpio_vpp,
+				flags, dev_name(&dev->dev));
+		if (err)
+			goto err_out;
+		physmap_data->set_vpp = physmap_set_gpio_vpp;
+	}
+
 	platform_set_drvdata(dev, info);
 
 	for (i = 0; i < dev->num_resources; i++) {
diff --git a/include/linux/mtd/physmap.h b/include/linux/mtd/physmap.h
index d2887e7..b5c85b6 100644
--- a/include/linux/mtd/physmap.h
+++ b/include/linux/mtd/physmap.h
@@ -26,6 +26,8 @@ struct physmap_flash_data {
 	int			(*init)(struct platform_device *);
 	void			(*exit)(struct platform_device *);
 	void			(*set_vpp)(struct platform_device *, int);
+	int			gpio_vpp;
+	bool			gpio_vpp_active_low;
 	unsigned int		nr_parts;
 	unsigned int		pfow_base;
 	char                    *probe_type;
-- 
1.7.9.5





More information about the linux-mtd mailing list