brcm2708: update to latest patches from RPi foundation
[openwrt/openwrt.git] / target / linux / brcm2708 / patches-4.19 / 950-0338-nvmem-add-type-attribute.patch
diff --git a/target/linux/brcm2708/patches-4.19/950-0338-nvmem-add-type-attribute.patch b/target/linux/brcm2708/patches-4.19/950-0338-nvmem-add-type-attribute.patch
new file mode 100644 (file)
index 0000000..661ba8e
--- /dev/null
@@ -0,0 +1,131 @@
+From c9e76146066660a2884e61216c1ce227cf509bf8 Mon Sep 17 00:00:00 2001
+From: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Date: Fri, 30 Nov 2018 11:53:20 +0000
+Subject: [PATCH] nvmem: add type attribute
+
+commit 16688453661b6d5159be558a1f8c1f54463a420f upstream.
+
+Add a type attribute so userspace is able to know how the data is stored as
+this can help taking the correct decision when selecting which device to
+use. This will also help program display the proper warnings when burning
+fuses for example.
+
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/nvmem/core.c           | 21 +++++++++++++++++++++
+ include/linux/nvmem-provider.h | 16 ++++++++++++++++
+ 2 files changed, 37 insertions(+)
+
+--- a/drivers/nvmem/core.c
++++ b/drivers/nvmem/core.c
+@@ -36,6 +36,7 @@ struct nvmem_device {
+       size_t                  size;
+       bool                    read_only;
+       int                     flags;
++      enum nvmem_type         type;
+       struct bin_attribute    eeprom;
+       struct device           *base_dev;
+       nvmem_reg_read_t        reg_read;
+@@ -84,6 +85,21 @@ static int nvmem_reg_write(struct nvmem_
+       return -EINVAL;
+ }
++static ssize_t type_show(struct device *dev,
++                       struct device_attribute *attr, char *buf)
++{
++      struct nvmem_device *nvmem = to_nvmem_device(dev);
++
++      return sprintf(buf, "%s\n", nvmem_type_str[nvmem->type]);
++}
++
++static DEVICE_ATTR_RO(type);
++
++static struct attribute *nvmem_attrs[] = {
++      &dev_attr_type.attr,
++      NULL,
++};
++
+ static ssize_t bin_attr_nvmem_read(struct file *filp, struct kobject *kobj,
+                                   struct bin_attribute *attr,
+                                   char *buf, loff_t pos, size_t count)
+@@ -169,6 +185,7 @@ static struct bin_attribute *nvmem_bin_r
+ static const struct attribute_group nvmem_bin_rw_group = {
+       .bin_attrs      = nvmem_bin_rw_attributes,
++      .attrs          = nvmem_attrs,
+ };
+ static const struct attribute_group *nvmem_rw_dev_groups[] = {
+@@ -192,6 +209,7 @@ static struct bin_attribute *nvmem_bin_r
+ static const struct attribute_group nvmem_bin_ro_group = {
+       .bin_attrs      = nvmem_bin_ro_attributes,
++      .attrs          = nvmem_attrs,
+ };
+ static const struct attribute_group *nvmem_ro_dev_groups[] = {
+@@ -216,6 +234,7 @@ static struct bin_attribute *nvmem_bin_r
+ static const struct attribute_group nvmem_bin_rw_root_group = {
+       .bin_attrs      = nvmem_bin_rw_root_attributes,
++      .attrs          = nvmem_attrs,
+ };
+ static const struct attribute_group *nvmem_rw_root_dev_groups[] = {
+@@ -239,6 +258,7 @@ static struct bin_attribute *nvmem_bin_r
+ static const struct attribute_group nvmem_bin_ro_root_group = {
+       .bin_attrs      = nvmem_bin_ro_root_attributes,
++      .attrs          = nvmem_attrs,
+ };
+ static const struct attribute_group *nvmem_ro_root_dev_groups[] = {
+@@ -485,6 +505,7 @@ struct nvmem_device *nvmem_register(cons
+       nvmem->dev.bus = &nvmem_bus_type;
+       nvmem->dev.parent = config->dev;
+       nvmem->priv = config->priv;
++      nvmem->type = config->type;
+       nvmem->reg_read = config->reg_read;
+       nvmem->reg_write = config->reg_write;
+       nvmem->dev.of_node = config->dev->of_node;
+--- a/include/linux/nvmem-provider.h
++++ b/include/linux/nvmem-provider.h
+@@ -22,6 +22,20 @@ typedef int (*nvmem_reg_read_t)(void *pr
+ typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset,
+                                void *val, size_t bytes);
++enum nvmem_type {
++      NVMEM_TYPE_UNKNOWN = 0,
++      NVMEM_TYPE_EEPROM,
++      NVMEM_TYPE_OTP,
++      NVMEM_TYPE_BATTERY_BACKED,
++};
++
++static const char * const nvmem_type_str[] = {
++      [NVMEM_TYPE_UNKNOWN] = "Unknown",
++      [NVMEM_TYPE_EEPROM] = "EEPROM",
++      [NVMEM_TYPE_OTP] = "OTP",
++      [NVMEM_TYPE_BATTERY_BACKED] = "Battery backed",
++};
++
+ /**
+  * struct nvmem_config - NVMEM device configuration
+  *
+@@ -31,6 +45,7 @@ typedef int (*nvmem_reg_write_t)(void *p
+  * @owner:    Pointer to exporter module. Used for refcounting.
+  * @cells:    Optional array of pre-defined NVMEM cells.
+  * @ncells:   Number of elements in cells.
++ * @type:     Type of the nvmem storage
+  * @read_only:        Device is read-only.
+  * @root_only:        Device is accessibly to root only.
+  * @reg_read: Callback to read data.
+@@ -54,6 +69,7 @@ struct nvmem_config {
+       struct module           *owner;
+       const struct nvmem_cell_info    *cells;
+       int                     ncells;
++      enum nvmem_type         type;
+       bool                    read_only;
+       bool                    root_only;
+       nvmem_reg_read_t        reg_read;