Commit 16688453 authored by Alexandre Belloni's avatar Alexandre Belloni Committed by Greg Kroah-Hartman

nvmem: add type attribute

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: default avatarAlexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ecd589d8
...@@ -28,6 +28,7 @@ struct nvmem_device { ...@@ -28,6 +28,7 @@ struct nvmem_device {
size_t size; size_t size;
bool read_only; bool read_only;
int flags; int flags;
enum nvmem_type type;
struct bin_attribute eeprom; struct bin_attribute eeprom;
struct device *base_dev; struct device *base_dev;
struct list_head cells; struct list_head cells;
...@@ -83,6 +84,21 @@ static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset, ...@@ -83,6 +84,21 @@ static int nvmem_reg_write(struct nvmem_device *nvmem, unsigned int offset,
return -EINVAL; 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, static ssize_t bin_attr_nvmem_read(struct file *filp, struct kobject *kobj,
struct bin_attribute *attr, struct bin_attribute *attr,
char *buf, loff_t pos, size_t count) char *buf, loff_t pos, size_t count)
...@@ -168,6 +184,7 @@ static struct bin_attribute *nvmem_bin_rw_attributes[] = { ...@@ -168,6 +184,7 @@ static struct bin_attribute *nvmem_bin_rw_attributes[] = {
static const struct attribute_group nvmem_bin_rw_group = { static const struct attribute_group nvmem_bin_rw_group = {
.bin_attrs = nvmem_bin_rw_attributes, .bin_attrs = nvmem_bin_rw_attributes,
.attrs = nvmem_attrs,
}; };
static const struct attribute_group *nvmem_rw_dev_groups[] = { static const struct attribute_group *nvmem_rw_dev_groups[] = {
...@@ -191,6 +208,7 @@ static struct bin_attribute *nvmem_bin_ro_attributes[] = { ...@@ -191,6 +208,7 @@ static struct bin_attribute *nvmem_bin_ro_attributes[] = {
static const struct attribute_group nvmem_bin_ro_group = { static const struct attribute_group nvmem_bin_ro_group = {
.bin_attrs = nvmem_bin_ro_attributes, .bin_attrs = nvmem_bin_ro_attributes,
.attrs = nvmem_attrs,
}; };
static const struct attribute_group *nvmem_ro_dev_groups[] = { static const struct attribute_group *nvmem_ro_dev_groups[] = {
...@@ -215,6 +233,7 @@ static struct bin_attribute *nvmem_bin_rw_root_attributes[] = { ...@@ -215,6 +233,7 @@ static struct bin_attribute *nvmem_bin_rw_root_attributes[] = {
static const struct attribute_group nvmem_bin_rw_root_group = { static const struct attribute_group nvmem_bin_rw_root_group = {
.bin_attrs = nvmem_bin_rw_root_attributes, .bin_attrs = nvmem_bin_rw_root_attributes,
.attrs = nvmem_attrs,
}; };
static const struct attribute_group *nvmem_rw_root_dev_groups[] = { static const struct attribute_group *nvmem_rw_root_dev_groups[] = {
...@@ -238,6 +257,7 @@ static struct bin_attribute *nvmem_bin_ro_root_attributes[] = { ...@@ -238,6 +257,7 @@ static struct bin_attribute *nvmem_bin_ro_root_attributes[] = {
static const struct attribute_group nvmem_bin_ro_root_group = { static const struct attribute_group nvmem_bin_ro_root_group = {
.bin_attrs = nvmem_bin_ro_root_attributes, .bin_attrs = nvmem_bin_ro_root_attributes,
.attrs = nvmem_attrs,
}; };
static const struct attribute_group *nvmem_ro_root_dev_groups[] = { static const struct attribute_group *nvmem_ro_root_dev_groups[] = {
...@@ -605,6 +625,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) ...@@ -605,6 +625,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
nvmem->dev.bus = &nvmem_bus_type; nvmem->dev.bus = &nvmem_bus_type;
nvmem->dev.parent = config->dev; nvmem->dev.parent = config->dev;
nvmem->priv = config->priv; nvmem->priv = config->priv;
nvmem->type = config->type;
nvmem->reg_read = config->reg_read; nvmem->reg_read = config->reg_read;
nvmem->reg_write = config->reg_write; nvmem->reg_write = config->reg_write;
nvmem->dev.of_node = config->dev->of_node; nvmem->dev.of_node = config->dev->of_node;
......
...@@ -19,6 +19,20 @@ typedef int (*nvmem_reg_read_t)(void *priv, unsigned int offset, ...@@ -19,6 +19,20 @@ typedef int (*nvmem_reg_read_t)(void *priv, unsigned int offset,
typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset, typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset,
void *val, size_t bytes); 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 * struct nvmem_config - NVMEM device configuration
* *
...@@ -28,6 +42,7 @@ typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset, ...@@ -28,6 +42,7 @@ typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset,
* @owner: Pointer to exporter module. Used for refcounting. * @owner: Pointer to exporter module. Used for refcounting.
* @cells: Optional array of pre-defined NVMEM cells. * @cells: Optional array of pre-defined NVMEM cells.
* @ncells: Number of elements in cells. * @ncells: Number of elements in cells.
* @type: Type of the nvmem storage
* @read_only: Device is read-only. * @read_only: Device is read-only.
* @root_only: Device is accessibly to root only. * @root_only: Device is accessibly to root only.
* @reg_read: Callback to read data. * @reg_read: Callback to read data.
...@@ -51,6 +66,7 @@ struct nvmem_config { ...@@ -51,6 +66,7 @@ struct nvmem_config {
struct module *owner; struct module *owner;
const struct nvmem_cell_info *cells; const struct nvmem_cell_info *cells;
int ncells; int ncells;
enum nvmem_type type;
bool read_only; bool read_only;
bool root_only; bool root_only;
nvmem_reg_read_t reg_read; nvmem_reg_read_t reg_read;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment