summaryrefslogtreecommitdiffstats
path: root/include/linux/nvram.h
diff options
context:
space:
mode:
authorFinn Thain <fthain@telegraphics.com.au>2019-01-15 15:18:56 +1100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-01-22 10:21:43 +0100
commitd5bbb5021ce8d9ff561c7469f5b4589ccb3bc4a6 (patch)
treef5b2f3c306eaeb39e3ac40882f613cf80e7ff469 /include/linux/nvram.h
parenta156c7ba669c65b55c7afcc3994e1199cc0cad47 (diff)
downloadlinux-d5bbb5021ce8d9ff561c7469f5b4589ccb3bc4a6.tar.gz
linux-d5bbb5021ce8d9ff561c7469f5b4589ccb3bc4a6.tar.bz2
linux-d5bbb5021ce8d9ff561c7469f5b4589ccb3bc4a6.zip
char/nvram: Adopt arch_nvram_ops
NVRAMs on different platforms and architectures have different attributes and access methods. E.g. some platforms have byte-at-a-time accessor functions while others have byte-range accessor functions. Some have checksum functionality while others do not. By calling ops struct methods via the common wrapper functions, the nvram module and other drivers can make use of the available NVRAM functionality in a portable way. Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/nvram.h')
-rw-r--r--include/linux/nvram.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/include/linux/nvram.h b/include/linux/nvram.h
index 79431dab87a1..bb4ea8cc6ea6 100644
--- a/include/linux/nvram.h
+++ b/include/linux/nvram.h
@@ -5,8 +5,30 @@
#include <linux/errno.h>
#include <uapi/linux/nvram.h>
+/**
+ * struct nvram_ops - NVRAM functionality made available to drivers
+ * @read: validate checksum (if any) then load a range of bytes from NVRAM
+ * @write: store a range of bytes to NVRAM then update checksum (if any)
+ * @read_byte: load a single byte from NVRAM
+ * @write_byte: store a single byte to NVRAM
+ * @get_size: return the fixed number of bytes in the NVRAM
+ *
+ * Architectures which provide an nvram ops struct need not implement all
+ * of these methods. If the NVRAM hardware can be accessed only one byte
+ * at a time then it may be sufficient to provide .read_byte and .write_byte.
+ * If the NVRAM has a checksum (and it is to be checked) the .read and
+ * .write methods can be used to implement that efficiently.
+ *
+ * Portable drivers may use the wrapper functions defined here.
+ * The nvram_read() and nvram_write() functions call the .read and .write
+ * methods when available and fall back on the .read_byte and .write_byte
+ * methods otherwise.
+ */
+
struct nvram_ops {
ssize_t (*get_size)(void);
+ unsigned char (*read_byte)(int);
+ void (*write_byte)(unsigned char, int);
ssize_t (*read)(char *, size_t, loff_t *);
ssize_t (*write)(char *, size_t, loff_t *);
};
@@ -25,11 +47,21 @@ static inline ssize_t nvram_get_size(void)
static inline unsigned char nvram_read_byte(int addr)
{
+#ifdef CONFIG_PPC
+#else
+ if (arch_nvram_ops.read_byte)
+ return arch_nvram_ops.read_byte(addr);
+#endif
return 0xFF;
}
static inline void nvram_write_byte(unsigned char val, int addr)
{
+#ifdef CONFIG_PPC
+#else
+ if (arch_nvram_ops.write_byte)
+ arch_nvram_ops.write_byte(val, addr);
+#endif
}
static inline ssize_t nvram_read(char *buf, size_t count, loff_t *ppos)