GPMC has a writeprotect pin that can be connected to
peripherals. If any CS wants to enable writeprotect,
writeprotect will be enabled, once CS configurations
are finished.

Signed-off-by: Afzal Mohammed <af...@ti.com>
---
 arch/arm/mach-omap2/gpmc.c |   20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c
index 98b52c3..eec011a 100644
--- a/arch/arm/mach-omap2/gpmc.c
+++ b/arch/arm/mach-omap2/gpmc.c
@@ -159,6 +159,7 @@ struct gpmc_peripheral {
 static struct gpmc_peripheral gpmc_peripheral[GPMC_CS_NUM];
 static unsigned gpmc_num_peripheral;
 static unsigned gpmc_waitpin_map;
+static bool gpmc_writeprotect;
 
 static struct gpmc_client_irq gpmc_client_irq[GPMC_NR_IRQ];
 static struct irq_chip gpmc_irq_chip;
@@ -976,6 +977,9 @@ static void gpmc_setup_cs_config(unsigned cs, unsigned conf)
        else if (conf & GPMC_CONFIG1_PAGE_LEN_16)
                l |= GPMC_CONFIG1_PAGE_LEN_16;
 
+       if (conf & GPMC_CONFIG_WRITEPROTECT)
+               gpmc_writeprotect = true;
+
        conf &= (GPMC_CONFIG1_MUXADDDATA |
                        GPMC_CONFIG1_WRITETYPE_SYNC |
                        GPMC_CONFIG1_WRITEMULTIPLE_SUPP |
@@ -1462,6 +1466,19 @@ int gpmc_cs_reconfigure(char *name, int id, struct 
gpmc_cs_data *c)
 }
 EXPORT_SYMBOL_GPL(gpmc_cs_reconfigure);
 
+static inline void gpmc_setup_writeprotect(void)
+{
+       u32 l;
+
+       l = gpmc_read_reg(GPMC_CONFIG);
+       if (gpmc_writeprotect == true) {
+               l &= ~GPMC_CONFIG_WRITEPROTECT;
+               dev_info(gpmc_dev, "write protect enabled\n");
+       } else
+               l |= GPMC_CONFIG_WRITEPROTECT;
+       gpmc_write_reg(GPMC_CONFIG, l);
+}
+
 static __devinit int gpmc_probe(struct platform_device *pdev)
 {
        u32 l;
@@ -1521,6 +1538,8 @@ static __devinit int gpmc_probe(struct platform_device 
*pdev)
                        dev_err(gpmc_dev, "device creation on %s failed\n",
                                                                g_per->name);
 
+       gpmc_setup_writeprotect();
+
        return 0;
 }
 
@@ -1531,6 +1550,7 @@ static __exit int gpmc_remove(struct platform_device 
*pdev)
        for (; gpmc_num_peripheral; g_per++, gpmc_num_peripheral--)
                platform_device_unregister(g_per->pdev);
 
+       gpmc_writeprotect = false;
        gpmc_waitpin_map = 0;
        gpmc_free_irq();
        gpmc_mem_exit();
-- 
1.7.10.2

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to