powerpc/nvram: Allow byte length reads from mmio NVRAM driver
authorMartyn Welch <martyn.welch@gefanuc.com>
Thu, 2 Jul 2009 06:12:18 +0000 (06:12 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 20 Aug 2009 00:29:22 +0000 (10:29 +1000)
Add a byte length read and write interface compatible with the
nvram_generic driver interface to the mmio driver.

Signed-off-by: Martyn Welch <martyn.welch@gefanuc.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/sysdev/mmio_nvram.c

index 7b49633a4bd0590960af399f67b70c41c7c5e841..207324209065341df70115612c98b3b902bd4c3a 100644 (file)
@@ -53,6 +53,23 @@ static ssize_t mmio_nvram_read(char *buf, size_t count, loff_t *index)
        return count;
 }
 
+static unsigned char mmio_nvram_read_val(int addr)
+{
+       unsigned long flags;
+       unsigned char val;
+
+       if (addr >= mmio_nvram_len)
+               return 0xff;
+
+       spin_lock_irqsave(&mmio_nvram_lock, flags);
+
+       val = ioread8(mmio_nvram_start + addr);
+
+       spin_unlock_irqrestore(&mmio_nvram_lock, flags);
+
+       return val;
+}
+
 static ssize_t mmio_nvram_write(char *buf, size_t count, loff_t *index)
 {
        unsigned long flags;
@@ -72,6 +89,19 @@ static ssize_t mmio_nvram_write(char *buf, size_t count, loff_t *index)
        return count;
 }
 
+void mmio_nvram_write_val(int addr, unsigned char val)
+{
+       unsigned long flags;
+
+       if (addr < mmio_nvram_len) {
+               spin_lock_irqsave(&mmio_nvram_lock, flags);
+
+               iowrite8(val, mmio_nvram_start + addr);
+
+               spin_unlock_irqrestore(&mmio_nvram_lock, flags);
+       }
+}
+
 static ssize_t mmio_nvram_get_size(void)
 {
        return mmio_nvram_len;
@@ -114,6 +144,8 @@ int __init mmio_nvram_init(void)
        printk(KERN_INFO "mmio NVRAM, %luk at 0x%lx mapped to %p\n",
               mmio_nvram_len >> 10, nvram_addr, mmio_nvram_start);
 
+       ppc_md.nvram_read_val   = mmio_nvram_read_val;
+       ppc_md.nvram_write_val  = mmio_nvram_write_val;
        ppc_md.nvram_read       = mmio_nvram_read;
        ppc_md.nvram_write      = mmio_nvram_write;
        ppc_md.nvram_size       = mmio_nvram_get_size;