|
@@ -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;
|