mirror of
https://github.com/openwrt/openwrt.git
synced 2025-03-10 14:34:13 +00:00
kernel: update nvmem subsystem to the latest upstream
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
d3e89e69c5
commit
8dfe69cdfc
@ -197,6 +197,7 @@ CONFIG_NEED_KUSER_HELPERS=y
|
|||||||
CONFIG_NEED_PER_CPU_KM=y
|
CONFIG_NEED_PER_CPU_KM=y
|
||||||
CONFIG_NLS=y
|
CONFIG_NLS=y
|
||||||
CONFIG_NVMEM=y
|
CONFIG_NVMEM=y
|
||||||
|
# CONFIG_NVMEM_MICROCHIP_OTPC is not set
|
||||||
CONFIG_NVMEM_SYSFS=y
|
CONFIG_NVMEM_SYSFS=y
|
||||||
CONFIG_OF=y
|
CONFIG_OF=y
|
||||||
CONFIG_OF_ADDRESS=y
|
CONFIG_OF_ADDRESS=y
|
||||||
|
@ -303,6 +303,7 @@ CONFIG_NLS_UTF8=y
|
|||||||
CONFIG_NO_HZ_COMMON=y
|
CONFIG_NO_HZ_COMMON=y
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_NVMEM=y
|
CONFIG_NVMEM=y
|
||||||
|
# CONFIG_NVMEM_MICROCHIP_OTPC is not set
|
||||||
CONFIG_NVMEM_SYSFS=y
|
CONFIG_NVMEM_SYSFS=y
|
||||||
CONFIG_OF=y
|
CONFIG_OF=y
|
||||||
CONFIG_OF_ADDRESS=y
|
CONFIG_OF_ADDRESS=y
|
||||||
|
@ -265,6 +265,7 @@ CONFIG_NLS_UTF8=y
|
|||||||
CONFIG_NO_HZ_COMMON=y
|
CONFIG_NO_HZ_COMMON=y
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
CONFIG_NVMEM=y
|
CONFIG_NVMEM=y
|
||||||
|
# CONFIG_NVMEM_MICROCHIP_OTPC is not set
|
||||||
CONFIG_NVMEM_SYSFS=y
|
CONFIG_NVMEM_SYSFS=y
|
||||||
CONFIG_OF=y
|
CONFIG_OF=y
|
||||||
CONFIG_OF_ADDRESS=y
|
CONFIG_OF_ADDRESS=y
|
||||||
|
@ -0,0 +1,456 @@
|
|||||||
|
From 7ae6478b304bc004c3139b422665b0e23b57f05c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Wed, 13 Oct 2021 14:19:55 +0100
|
||||||
|
Subject: [PATCH] nvmem: core: rework nvmem cell instance creation
|
||||||
|
|
||||||
|
In the existing design, we do not create a instance per nvmem cell consumer
|
||||||
|
but we directly refer cell from nvmem cell list that are added to provider.
|
||||||
|
|
||||||
|
However this design has some limitations when consumers want to assign name
|
||||||
|
or connection id the nvmem cell instance, ex: via "nvmem-cell-names" or
|
||||||
|
id in nvmem_cell_get(id).
|
||||||
|
|
||||||
|
Having a name associated with nvmem cell consumer instance will help
|
||||||
|
provider drivers in performing post processing of nvmem cell data if required
|
||||||
|
before data is seen by the consumers. This is pretty normal with some vendors
|
||||||
|
storing nvmem cells like mac-address in a vendor specific data layouts that
|
||||||
|
are not directly usable by the consumer drivers.
|
||||||
|
|
||||||
|
With this patch nvmem cell will be created dynamically during nvmem_cell_get
|
||||||
|
and destroyed in nvmem_cell_put, allowing consumers to associate name with
|
||||||
|
nvmem cell consumer instance.
|
||||||
|
|
||||||
|
With this patch a new struct nvmem_cell_entry replaces struct nvmem_cell
|
||||||
|
for storing nvmem cell information within the core.
|
||||||
|
This patch does not change nvmem-consumer interface based on nvmem_cell.
|
||||||
|
|
||||||
|
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20211013131957.30271-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 165 +++++++++++++++++++++++++++----------------
|
||||||
|
1 file changed, 105 insertions(+), 60 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -45,8 +45,7 @@ struct nvmem_device {
|
||||||
|
#define to_nvmem_device(d) container_of(d, struct nvmem_device, dev)
|
||||||
|
|
||||||
|
#define FLAG_COMPAT BIT(0)
|
||||||
|
-
|
||||||
|
-struct nvmem_cell {
|
||||||
|
+struct nvmem_cell_entry {
|
||||||
|
const char *name;
|
||||||
|
int offset;
|
||||||
|
int bytes;
|
||||||
|
@@ -57,6 +56,11 @@ struct nvmem_cell {
|
||||||
|
struct list_head node;
|
||||||
|
};
|
||||||
|
|
||||||
|
+struct nvmem_cell {
|
||||||
|
+ struct nvmem_cell_entry *entry;
|
||||||
|
+ const char *id;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static DEFINE_MUTEX(nvmem_mutex);
|
||||||
|
static DEFINE_IDA(nvmem_ida);
|
||||||
|
|
||||||
|
@@ -424,7 +428,7 @@ static struct bus_type nvmem_bus_type =
|
||||||
|
.name = "nvmem",
|
||||||
|
};
|
||||||
|
|
||||||
|
-static void nvmem_cell_drop(struct nvmem_cell *cell)
|
||||||
|
+static void nvmem_cell_entry_drop(struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell);
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
@@ -437,13 +441,13 @@ static void nvmem_cell_drop(struct nvmem
|
||||||
|
|
||||||
|
static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell *cell, *p;
|
||||||
|
+ struct nvmem_cell_entry *cell, *p;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(cell, p, &nvmem->cells, node)
|
||||||
|
- nvmem_cell_drop(cell);
|
||||||
|
+ nvmem_cell_entry_drop(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void nvmem_cell_add(struct nvmem_cell *cell)
|
||||||
|
+static void nvmem_cell_entry_add(struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
list_add_tail(&cell->node, &cell->nvmem->cells);
|
||||||
|
@@ -451,9 +455,9 @@ static void nvmem_cell_add(struct nvmem_
|
||||||
|
blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int nvmem_cell_info_to_nvmem_cell_nodup(struct nvmem_device *nvmem,
|
||||||
|
- const struct nvmem_cell_info *info,
|
||||||
|
- struct nvmem_cell *cell)
|
||||||
|
+static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem,
|
||||||
|
+ const struct nvmem_cell_info *info,
|
||||||
|
+ struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
cell->nvmem = nvmem;
|
||||||
|
cell->offset = info->offset;
|
||||||
|
@@ -477,13 +481,13 @@ static int nvmem_cell_info_to_nvmem_cell
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem,
|
||||||
|
- const struct nvmem_cell_info *info,
|
||||||
|
- struct nvmem_cell *cell)
|
||||||
|
+static int nvmem_cell_info_to_nvmem_cell_entry(struct nvmem_device *nvmem,
|
||||||
|
+ const struct nvmem_cell_info *info,
|
||||||
|
+ struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
- err = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, cell);
|
||||||
|
+ err = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, cell);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
@@ -507,7 +511,7 @@ static int nvmem_add_cells(struct nvmem_
|
||||||
|
const struct nvmem_cell_info *info,
|
||||||
|
int ncells)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell **cells;
|
||||||
|
+ struct nvmem_cell_entry **cells;
|
||||||
|
int i, rval;
|
||||||
|
|
||||||
|
cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL);
|
||||||
|
@@ -521,13 +525,13 @@ static int nvmem_add_cells(struct nvmem_
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]);
|
||||||
|
+ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, &info[i], cells[i]);
|
||||||
|
if (rval) {
|
||||||
|
kfree(cells[i]);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nvmem_cell_add(cells[i]);
|
||||||
|
+ nvmem_cell_entry_add(cells[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove tmp array */
|
||||||
|
@@ -536,7 +540,7 @@ static int nvmem_add_cells(struct nvmem_
|
||||||
|
return 0;
|
||||||
|
err:
|
||||||
|
while (i--)
|
||||||
|
- nvmem_cell_drop(cells[i]);
|
||||||
|
+ nvmem_cell_entry_drop(cells[i]);
|
||||||
|
|
||||||
|
kfree(cells);
|
||||||
|
|
||||||
|
@@ -573,7 +577,7 @@ static int nvmem_add_cells_from_table(st
|
||||||
|
{
|
||||||
|
const struct nvmem_cell_info *info;
|
||||||
|
struct nvmem_cell_table *table;
|
||||||
|
- struct nvmem_cell *cell;
|
||||||
|
+ struct nvmem_cell_entry *cell;
|
||||||
|
int rval = 0, i;
|
||||||
|
|
||||||
|
mutex_lock(&nvmem_cell_mutex);
|
||||||
|
@@ -588,15 +592,13 @@ static int nvmem_add_cells_from_table(st
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- rval = nvmem_cell_info_to_nvmem_cell(nvmem,
|
||||||
|
- info,
|
||||||
|
- cell);
|
||||||
|
+ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, info, cell);
|
||||||
|
if (rval) {
|
||||||
|
kfree(cell);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nvmem_cell_add(cell);
|
||||||
|
+ nvmem_cell_entry_add(cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -606,10 +608,10 @@ out:
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static struct nvmem_cell *
|
||||||
|
-nvmem_find_cell_by_name(struct nvmem_device *nvmem, const char *cell_id)
|
||||||
|
+static struct nvmem_cell_entry *
|
||||||
|
+nvmem_find_cell_entry_by_name(struct nvmem_device *nvmem, const char *cell_id)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell *iter, *cell = NULL;
|
||||||
|
+ struct nvmem_cell_entry *iter, *cell = NULL;
|
||||||
|
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
list_for_each_entry(iter, &nvmem->cells, node) {
|
||||||
|
@@ -680,7 +682,7 @@ static int nvmem_add_cells_from_of(struc
|
||||||
|
{
|
||||||
|
struct device_node *parent, *child;
|
||||||
|
struct device *dev = &nvmem->dev;
|
||||||
|
- struct nvmem_cell *cell;
|
||||||
|
+ struct nvmem_cell_entry *cell;
|
||||||
|
const __be32 *addr;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
@@ -729,7 +731,7 @@ static int nvmem_add_cells_from_of(struc
|
||||||
|
}
|
||||||
|
|
||||||
|
cell->np = of_node_get(child);
|
||||||
|
- nvmem_cell_add(cell);
|
||||||
|
+ nvmem_cell_entry_add(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -1144,9 +1146,33 @@ struct nvmem_device *devm_nvmem_device_g
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
|
||||||
|
|
||||||
|
+static struct nvmem_cell *nvmem_create_cell(struct nvmem_cell_entry *entry, const char *id)
|
||||||
|
+{
|
||||||
|
+ struct nvmem_cell *cell;
|
||||||
|
+ const char *name = NULL;
|
||||||
|
+
|
||||||
|
+ cell = kzalloc(sizeof(*cell), GFP_KERNEL);
|
||||||
|
+ if (!cell)
|
||||||
|
+ return ERR_PTR(-ENOMEM);
|
||||||
|
+
|
||||||
|
+ if (id) {
|
||||||
|
+ name = kstrdup_const(id, GFP_KERNEL);
|
||||||
|
+ if (!name) {
|
||||||
|
+ kfree(cell);
|
||||||
|
+ return ERR_PTR(-ENOMEM);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ cell->id = name;
|
||||||
|
+ cell->entry = entry;
|
||||||
|
+
|
||||||
|
+ return cell;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static struct nvmem_cell *
|
||||||
|
nvmem_cell_get_from_lookup(struct device *dev, const char *con_id)
|
||||||
|
{
|
||||||
|
+ struct nvmem_cell_entry *cell_entry;
|
||||||
|
struct nvmem_cell *cell = ERR_PTR(-ENOENT);
|
||||||
|
struct nvmem_cell_lookup *lookup;
|
||||||
|
struct nvmem_device *nvmem;
|
||||||
|
@@ -1171,11 +1197,15 @@ nvmem_cell_get_from_lookup(struct device
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- cell = nvmem_find_cell_by_name(nvmem,
|
||||||
|
- lookup->cell_name);
|
||||||
|
- if (!cell) {
|
||||||
|
+ cell_entry = nvmem_find_cell_entry_by_name(nvmem,
|
||||||
|
+ lookup->cell_name);
|
||||||
|
+ if (!cell_entry) {
|
||||||
|
__nvmem_device_put(nvmem);
|
||||||
|
cell = ERR_PTR(-ENOENT);
|
||||||
|
+ } else {
|
||||||
|
+ cell = nvmem_create_cell(cell_entry, con_id);
|
||||||
|
+ if (IS_ERR(cell))
|
||||||
|
+ __nvmem_device_put(nvmem);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -1186,10 +1216,10 @@ nvmem_cell_get_from_lookup(struct device
|
||||||
|
}
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_OF)
|
||||||
|
-static struct nvmem_cell *
|
||||||
|
-nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np)
|
||||||
|
+static struct nvmem_cell_entry *
|
||||||
|
+nvmem_find_cell_entry_by_node(struct nvmem_device *nvmem, struct device_node *np)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell *iter, *cell = NULL;
|
||||||
|
+ struct nvmem_cell_entry *iter, *cell = NULL;
|
||||||
|
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
list_for_each_entry(iter, &nvmem->cells, node) {
|
||||||
|
@@ -1219,6 +1249,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
|
||||||
|
{
|
||||||
|
struct device_node *cell_np, *nvmem_np;
|
||||||
|
struct nvmem_device *nvmem;
|
||||||
|
+ struct nvmem_cell_entry *cell_entry;
|
||||||
|
struct nvmem_cell *cell;
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
@@ -1239,12 +1270,16 @@ struct nvmem_cell *of_nvmem_cell_get(str
|
||||||
|
if (IS_ERR(nvmem))
|
||||||
|
return ERR_CAST(nvmem);
|
||||||
|
|
||||||
|
- cell = nvmem_find_cell_by_node(nvmem, cell_np);
|
||||||
|
- if (!cell) {
|
||||||
|
+ cell_entry = nvmem_find_cell_entry_by_node(nvmem, cell_np);
|
||||||
|
+ if (!cell_entry) {
|
||||||
|
__nvmem_device_put(nvmem);
|
||||||
|
return ERR_PTR(-ENOENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ cell = nvmem_create_cell(cell_entry, id);
|
||||||
|
+ if (IS_ERR(cell))
|
||||||
|
+ __nvmem_device_put(nvmem);
|
||||||
|
+
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(of_nvmem_cell_get);
|
||||||
|
@@ -1350,13 +1385,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put);
|
||||||
|
*/
|
||||||
|
void nvmem_cell_put(struct nvmem_cell *cell)
|
||||||
|
{
|
||||||
|
- struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
+ struct nvmem_device *nvmem = cell->entry->nvmem;
|
||||||
|
+
|
||||||
|
+ if (cell->id)
|
||||||
|
+ kfree_const(cell->id);
|
||||||
|
|
||||||
|
+ kfree(cell);
|
||||||
|
__nvmem_device_put(nvmem);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_cell_put);
|
||||||
|
|
||||||
|
-static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
|
||||||
|
+static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void *buf)
|
||||||
|
{
|
||||||
|
u8 *p, *b;
|
||||||
|
int i, extra, bit_offset = cell->bit_offset;
|
||||||
|
@@ -1390,8 +1429,8 @@ static void nvmem_shift_read_buffer_in_p
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __nvmem_cell_read(struct nvmem_device *nvmem,
|
||||||
|
- struct nvmem_cell *cell,
|
||||||
|
- void *buf, size_t *len)
|
||||||
|
+ struct nvmem_cell_entry *cell,
|
||||||
|
+ void *buf, size_t *len, const char *id)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
@@ -1422,18 +1461,18 @@ static int __nvmem_cell_read(struct nvme
|
||||||
|
*/
|
||||||
|
void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
|
||||||
|
{
|
||||||
|
- struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
+ struct nvmem_device *nvmem = cell->entry->nvmem;
|
||||||
|
u8 *buf;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (!nvmem)
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
- buf = kzalloc(cell->bytes, GFP_KERNEL);
|
||||||
|
+ buf = kzalloc(cell->entry->bytes, GFP_KERNEL);
|
||||||
|
if (!buf)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
- rc = __nvmem_cell_read(nvmem, cell, buf, len);
|
||||||
|
+ rc = __nvmem_cell_read(nvmem, cell->entry, buf, len, cell->id);
|
||||||
|
if (rc) {
|
||||||
|
kfree(buf);
|
||||||
|
return ERR_PTR(rc);
|
||||||
|
@@ -1443,7 +1482,7 @@ void *nvmem_cell_read(struct nvmem_cell
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_cell_read);
|
||||||
|
|
||||||
|
-static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,
|
||||||
|
+static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell_entry *cell,
|
||||||
|
u8 *_buf, int len)
|
||||||
|
{
|
||||||
|
struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
@@ -1496,16 +1535,7 @@ err:
|
||||||
|
return ERR_PTR(rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/**
|
||||||
|
- * nvmem_cell_write() - Write to a given nvmem cell
|
||||||
|
- *
|
||||||
|
- * @cell: nvmem cell to be written.
|
||||||
|
- * @buf: Buffer to be written.
|
||||||
|
- * @len: length of buffer to be written to nvmem cell.
|
||||||
|
- *
|
||||||
|
- * Return: length of bytes written or negative on failure.
|
||||||
|
- */
|
||||||
|
-int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
|
||||||
|
+static int __nvmem_cell_entry_write(struct nvmem_cell_entry *cell, void *buf, size_t len)
|
||||||
|
{
|
||||||
|
struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
int rc;
|
||||||
|
@@ -1531,6 +1561,21 @@ int nvmem_cell_write(struct nvmem_cell *
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * nvmem_cell_write() - Write to a given nvmem cell
|
||||||
|
+ *
|
||||||
|
+ * @cell: nvmem cell to be written.
|
||||||
|
+ * @buf: Buffer to be written.
|
||||||
|
+ * @len: length of buffer to be written to nvmem cell.
|
||||||
|
+ *
|
||||||
|
+ * Return: length of bytes written or negative on failure.
|
||||||
|
+ */
|
||||||
|
+int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
|
||||||
|
+{
|
||||||
|
+ return __nvmem_cell_entry_write(cell->entry, buf, len);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_cell_write);
|
||||||
|
|
||||||
|
static int nvmem_cell_read_common(struct device *dev, const char *cell_id,
|
||||||
|
@@ -1633,7 +1678,7 @@ static const void *nvmem_cell_read_varia
|
||||||
|
if (IS_ERR(cell))
|
||||||
|
return cell;
|
||||||
|
|
||||||
|
- nbits = cell->nbits;
|
||||||
|
+ nbits = cell->entry->nbits;
|
||||||
|
buf = nvmem_cell_read(cell, len);
|
||||||
|
nvmem_cell_put(cell);
|
||||||
|
if (IS_ERR(buf))
|
||||||
|
@@ -1729,18 +1774,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab
|
||||||
|
ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
|
||||||
|
struct nvmem_cell_info *info, void *buf)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell cell;
|
||||||
|
+ struct nvmem_cell_entry cell;
|
||||||
|
int rc;
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
if (!nvmem)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell);
|
||||||
|
+ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
- rc = __nvmem_cell_read(nvmem, &cell, buf, &len);
|
||||||
|
+ rc = __nvmem_cell_read(nvmem, &cell, buf, &len, NULL);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
@@ -1760,17 +1805,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read
|
||||||
|
int nvmem_device_cell_write(struct nvmem_device *nvmem,
|
||||||
|
struct nvmem_cell_info *info, void *buf)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell cell;
|
||||||
|
+ struct nvmem_cell_entry cell;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (!nvmem)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell);
|
||||||
|
+ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
- return nvmem_cell_write(&cell, buf, cell.bytes);
|
||||||
|
+ return __nvmem_cell_entry_write(&cell, buf, cell.bytes);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_device_cell_write);
|
||||||
|
|
@ -0,0 +1,82 @@
|
|||||||
|
From 5008062f1c3f5af3acf86164aa6fcc77b0c7bdce Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Wed, 13 Oct 2021 14:19:56 +0100
|
||||||
|
Subject: [PATCH] nvmem: core: add nvmem cell post processing callback
|
||||||
|
|
||||||
|
Some NVMEM providers have certain nvmem cells encoded, which requires
|
||||||
|
post processing before actually using it.
|
||||||
|
|
||||||
|
For example mac-address is stored in either in ascii or delimited or reverse-order.
|
||||||
|
|
||||||
|
Having a post-process callback hook to provider drivers would enable them to
|
||||||
|
do this vendor specific post processing before nvmem consumers see it.
|
||||||
|
|
||||||
|
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20211013131957.30271-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 9 +++++++++
|
||||||
|
include/linux/nvmem-provider.h | 5 +++++
|
||||||
|
2 files changed, 14 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -38,6 +38,7 @@ struct nvmem_device {
|
||||||
|
unsigned int nkeepout;
|
||||||
|
nvmem_reg_read_t reg_read;
|
||||||
|
nvmem_reg_write_t reg_write;
|
||||||
|
+ nvmem_cell_post_process_t cell_post_process;
|
||||||
|
struct gpio_desc *wp_gpio;
|
||||||
|
void *priv;
|
||||||
|
};
|
||||||
|
@@ -798,6 +799,7 @@ struct nvmem_device *nvmem_register(cons
|
||||||
|
nvmem->type = config->type;
|
||||||
|
nvmem->reg_read = config->reg_read;
|
||||||
|
nvmem->reg_write = config->reg_write;
|
||||||
|
+ nvmem->cell_post_process = config->cell_post_process;
|
||||||
|
nvmem->keepout = config->keepout;
|
||||||
|
nvmem->nkeepout = config->nkeepout;
|
||||||
|
if (config->of_node)
|
||||||
|
@@ -1443,6 +1445,13 @@ static int __nvmem_cell_read(struct nvme
|
||||||
|
if (cell->bit_offset || cell->nbits)
|
||||||
|
nvmem_shift_read_buffer_in_place(cell, buf);
|
||||||
|
|
||||||
|
+ if (nvmem->cell_post_process) {
|
||||||
|
+ rc = nvmem->cell_post_process(nvmem->priv, id,
|
||||||
|
+ cell->offset, buf, cell->bytes);
|
||||||
|
+ if (rc)
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (len)
|
||||||
|
*len = cell->bytes;
|
||||||
|
|
||||||
|
--- a/include/linux/nvmem-provider.h
|
||||||
|
+++ b/include/linux/nvmem-provider.h
|
||||||
|
@@ -19,6 +19,9 @@ typedef int (*nvmem_reg_read_t)(void *pr
|
||||||
|
void *val, size_t bytes);
|
||||||
|
typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset,
|
||||||
|
void *val, size_t bytes);
|
||||||
|
+/* used for vendor specific post processing of cell data */
|
||||||
|
+typedef int (*nvmem_cell_post_process_t)(void *priv, const char *id, unsigned int offset,
|
||||||
|
+ void *buf, size_t bytes);
|
||||||
|
|
||||||
|
enum nvmem_type {
|
||||||
|
NVMEM_TYPE_UNKNOWN = 0,
|
||||||
|
@@ -62,6 +65,7 @@ struct nvmem_keepout {
|
||||||
|
* @no_of_node: Device should not use the parent's of_node even if it's !NULL.
|
||||||
|
* @reg_read: Callback to read data.
|
||||||
|
* @reg_write: Callback to write data.
|
||||||
|
+ * @cell_post_process: Callback for vendor specific post processing of cell data
|
||||||
|
* @size: Device size.
|
||||||
|
* @word_size: Minimum read/write access granularity.
|
||||||
|
* @stride: Minimum read/write access stride.
|
||||||
|
@@ -92,6 +96,7 @@ struct nvmem_config {
|
||||||
|
bool no_of_node;
|
||||||
|
nvmem_reg_read_t reg_read;
|
||||||
|
nvmem_reg_write_t reg_write;
|
||||||
|
+ nvmem_cell_post_process_t cell_post_process;
|
||||||
|
int size;
|
||||||
|
int word_size;
|
||||||
|
int stride;
|
@ -0,0 +1,92 @@
|
|||||||
|
From d0221a780cbc99fec6c27a98dba2828dc5735c00 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Wed, 13 Oct 2021 14:19:57 +0100
|
||||||
|
Subject: [PATCH] nvmem: imx-ocotp: add support for post processing
|
||||||
|
|
||||||
|
Add .cell_post_process callback for imx-ocotp to deal with MAC address,
|
||||||
|
since MAC address need to be reversed byte for some i.MX SoCs.
|
||||||
|
|
||||||
|
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20211013131957.30271-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/imx-ocotp.c | 25 +++++++++++++++++++++++++
|
||||||
|
1 file changed, 25 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/imx-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/imx-ocotp.c
|
||||||
|
@@ -97,6 +97,7 @@ struct ocotp_params {
|
||||||
|
unsigned int bank_address_words;
|
||||||
|
void (*set_timing)(struct ocotp_priv *priv);
|
||||||
|
struct ocotp_ctrl_reg ctrl;
|
||||||
|
+ bool reverse_mac_address;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int imx_ocotp_wait_for_busy(struct ocotp_priv *priv, u32 flags)
|
||||||
|
@@ -221,6 +222,25 @@ read_end:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int imx_ocotp_cell_pp(void *context, const char *id, unsigned int offset,
|
||||||
|
+ void *data, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct ocotp_priv *priv = context;
|
||||||
|
+
|
||||||
|
+ /* Deal with some post processing of nvmem cell data */
|
||||||
|
+ if (id && !strcmp(id, "mac-address")) {
|
||||||
|
+ if (priv->params->reverse_mac_address) {
|
||||||
|
+ u8 *buf = data;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < bytes/2; i++)
|
||||||
|
+ swap(buf[i], buf[bytes - i - 1]);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void imx_ocotp_set_imx6_timing(struct ocotp_priv *priv)
|
||||||
|
{
|
||||||
|
unsigned long clk_rate;
|
||||||
|
@@ -468,6 +488,7 @@ static struct nvmem_config imx_ocotp_nvm
|
||||||
|
.stride = 1,
|
||||||
|
.reg_read = imx_ocotp_read,
|
||||||
|
.reg_write = imx_ocotp_write,
|
||||||
|
+ .cell_post_process = imx_ocotp_cell_pp,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx6q_params = {
|
||||||
|
@@ -530,6 +551,7 @@ static const struct ocotp_params imx8mq_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx8mm_params = {
|
||||||
|
@@ -537,6 +559,7 @@ static const struct ocotp_params imx8mm_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx8mn_params = {
|
||||||
|
@@ -544,6 +567,7 @@ static const struct ocotp_params imx8mn_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx8mp_params = {
|
||||||
|
@@ -551,6 +575,7 @@ static const struct ocotp_params imx8mp_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_8MP,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id imx_ocotp_dt_ids[] = {
|
@ -0,0 +1,68 @@
|
|||||||
|
From f6c052afe6f802d87c74153b7a57c43b2e9faf07 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Christophe Kerello <christophe.kerello@foss.st.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:14:31 +0000
|
||||||
|
Subject: [PATCH] nvmem: core: Fix a conflict between MTD and NVMEM on wp-gpios
|
||||||
|
property
|
||||||
|
|
||||||
|
Wp-gpios property can be used on NVMEM nodes and the same property can
|
||||||
|
be also used on MTD NAND nodes. In case of the wp-gpios property is
|
||||||
|
defined at NAND level node, the GPIO management is done at NAND driver
|
||||||
|
level. Write protect is disabled when the driver is probed or resumed
|
||||||
|
and is enabled when the driver is released or suspended.
|
||||||
|
|
||||||
|
When no partitions are defined in the NAND DT node, then the NAND DT node
|
||||||
|
will be passed to NVMEM framework. If wp-gpios property is defined in
|
||||||
|
this node, the GPIO resource is taken twice and the NAND controller
|
||||||
|
driver fails to probe.
|
||||||
|
|
||||||
|
It would be possible to set config->wp_gpio at MTD level before calling
|
||||||
|
nvmem_register function but NVMEM framework will toggle this GPIO on
|
||||||
|
each write when this GPIO should only be controlled at NAND level driver
|
||||||
|
to ensure that the Write Protect has not been enabled.
|
||||||
|
|
||||||
|
A way to fix this conflict is to add a new boolean flag in nvmem_config
|
||||||
|
named ignore_wp. In case ignore_wp is set, the GPIO resource will
|
||||||
|
be managed by the provider.
|
||||||
|
|
||||||
|
Fixes: 2a127da461a9 ("nvmem: add support for the write-protect pin")
|
||||||
|
Cc: stable@vger.kernel.org
|
||||||
|
Signed-off-by: Christophe Kerello <christophe.kerello@foss.st.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151432.16605-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 2 +-
|
||||||
|
include/linux/nvmem-provider.h | 4 +++-
|
||||||
|
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -771,7 +771,7 @@ struct nvmem_device *nvmem_register(cons
|
||||||
|
|
||||||
|
if (config->wp_gpio)
|
||||||
|
nvmem->wp_gpio = config->wp_gpio;
|
||||||
|
- else
|
||||||
|
+ else if (!config->ignore_wp)
|
||||||
|
nvmem->wp_gpio = gpiod_get_optional(config->dev, "wp",
|
||||||
|
GPIOD_OUT_HIGH);
|
||||||
|
if (IS_ERR(nvmem->wp_gpio)) {
|
||||||
|
--- a/include/linux/nvmem-provider.h
|
||||||
|
+++ b/include/linux/nvmem-provider.h
|
||||||
|
@@ -70,7 +70,8 @@ struct nvmem_keepout {
|
||||||
|
* @word_size: Minimum read/write access granularity.
|
||||||
|
* @stride: Minimum read/write access stride.
|
||||||
|
* @priv: User context passed to read/write callbacks.
|
||||||
|
- * @wp-gpio: Write protect pin
|
||||||
|
+ * @wp-gpio: Write protect pin
|
||||||
|
+ * @ignore_wp: Write Protect pin is managed by the provider.
|
||||||
|
*
|
||||||
|
* Note: A default "nvmem<id>" name will be assigned to the device if
|
||||||
|
* no name is specified in its configuration. In such case "<id>" is
|
||||||
|
@@ -92,6 +93,7 @@ struct nvmem_config {
|
||||||
|
enum nvmem_type type;
|
||||||
|
bool read_only;
|
||||||
|
bool root_only;
|
||||||
|
+ bool ignore_wp;
|
||||||
|
struct device_node *of_node;
|
||||||
|
bool no_of_node;
|
||||||
|
nvmem_reg_read_t reg_read;
|
@ -0,0 +1,72 @@
|
|||||||
|
From 190fae468592bc2f0efc8b928920f8f712b5831e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:15 +0000
|
||||||
|
Subject: [PATCH] nvmem: core: Remove unused devm_nvmem_unregister()
|
||||||
|
|
||||||
|
There are no users and seems no will come of the devm_nvmem_unregister().
|
||||||
|
Remove the function and remove the unused devm_nvmem_match() along with it.
|
||||||
|
|
||||||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 22 ----------------------
|
||||||
|
include/linux/nvmem-provider.h | 8 --------
|
||||||
|
2 files changed, 30 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -945,28 +945,6 @@ struct nvmem_device *devm_nvmem_register
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_nvmem_register);
|
||||||
|
|
||||||
|
-static int devm_nvmem_match(struct device *dev, void *res, void *data)
|
||||||
|
-{
|
||||||
|
- struct nvmem_device **r = res;
|
||||||
|
-
|
||||||
|
- return *r == data;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
- * devm_nvmem_unregister() - Unregister previously registered managed nvmem
|
||||||
|
- * device.
|
||||||
|
- *
|
||||||
|
- * @dev: Device that uses the nvmem device.
|
||||||
|
- * @nvmem: Pointer to previously registered nvmem device.
|
||||||
|
- *
|
||||||
|
- * Return: Will be negative on error or zero on success.
|
||||||
|
- */
|
||||||
|
-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
|
||||||
|
-{
|
||||||
|
- return devres_release(dev, devm_nvmem_release, devm_nvmem_match, nvmem);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(devm_nvmem_unregister);
|
||||||
|
-
|
||||||
|
static struct nvmem_device *__nvmem_device_get(void *data,
|
||||||
|
int (*match)(struct device *dev, const void *data))
|
||||||
|
{
|
||||||
|
--- a/include/linux/nvmem-provider.h
|
||||||
|
+++ b/include/linux/nvmem-provider.h
|
||||||
|
@@ -135,8 +135,6 @@ void nvmem_unregister(struct nvmem_devic
|
||||||
|
struct nvmem_device *devm_nvmem_register(struct device *dev,
|
||||||
|
const struct nvmem_config *cfg);
|
||||||
|
|
||||||
|
-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem);
|
||||||
|
-
|
||||||
|
void nvmem_add_cell_table(struct nvmem_cell_table *table);
|
||||||
|
void nvmem_del_cell_table(struct nvmem_cell_table *table);
|
||||||
|
|
||||||
|
@@ -155,12 +153,6 @@ devm_nvmem_register(struct device *dev,
|
||||||
|
return nvmem_register(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static inline int
|
||||||
|
-devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
|
||||||
|
-{
|
||||||
|
- return -EOPNOTSUPP;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {}
|
||||||
|
static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {}
|
||||||
|
|
@ -0,0 +1,58 @@
|
|||||||
|
From 5825b2c6762611e67ccaf3ccf64485365a120f0b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:16 +0000
|
||||||
|
Subject: [PATCH] nvmem: core: Use devm_add_action_or_reset()
|
||||||
|
|
||||||
|
Slightly simplify the devm_nvmem_register() by using the
|
||||||
|
devm_add_action_or_reset().
|
||||||
|
|
||||||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 22 +++++++++-------------
|
||||||
|
1 file changed, 9 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -907,9 +907,9 @@ void nvmem_unregister(struct nvmem_devic
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_unregister);
|
||||||
|
|
||||||
|
-static void devm_nvmem_release(struct device *dev, void *res)
|
||||||
|
+static void devm_nvmem_unregister(void *nvmem)
|
||||||
|
{
|
||||||
|
- nvmem_unregister(*(struct nvmem_device **)res);
|
||||||
|
+ nvmem_unregister(nvmem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -926,20 +926,16 @@ static void devm_nvmem_release(struct de
|
||||||
|
struct nvmem_device *devm_nvmem_register(struct device *dev,
|
||||||
|
const struct nvmem_config *config)
|
||||||
|
{
|
||||||
|
- struct nvmem_device **ptr, *nvmem;
|
||||||
|
-
|
||||||
|
- ptr = devres_alloc(devm_nvmem_release, sizeof(*ptr), GFP_KERNEL);
|
||||||
|
- if (!ptr)
|
||||||
|
- return ERR_PTR(-ENOMEM);
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
nvmem = nvmem_register(config);
|
||||||
|
+ if (IS_ERR(nvmem))
|
||||||
|
+ return nvmem;
|
||||||
|
|
||||||
|
- if (!IS_ERR(nvmem)) {
|
||||||
|
- *ptr = nvmem;
|
||||||
|
- devres_add(dev, ptr);
|
||||||
|
- } else {
|
||||||
|
- devres_free(ptr);
|
||||||
|
- }
|
||||||
|
+ ret = devm_add_action_or_reset(dev, devm_nvmem_unregister, nvmem);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ERR_PTR(ret);
|
||||||
|
|
||||||
|
return nvmem;
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
From 8c751e0d9a5264376935a84429a2d468c8877d99 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:17 +0000
|
||||||
|
Subject: [PATCH] nvmem: core: Check input parameter for NULL in
|
||||||
|
nvmem_unregister()
|
||||||
|
|
||||||
|
nvmem_unregister() frees resources and standard pattern is to allow
|
||||||
|
caller to not care if it's NULL or not. This will reduce burden on
|
||||||
|
the callers to perform this check.
|
||||||
|
|
||||||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -903,7 +903,8 @@ static void nvmem_device_release(struct
|
||||||
|
*/
|
||||||
|
void nvmem_unregister(struct nvmem_device *nvmem)
|
||||||
|
{
|
||||||
|
- kref_put(&nvmem->refcnt, nvmem_device_release);
|
||||||
|
+ if (nvmem)
|
||||||
|
+ kref_put(&nvmem->refcnt, nvmem_device_release);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_unregister);
|
||||||
|
|
@ -0,0 +1,29 @@
|
|||||||
|
From 05196facc052385960028ac634447ecf6c764ec3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:18 +0000
|
||||||
|
Subject: [PATCH] nvmem: qfprom: fix kerneldoc warning
|
||||||
|
|
||||||
|
This patch fixes below kernel doc warning,
|
||||||
|
warning: expecting prototype for qfprom_efuse_reg_write().
|
||||||
|
Prototype was for qfprom_reg_write() instead
|
||||||
|
|
||||||
|
No code changes.
|
||||||
|
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-5-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/qfprom.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/qfprom.c
|
||||||
|
+++ b/drivers/nvmem/qfprom.c
|
||||||
|
@@ -244,7 +244,7 @@ err_clk_prepared:
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * qfprom_efuse_reg_write() - Write to fuses.
|
||||||
|
+ * qfprom_reg_write() - Write to fuses.
|
||||||
|
* @context: Our driver data.
|
||||||
|
* @reg: The offset to write at.
|
||||||
|
* @_val: Pointer to data to write.
|
@ -0,0 +1,38 @@
|
|||||||
|
From 07ae4fde9efada7878e1383d6ccc7da70315ca23 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:20 +0000
|
||||||
|
Subject: [PATCH] nvmem: sunxi_sid: Add support for D1 variant
|
||||||
|
|
||||||
|
D1 has a smaller eFuse block than some other recent SoCs, and it no
|
||||||
|
longer requires a workaround to read the eFuse data.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-7-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/sunxi_sid.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/sunxi_sid.c
|
||||||
|
+++ b/drivers/nvmem/sunxi_sid.c
|
||||||
|
@@ -184,6 +184,11 @@ static const struct sunxi_sid_cfg sun8i_
|
||||||
|
.need_register_readout = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct sunxi_sid_cfg sun20i_d1_cfg = {
|
||||||
|
+ .value_offset = 0x200,
|
||||||
|
+ .size = 0x100,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct sunxi_sid_cfg sun50i_a64_cfg = {
|
||||||
|
.value_offset = 0x200,
|
||||||
|
.size = 0x100,
|
||||||
|
@@ -200,6 +205,7 @@ static const struct of_device_id sunxi_s
|
||||||
|
{ .compatible = "allwinner,sun7i-a20-sid", .data = &sun7i_a20_cfg },
|
||||||
|
{ .compatible = "allwinner,sun8i-a83t-sid", .data = &sun50i_a64_cfg },
|
||||||
|
{ .compatible = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_cfg },
|
||||||
|
+ { .compatible = "allwinner,sun20i-d1-sid", .data = &sun20i_d1_cfg },
|
||||||
|
{ .compatible = "allwinner,sun50i-a64-sid", .data = &sun50i_a64_cfg },
|
||||||
|
{ .compatible = "allwinner,sun50i-h5-sid", .data = &sun50i_a64_cfg },
|
||||||
|
{ .compatible = "allwinner,sun50i-h6-sid", .data = &sun50i_h6_cfg },
|
@ -0,0 +1,28 @@
|
|||||||
|
From 4dc8d89faed9bb05f116fa1794fc955b14910386 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiaoke Wang <xkernel.wang@foxmail.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:21 +0000
|
||||||
|
Subject: [PATCH] nvmem: meson-mx-efuse: replace unnecessary devm_kstrdup()
|
||||||
|
|
||||||
|
Replace unnecessary devm_kstrdup() so to avoid redundant memory allocation.
|
||||||
|
|
||||||
|
Suggested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||||
|
Signed-off-by: Xiaoke Wang <xkernel.wang@foxmail.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/meson-mx-efuse.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/meson-mx-efuse.c
|
||||||
|
+++ b/drivers/nvmem/meson-mx-efuse.c
|
||||||
|
@@ -209,8 +209,7 @@ static int meson_mx_efuse_probe(struct p
|
||||||
|
if (IS_ERR(efuse->base))
|
||||||
|
return PTR_ERR(efuse->base);
|
||||||
|
|
||||||
|
- efuse->config.name = devm_kstrdup(&pdev->dev, drvdata->name,
|
||||||
|
- GFP_KERNEL);
|
||||||
|
+ efuse->config.name = drvdata->name;
|
||||||
|
efuse->config.owner = THIS_MODULE;
|
||||||
|
efuse->config.dev = &pdev->dev;
|
||||||
|
efuse->config.priv = efuse;
|
@ -0,0 +1,139 @@
|
|||||||
|
From f78451012b9e159afdba31c3eb69f223a9f42adc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Walle <michael@walle.cc>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:23 +0000
|
||||||
|
Subject: [PATCH] nvmem: add driver for Layerscape SFP (Security Fuse
|
||||||
|
Processor)
|
||||||
|
|
||||||
|
Add support for the Security Fuse Processor found on Layerscape SoCs.
|
||||||
|
This driver implements basic read access.
|
||||||
|
|
||||||
|
Signed-off-by: Michael Walle <michael@walle.cc>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-10-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 12 +++++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/layerscape-sfp.c | 89 ++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 103 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/layerscape-sfp.c
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -300,4 +300,16 @@ config NVMEM_BRCM_NVRAM
|
||||||
|
This driver provides support for Broadcom's NVRAM that can be accessed
|
||||||
|
using I/O mapping.
|
||||||
|
|
||||||
|
+config NVMEM_LAYERSCAPE_SFP
|
||||||
|
+ tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
+ depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver provides support to read the eFuses on Freescale
|
||||||
|
+ Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
+ unique ID there.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called layerscape-sfp.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -61,3 +61,5 @@ obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.
|
||||||
|
nvmem-rmem-y := rmem.o
|
||||||
|
obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||||
|
nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
+nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||||
|
@@ -0,0 +1,89 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
+/*
|
||||||
|
+ * Layerscape SFP driver
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2022 Michael Walle <michael@walle.cc>
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/device.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/mod_devicetable.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+#include <linux/property.h>
|
||||||
|
+
|
||||||
|
+#define LAYERSCAPE_SFP_OTP_OFFSET 0x0200
|
||||||
|
+
|
||||||
|
+struct layerscape_sfp_priv {
|
||||||
|
+ void __iomem *base;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct layerscape_sfp_data {
|
||||||
|
+ int size;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int layerscape_sfp_read(void *context, unsigned int offset, void *val,
|
||||||
|
+ size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct layerscape_sfp_priv *priv = context;
|
||||||
|
+
|
||||||
|
+ memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset,
|
||||||
|
+ bytes);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config layerscape_sfp_nvmem_config = {
|
||||||
|
+ .name = "fsl-sfp",
|
||||||
|
+ .reg_read = layerscape_sfp_read,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int layerscape_sfp_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ const struct layerscape_sfp_data *data;
|
||||||
|
+ struct layerscape_sfp_priv *priv;
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+
|
||||||
|
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
+ if (!priv)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(priv->base))
|
||||||
|
+ return PTR_ERR(priv->base);
|
||||||
|
+
|
||||||
|
+ data = device_get_match_data(&pdev->dev);
|
||||||
|
+
|
||||||
|
+ layerscape_sfp_nvmem_config.size = data->size;
|
||||||
|
+ layerscape_sfp_nvmem_config.dev = &pdev->dev;
|
||||||
|
+ layerscape_sfp_nvmem_config.priv = priv;
|
||||||
|
+
|
||||||
|
+ nvmem = devm_nvmem_register(&pdev->dev, &layerscape_sfp_nvmem_config);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct layerscape_sfp_data ls1028a_data = {
|
||||||
|
+ .size = 0x88,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
||||||
|
+ { .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data },
|
||||||
|
+ {},
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, layerscape_sfp_dt_ids);
|
||||||
|
+
|
||||||
|
+static struct platform_driver layerscape_sfp_driver = {
|
||||||
|
+ .probe = layerscape_sfp_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "layerscape_sfp",
|
||||||
|
+ .of_match_table = layerscape_sfp_dt_ids,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_platform_driver(layerscape_sfp_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Michael Walle <michael@walle.cc>");
|
||||||
|
+MODULE_DESCRIPTION("Layerscape Security Fuse Processor driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -0,0 +1,32 @@
|
|||||||
|
From bc5c75e0a5a9400f81a987cc720100ac475fa4d8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Knox Chiou <knoxchiou@chromium.org>
|
||||||
|
Date: Wed, 23 Feb 2022 22:35:00 +0000
|
||||||
|
Subject: [PATCH] nvmem: qfprom: Increase fuse blow timeout to prevent write
|
||||||
|
fail
|
||||||
|
|
||||||
|
sc7180 blow fuses got slightly chances to hit qfprom_reg_write timeout.
|
||||||
|
Current timeout is simply too low. Since blowing fuses is a
|
||||||
|
very rare operation, so the risk associated with overestimating this
|
||||||
|
number is low.
|
||||||
|
Increase fuse blow timeout from 1ms to 10ms.
|
||||||
|
|
||||||
|
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||||
|
Signed-off-by: Knox Chiou <knoxchiou@chromium.org>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220223223502.29454-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/qfprom.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/qfprom.c
|
||||||
|
+++ b/drivers/nvmem/qfprom.c
|
||||||
|
@@ -22,7 +22,7 @@
|
||||||
|
|
||||||
|
/* Amount of time required to hold charge to blow fuse in micro-seconds */
|
||||||
|
#define QFPROM_FUSE_BLOW_POLL_US 100
|
||||||
|
-#define QFPROM_FUSE_BLOW_TIMEOUT_US 1000
|
||||||
|
+#define QFPROM_FUSE_BLOW_TIMEOUT_US 10000
|
||||||
|
|
||||||
|
#define QFPROM_BLOW_STATUS_OFFSET 0x048
|
||||||
|
#define QFPROM_BLOW_STATUS_BUSY 0x1
|
@ -0,0 +1,277 @@
|
|||||||
|
From 8747ec2e9762ed9ae53b3a590938f454b6a1abdf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vincent Shih <vincent.sunplus@gmail.com>
|
||||||
|
Date: Wed, 23 Feb 2022 22:35:01 +0000
|
||||||
|
Subject: [PATCH] nvmem: Add driver for OCOTP in Sunplus SP7021
|
||||||
|
|
||||||
|
Add driver for OCOTP in Sunplus SP7021
|
||||||
|
|
||||||
|
Signed-off-by: Vincent Shih <vincent.sunplus@gmail.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220223223502.29454-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
MAINTAINERS | 5 +
|
||||||
|
drivers/nvmem/Kconfig | 12 ++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/sunplus-ocotp.c | 228 ++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 247 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/sunplus-ocotp.c
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -312,4 +312,16 @@ config NVMEM_LAYERSCAPE_SFP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called layerscape-sfp.
|
||||||
|
|
||||||
|
+config NVMEM_SUNPLUS_OCOTP
|
||||||
|
+ tristate "Sunplus SoC OTP support"
|
||||||
|
+ depends on SOC_SP7021 || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This is a driver for the On-chip OTP controller (OCOTP) available
|
||||||
|
+ on Sunplus SoCs. It provides access to 128 bytes of one-time
|
||||||
|
+ programmable eFuse.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-sunplus-ocotp.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -63,3 +63,5 @@ obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_
|
||||||
|
nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||||
|
+nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
@@ -0,0 +1,228 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * The OCOTP driver for Sunplus SP7021
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2019 Sunplus Technology Inc., All rights reserved.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/delay.h>
|
||||||
|
+#include <linux/device.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/iopoll.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/of_device.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * OTP memory
|
||||||
|
+ * Each bank contains 4 words (32 bits).
|
||||||
|
+ * Bank 0 starts at offset 0 from the base.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#define OTP_WORDS_PER_BANK 4
|
||||||
|
+#define OTP_WORD_SIZE sizeof(u32)
|
||||||
|
+#define OTP_BIT_ADDR_OF_BANK (8 * OTP_WORD_SIZE * OTP_WORDS_PER_BANK)
|
||||||
|
+#define QAC628_OTP_NUM_BANKS 8
|
||||||
|
+#define QAC628_OTP_SIZE (QAC628_OTP_NUM_BANKS * OTP_WORDS_PER_BANK * OTP_WORD_SIZE)
|
||||||
|
+#define OTP_READ_TIMEOUT_US 200000
|
||||||
|
+
|
||||||
|
+/* HB_GPIO */
|
||||||
|
+#define ADDRESS_8_DATA 0x20
|
||||||
|
+
|
||||||
|
+/* OTP_RX */
|
||||||
|
+#define OTP_CONTROL_2 0x48
|
||||||
|
+#define OTP_RD_PERIOD GENMASK(15, 8)
|
||||||
|
+#define OTP_RD_PERIOD_MASK ~GENMASK(15, 8)
|
||||||
|
+#define CPU_CLOCK FIELD_PREP(OTP_RD_PERIOD, 30)
|
||||||
|
+#define SEL_BAK_KEY2 BIT(5)
|
||||||
|
+#define SEL_BAK_KEY2_MASK ~BIT(5)
|
||||||
|
+#define SW_TRIM_EN BIT(4)
|
||||||
|
+#define SW_TRIM_EN_MASK ~BIT(4)
|
||||||
|
+#define SEL_BAK_KEY BIT(3)
|
||||||
|
+#define SEL_BAK_KEY_MASK ~BIT(3)
|
||||||
|
+#define OTP_READ BIT(2)
|
||||||
|
+#define OTP_LOAD_SECURE_DATA BIT(1)
|
||||||
|
+#define OTP_LOAD_SECURE_DATA_MASK ~BIT(1)
|
||||||
|
+#define OTP_DO_CRC BIT(0)
|
||||||
|
+#define OTP_DO_CRC_MASK ~BIT(0)
|
||||||
|
+#define OTP_STATUS 0x4c
|
||||||
|
+#define OTP_READ_DONE BIT(4)
|
||||||
|
+#define OTP_READ_DONE_MASK ~BIT(4)
|
||||||
|
+#define OTP_LOAD_SECURE_DONE_MASK ~BIT(2)
|
||||||
|
+#define OTP_READ_ADDRESS 0x50
|
||||||
|
+
|
||||||
|
+enum base_type {
|
||||||
|
+ HB_GPIO,
|
||||||
|
+ OTPRX,
|
||||||
|
+ BASEMAX,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct sp_ocotp_priv {
|
||||||
|
+ struct device *dev;
|
||||||
|
+ void __iomem *base[BASEMAX];
|
||||||
|
+ struct clk *clk;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct sp_ocotp_data {
|
||||||
|
+ int size;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+const struct sp_ocotp_data sp_otp_v0 = {
|
||||||
|
+ .size = QAC628_OTP_SIZE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int sp_otp_read_real(struct sp_ocotp_priv *otp, int addr, char *value)
|
||||||
|
+{
|
||||||
|
+ unsigned int addr_data;
|
||||||
|
+ unsigned int byte_shift;
|
||||||
|
+ unsigned int status;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ addr_data = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||||
|
+ addr_data = addr_data / OTP_WORD_SIZE;
|
||||||
|
+
|
||||||
|
+ byte_shift = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||||
|
+ byte_shift = byte_shift % OTP_WORD_SIZE;
|
||||||
|
+
|
||||||
|
+ addr = addr / (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||||
|
+ addr = addr * OTP_BIT_ADDR_OF_BANK;
|
||||||
|
+
|
||||||
|
+ writel(readl(otp->base[OTPRX] + OTP_STATUS) & OTP_READ_DONE_MASK &
|
||||||
|
+ OTP_LOAD_SECURE_DONE_MASK, otp->base[OTPRX] + OTP_STATUS);
|
||||||
|
+ writel(addr, otp->base[OTPRX] + OTP_READ_ADDRESS);
|
||||||
|
+ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) | OTP_READ,
|
||||||
|
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||||
|
+ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) & SEL_BAK_KEY2_MASK & SW_TRIM_EN_MASK
|
||||||
|
+ & SEL_BAK_KEY_MASK & OTP_LOAD_SECURE_DATA_MASK & OTP_DO_CRC_MASK,
|
||||||
|
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||||
|
+ writel((readl(otp->base[OTPRX] + OTP_CONTROL_2) & OTP_RD_PERIOD_MASK) | CPU_CLOCK,
|
||||||
|
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||||
|
+
|
||||||
|
+ ret = readl_poll_timeout(otp->base[OTPRX] + OTP_STATUS, status,
|
||||||
|
+ status & OTP_READ_DONE, 10, OTP_READ_TIMEOUT_US);
|
||||||
|
+
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ *value = (readl(otp->base[HB_GPIO] + ADDRESS_8_DATA + addr_data * OTP_WORD_SIZE)
|
||||||
|
+ >> (8 * byte_shift)) & 0xff;
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sp_ocotp_read(void *priv, unsigned int offset, void *value, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct sp_ocotp_priv *otp = priv;
|
||||||
|
+ unsigned int addr;
|
||||||
|
+ char *buf = value;
|
||||||
|
+ char val[4];
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = clk_enable(otp->clk);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ *buf = 0;
|
||||||
|
+ for (addr = offset; addr < (offset + bytes); addr++) {
|
||||||
|
+ ret = sp_otp_read_real(otp, addr, val);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(otp->dev, "OTP read fail:%d at %d", ret, addr);
|
||||||
|
+ goto disable_clk;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *buf++ = *val;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+disable_clk:
|
||||||
|
+ clk_disable(otp->clk);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config sp_ocotp_nvmem_config = {
|
||||||
|
+ .name = "sp-ocotp",
|
||||||
|
+ .read_only = true,
|
||||||
|
+ .word_size = 1,
|
||||||
|
+ .size = QAC628_OTP_SIZE,
|
||||||
|
+ .stride = 1,
|
||||||
|
+ .reg_read = sp_ocotp_read,
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int sp_ocotp_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ struct sp_ocotp_priv *otp;
|
||||||
|
+ struct resource *res;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ otp = devm_kzalloc(dev, sizeof(*otp), GFP_KERNEL);
|
||||||
|
+ if (!otp)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ otp->dev = dev;
|
||||||
|
+
|
||||||
|
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hb_gpio");
|
||||||
|
+ otp->base[HB_GPIO] = devm_ioremap_resource(dev, res);
|
||||||
|
+ if (IS_ERR(otp->base[HB_GPIO]))
|
||||||
|
+ return PTR_ERR(otp->base[HB_GPIO]);
|
||||||
|
+
|
||||||
|
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "otprx");
|
||||||
|
+ otp->base[OTPRX] = devm_ioremap_resource(dev, res);
|
||||||
|
+ if (IS_ERR(otp->base[OTPRX]))
|
||||||
|
+ return PTR_ERR(otp->base[OTPRX]);
|
||||||
|
+
|
||||||
|
+ otp->clk = devm_clk_get(&pdev->dev, NULL);
|
||||||
|
+ if (IS_ERR(otp->clk))
|
||||||
|
+ return dev_err_probe(&pdev->dev, PTR_ERR(otp->clk),
|
||||||
|
+ "devm_clk_get fail\n");
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare(otp->clk);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(dev, "failed to prepare clk: %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sp_ocotp_nvmem_config.priv = otp;
|
||||||
|
+ sp_ocotp_nvmem_config.dev = dev;
|
||||||
|
+
|
||||||
|
+ nvmem = devm_nvmem_register(dev, &sp_ocotp_nvmem_config);
|
||||||
|
+ if (IS_ERR(nvmem))
|
||||||
|
+ return dev_err_probe(&pdev->dev, PTR_ERR(nvmem),
|
||||||
|
+ "register nvmem device fail\n");
|
||||||
|
+
|
||||||
|
+ platform_set_drvdata(pdev, nvmem);
|
||||||
|
+
|
||||||
|
+ dev_dbg(dev, "banks:%d x wpb:%d x wsize:%d = %d",
|
||||||
|
+ (int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK,
|
||||||
|
+ (int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE);
|
||||||
|
+
|
||||||
|
+ dev_info(dev, "by Sunplus (C) 2020");
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id sp_ocotp_dt_ids[] = {
|
||||||
|
+ { .compatible = "sunplus,sp7021-ocotp", .data = &sp_otp_v0 },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, sp_ocotp_dt_ids);
|
||||||
|
+
|
||||||
|
+static struct platform_driver sp_otp_driver = {
|
||||||
|
+ .probe = sp_ocotp_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "sunplus,sp7021-ocotp",
|
||||||
|
+ .of_match_table = sp_ocotp_dt_ids,
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+module_platform_driver(sp_otp_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Vincent Shih <vincent.sunplus@gmail.com>");
|
||||||
|
+MODULE_DESCRIPTION("Sunplus On-Chip OTP driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
||||||
|
+
|
@ -0,0 +1,32 @@
|
|||||||
|
From 6bd0ffeaa389866089e9573b2298ae58d6359b75 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Date: Mon, 21 Mar 2022 12:03:24 +0100
|
||||||
|
Subject: [PATCH] nvmem: bcm-ocotp: mark ACPI device ID table as maybe unused
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
"bcm_otpc_acpi_ids" is used with ACPI_PTR, so a build with !CONFIG_ACPI
|
||||||
|
has a warning:
|
||||||
|
|
||||||
|
drivers/nvmem/bcm-ocotp.c:247:36: error:
|
||||||
|
‘bcm_otpc_acpi_ids’ defined but not used [-Werror=unused-const-variable=]
|
||||||
|
|
||||||
|
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220321110326.44652-1-krzk@kernel.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/bcm-ocotp.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/bcm-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/bcm-ocotp.c
|
||||||
|
@@ -244,7 +244,7 @@ static const struct of_device_id bcm_otp
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, bcm_otpc_dt_ids);
|
||||||
|
|
||||||
|
-static const struct acpi_device_id bcm_otpc_acpi_ids[] = {
|
||||||
|
+static const struct acpi_device_id bcm_otpc_acpi_ids[] __maybe_unused = {
|
||||||
|
{ .id = "BRCM0700", .driver_data = (kernel_ulong_t)&otp_map },
|
||||||
|
{ .id = "BRCM0701", .driver_data = (kernel_ulong_t)&otp_map_v2 },
|
||||||
|
{ /* sentinel */ }
|
@ -0,0 +1,30 @@
|
|||||||
|
From 1066f8156351fcd997125257cea47cf805ba4f6d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Date: Mon, 21 Mar 2022 12:03:25 +0100
|
||||||
|
Subject: [PATCH] nvmem: sunplus-ocotp: staticize sp_otp_v0
|
||||||
|
|
||||||
|
The "sp_otp_v0" file scope variable is not used outside, so make it
|
||||||
|
static to fix warning:
|
||||||
|
|
||||||
|
drivers/nvmem/sunplus-ocotp.c:74:29: sparse:
|
||||||
|
sparse: symbol 'sp_otp_v0' was not declared. Should it be static?
|
||||||
|
|
||||||
|
Reported-by: kernel test robot <lkp@intel.com>
|
||||||
|
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220321110326.44652-2-krzk@kernel.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/sunplus-ocotp.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
@@ -71,7 +71,7 @@ struct sp_ocotp_data {
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
-const struct sp_ocotp_data sp_otp_v0 = {
|
||||||
|
+static const struct sp_ocotp_data sp_otp_v0 = {
|
||||||
|
.size = QAC628_OTP_SIZE,
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
From 874dfbcf219ccc42a2cbd187d087c7db82c3024b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Date: Mon, 21 Mar 2022 12:03:26 +0100
|
||||||
|
Subject: [PATCH] nvmem: sunplus-ocotp: drop useless probe confirmation
|
||||||
|
|
||||||
|
Printing probe success is discouraged, because we can use tracing for
|
||||||
|
this purpose. Remove useless print message after Sunplus OCOTP driver
|
||||||
|
probe.
|
||||||
|
|
||||||
|
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220321110326.44652-3-krzk@kernel.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/sunplus-ocotp.c | 2 --
|
||||||
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
@@ -202,8 +202,6 @@ static int sp_ocotp_probe(struct platfor
|
||||||
|
(int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK,
|
||||||
|
(int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE);
|
||||||
|
|
||||||
|
- dev_info(dev, "by Sunplus (C) 2020");
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -21,7 +21,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|||||||
|
|
||||||
--- a/drivers/nvmem/core.c
|
--- a/drivers/nvmem/core.c
|
||||||
+++ b/drivers/nvmem/core.c
|
+++ b/drivers/nvmem/core.c
|
||||||
@@ -462,6 +462,7 @@ static int nvmem_cell_info_to_nvmem_cell
|
@@ -467,6 +467,7 @@ static int nvmem_cell_info_to_nvmem_cell
|
||||||
|
|
||||||
cell->bit_offset = info->bit_offset;
|
cell->bit_offset = info->bit_offset;
|
||||||
cell->nbits = info->nbits;
|
cell->nbits = info->nbits;
|
@ -0,0 +1,130 @@
|
|||||||
|
From b6b7ef932ae838209254f016ecf8862d716a5ced Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sven Peter <sven@svenpeter.dev>
|
||||||
|
Date: Fri, 29 Apr 2022 17:26:50 +0100
|
||||||
|
Subject: [PATCH] nvmem: Add Apple eFuse driver
|
||||||
|
|
||||||
|
Apple SoCs contain eFuses used to store factory-programmed data such
|
||||||
|
as calibration values for the PCIe or the Type-C PHY. They are organized
|
||||||
|
as 32bit values exposed as MMIO.
|
||||||
|
|
||||||
|
Signed-off-by: Sven Peter <sven@svenpeter.dev>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-6-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 12 ++++++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/apple-efuses.c | 80 ++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 94 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/apple-efuses.c
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -324,4 +324,16 @@ config NVMEM_SUNPLUS_OCOTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-sunplus-ocotp.
|
||||||
|
|
||||||
|
+config NVMEM_APPLE_EFUSES
|
||||||
|
+ tristate "Apple eFuse support"
|
||||||
|
+ depends on ARCH_APPLE || COMPILE_TEST
|
||||||
|
+ default ARCH_APPLE
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable support for reading eFuses on Apple SoCs
|
||||||
|
+ such as the M1. These are e.g. used to store factory programmed
|
||||||
|
+ calibration data required for the PCIe or the USB-C PHY.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module will
|
||||||
|
+ be called nvmem-apple-efuses.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -65,3 +65,5 @@ obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nv
|
||||||
|
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||||
|
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
+nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/apple-efuses.c
|
||||||
|
@@ -0,0 +1,80 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
+/*
|
||||||
|
+ * Apple SoC eFuse driver
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) The Asahi Linux Contributors
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/mod_devicetable.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+struct apple_efuses_priv {
|
||||||
|
+ void __iomem *fuses;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int apple_efuses_read(void *context, unsigned int offset, void *val,
|
||||||
|
+ size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct apple_efuses_priv *priv = context;
|
||||||
|
+ u32 *dst = val;
|
||||||
|
+
|
||||||
|
+ while (bytes >= sizeof(u32)) {
|
||||||
|
+ *dst++ = readl_relaxed(priv->fuses + offset);
|
||||||
|
+ bytes -= sizeof(u32);
|
||||||
|
+ offset += sizeof(u32);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int apple_efuses_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct apple_efuses_priv *priv;
|
||||||
|
+ struct resource *res;
|
||||||
|
+ struct nvmem_config config = {
|
||||||
|
+ .dev = &pdev->dev,
|
||||||
|
+ .read_only = true,
|
||||||
|
+ .reg_read = apple_efuses_read,
|
||||||
|
+ .stride = sizeof(u32),
|
||||||
|
+ .word_size = sizeof(u32),
|
||||||
|
+ .name = "apple_efuses_nvmem",
|
||||||
|
+ .id = NVMEM_DEVID_AUTO,
|
||||||
|
+ .root_only = true,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ priv = devm_kzalloc(config.dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
+ if (!priv)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ priv->fuses = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||||
|
+ if (IS_ERR(priv->fuses))
|
||||||
|
+ return PTR_ERR(priv->fuses);
|
||||||
|
+
|
||||||
|
+ config.priv = priv;
|
||||||
|
+ config.size = resource_size(res);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(devm_nvmem_register(config.dev, &config));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id apple_efuses_of_match[] = {
|
||||||
|
+ { .compatible = "apple,efuses", },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+MODULE_DEVICE_TABLE(of, apple_efuses_of_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver apple_efuses_driver = {
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "apple_efuses",
|
||||||
|
+ .of_match_table = apple_efuses_of_match,
|
||||||
|
+ },
|
||||||
|
+ .probe = apple_efuses_probe,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+module_platform_driver(apple_efuses_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Sven Peter <sven@svenpeter.dev>");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -0,0 +1,31 @@
|
|||||||
|
From 517f6e2641a2802dce5a5aa0d18c7d37a35678d2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Minghao Chi <chi.minghao@zte.com.cn>
|
||||||
|
Date: Fri, 29 Apr 2022 17:26:54 +0100
|
||||||
|
Subject: [PATCH] nvmem: qfprom: using pm_runtime_resume_and_get instead of
|
||||||
|
pm_runtime_get_sync
|
||||||
|
|
||||||
|
Using pm_runtime_resume_and_get is more appropriate
|
||||||
|
for simplifing code
|
||||||
|
|
||||||
|
Reported-by: Zeal Robot <zealci@zte.com.cn>
|
||||||
|
Signed-off-by: Minghao Chi <chi.minghao@zte.com.cn>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-10-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/qfprom.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/qfprom.c
|
||||||
|
+++ b/drivers/nvmem/qfprom.c
|
||||||
|
@@ -217,9 +217,8 @@ static int qfprom_enable_fuse_blowing(co
|
||||||
|
goto err_clk_rate_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = pm_runtime_get_sync(priv->dev);
|
||||||
|
+ ret = pm_runtime_resume_and_get(priv->dev);
|
||||||
|
if (ret < 0) {
|
||||||
|
- pm_runtime_put_noidle(priv->dev);
|
||||||
|
dev_err(priv->dev, "Failed to enable power-domain\n");
|
||||||
|
goto err_reg_enable;
|
||||||
|
}
|
@ -0,0 +1,109 @@
|
|||||||
|
From 943eadbdb11314b41eacbcc484dfb7f93e271ff4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Date: Fri, 29 Apr 2022 17:27:00 +0100
|
||||||
|
Subject: [PATCH] nvmem: sfp: Use regmap
|
||||||
|
|
||||||
|
This converts the SFP driver to use regmap. This will allow easily
|
||||||
|
supporting devices with different endians. We disallow byte-level
|
||||||
|
access, as regmap_bulk_read doesn't support it (and it's unclear what
|
||||||
|
the correct result would be when we have an endianness difference).
|
||||||
|
|
||||||
|
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-16-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 1 +
|
||||||
|
drivers/nvmem/layerscape-sfp.c | 30 ++++++++++++++++++++++--------
|
||||||
|
2 files changed, 23 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -304,6 +304,7 @@ config NVMEM_LAYERSCAPE_SFP
|
||||||
|
tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
+ select REGMAP_MMIO
|
||||||
|
help
|
||||||
|
This driver provides support to read the eFuses on Freescale
|
||||||
|
Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
--- a/drivers/nvmem/layerscape-sfp.c
|
||||||
|
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||||
|
@@ -13,15 +13,17 @@
|
||||||
|
#include <linux/nvmem-provider.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/property.h>
|
||||||
|
+#include <linux/regmap.h>
|
||||||
|
|
||||||
|
#define LAYERSCAPE_SFP_OTP_OFFSET 0x0200
|
||||||
|
|
||||||
|
struct layerscape_sfp_priv {
|
||||||
|
- void __iomem *base;
|
||||||
|
+ struct regmap *regmap;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct layerscape_sfp_data {
|
||||||
|
int size;
|
||||||
|
+ enum regmap_endian endian;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int layerscape_sfp_read(void *context, unsigned int offset, void *val,
|
||||||
|
@@ -29,15 +31,16 @@ static int layerscape_sfp_read(void *con
|
||||||
|
{
|
||||||
|
struct layerscape_sfp_priv *priv = context;
|
||||||
|
|
||||||
|
- memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset,
|
||||||
|
- bytes);
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
+ return regmap_bulk_read(priv->regmap,
|
||||||
|
+ LAYERSCAPE_SFP_OTP_OFFSET + offset, val,
|
||||||
|
+ bytes / 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct nvmem_config layerscape_sfp_nvmem_config = {
|
||||||
|
.name = "fsl-sfp",
|
||||||
|
.reg_read = layerscape_sfp_read,
|
||||||
|
+ .word_size = 4,
|
||||||
|
+ .stride = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int layerscape_sfp_probe(struct platform_device *pdev)
|
||||||
|
@@ -45,16 +48,26 @@ static int layerscape_sfp_probe(struct p
|
||||||
|
const struct layerscape_sfp_data *data;
|
||||||
|
struct layerscape_sfp_priv *priv;
|
||||||
|
struct nvmem_device *nvmem;
|
||||||
|
+ struct regmap_config config = { 0 };
|
||||||
|
+ void __iomem *base;
|
||||||
|
|
||||||
|
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
if (!priv)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
- priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
- if (IS_ERR(priv->base))
|
||||||
|
- return PTR_ERR(priv->base);
|
||||||
|
+ base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(base))
|
||||||
|
+ return PTR_ERR(base);
|
||||||
|
|
||||||
|
data = device_get_match_data(&pdev->dev);
|
||||||
|
+ config.reg_bits = 32;
|
||||||
|
+ config.reg_stride = 4;
|
||||||
|
+ config.val_bits = 32;
|
||||||
|
+ config.val_format_endian = data->endian;
|
||||||
|
+ config.max_register = LAYERSCAPE_SFP_OTP_OFFSET + data->size - 4;
|
||||||
|
+ priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, &config);
|
||||||
|
+ if (IS_ERR(priv->regmap))
|
||||||
|
+ return PTR_ERR(priv->regmap);
|
||||||
|
|
||||||
|
layerscape_sfp_nvmem_config.size = data->size;
|
||||||
|
layerscape_sfp_nvmem_config.dev = &pdev->dev;
|
||||||
|
@@ -67,6 +80,7 @@ static int layerscape_sfp_probe(struct p
|
||||||
|
|
||||||
|
static const struct layerscape_sfp_data ls1028a_data = {
|
||||||
|
.size = 0x88,
|
||||||
|
+ .endian = REGMAP_ENDIAN_LITTLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
@ -0,0 +1,38 @@
|
|||||||
|
From 33a1c6618677fe33f8e84cb7bedc45abbce89a50 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Date: Fri, 29 Apr 2022 17:27:01 +0100
|
||||||
|
Subject: [PATCH] nvmem: sfp: Add support for TA 2.1 devices
|
||||||
|
|
||||||
|
This adds support for Trust Architecture (TA) 2.1 devices to the SFP driver.
|
||||||
|
There are few differences between TA 2.1 and TA 3.0, especially for
|
||||||
|
read-only support, so just re-use the existing data.
|
||||||
|
|
||||||
|
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-17-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/layerscape-sfp.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/layerscape-sfp.c
|
||||||
|
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||||
|
@@ -78,12 +78,18 @@ static int layerscape_sfp_probe(struct p
|
||||||
|
return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const struct layerscape_sfp_data ls1021a_data = {
|
||||||
|
+ .size = 0x88,
|
||||||
|
+ .endian = REGMAP_ENDIAN_BIG,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct layerscape_sfp_data ls1028a_data = {
|
||||||
|
.size = 0x88,
|
||||||
|
.endian = REGMAP_ENDIAN_LITTLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
||||||
|
+ { .compatible = "fsl,ls1021a-sfp", .data = &ls1021a_data },
|
||||||
|
{ .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data },
|
||||||
|
{},
|
||||||
|
};
|
@ -0,0 +1,389 @@
|
|||||||
|
From 98830350d3fc824c1ff5c338140fe20f041a5916 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
Date: Wed, 6 Jul 2022 11:06:22 +0100
|
||||||
|
Subject: [PATCH] nvmem: microchip-otpc: add support
|
||||||
|
|
||||||
|
Add support for Microchip OTP controller available on SAMA7G5. The OTPC
|
||||||
|
controls the access to a non-volatile memory. The memory behind OTPC is
|
||||||
|
organized into packets, packets are composed by a fixed length header
|
||||||
|
(4 bytes long) and a variable length payload (payload length is available
|
||||||
|
in the header). When software request the data at an offset in memory
|
||||||
|
the OTPC will return (via header + data registers) the whole packet that
|
||||||
|
has a word at that offset. For the OTP memory layout like below:
|
||||||
|
|
||||||
|
offset OTP Memory layout
|
||||||
|
|
||||||
|
. .
|
||||||
|
. ... .
|
||||||
|
. .
|
||||||
|
0x0E +-----------+ <--- packet X
|
||||||
|
| header X |
|
||||||
|
0x12 +-----------+
|
||||||
|
| payload X |
|
||||||
|
0x16 | |
|
||||||
|
| |
|
||||||
|
0x1A | |
|
||||||
|
+-----------+
|
||||||
|
. .
|
||||||
|
. ... .
|
||||||
|
. .
|
||||||
|
|
||||||
|
if user requests data at address 0x16 the data started at 0x0E will be
|
||||||
|
returned by controller. User will be able to fetch the whole packet
|
||||||
|
starting at 0x0E (or parts of the packet) via proper registers. The same
|
||||||
|
packet will be returned if software request the data at offset 0x0E or
|
||||||
|
0x12 or 0x1A.
|
||||||
|
|
||||||
|
The OTP will be populated by Microchip with at least 2 packets first one
|
||||||
|
being boot configuration packet and the 2nd one being temperature
|
||||||
|
calibration packet. The packet order will be preserved b/w different chip
|
||||||
|
revisions but the packet sizes may change.
|
||||||
|
|
||||||
|
For the above reasons and to keep the same software able to work on all
|
||||||
|
chip variants the read function of the driver is working with a packet
|
||||||
|
id instead of an offset in OTP memory.
|
||||||
|
|
||||||
|
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220706100627.6534-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
MAINTAINERS | 8 +
|
||||||
|
drivers/nvmem/Kconfig | 7 +
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/microchip-otpc.c | 288 +++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 305 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/microchip-otpc.c
|
||||||
|
|
||||||
|
--- a/MAINTAINERS
|
||||||
|
+++ b/MAINTAINERS
|
||||||
|
@@ -11565,6 +11565,14 @@ S: Supported
|
||||||
|
F: Documentation/devicetree/bindings/mtd/atmel-nand.txt
|
||||||
|
F: drivers/mtd/nand/raw/atmel/*
|
||||||
|
|
||||||
|
+MICROCHIP OTPC DRIVER
|
||||||
|
+M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
+L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
+S: Supported
|
||||||
|
+F: Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
|
||||||
|
+F: drivers/nvmem/microchip-otpc.c
|
||||||
|
+F: dt-bindings/nvmem/microchip,sama7g5-otpc.h
|
||||||
|
+
|
||||||
|
MICROCHIP PWM DRIVER
|
||||||
|
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -107,6 +107,13 @@ config MTK_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called efuse-mtk.
|
||||||
|
|
||||||
|
+config MICROCHIP_OTPC
|
||||||
|
+ tristate "Microchip OTPC support"
|
||||||
|
+ depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
+ help
|
||||||
|
+ This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
+ SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
+
|
||||||
|
config NVMEM_NINTENDO_OTP
|
||||||
|
tristate "Nintendo Wii and Wii U OTP Support"
|
||||||
|
depends on WII || COMPILE_TEST
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -67,3 +67,5 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm
|
||||||
|
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
+obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
+nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/microchip-otpc.c
|
||||||
|
@@ -0,0 +1,288 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+/*
|
||||||
|
+ * OTP Memory controller
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries
|
||||||
|
+ *
|
||||||
|
+ * Author: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <linux/iopoll.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+#define MCHP_OTPC_CR (0x0)
|
||||||
|
+#define MCHP_OTPC_CR_READ BIT(6)
|
||||||
|
+#define MCHP_OTPC_MR (0x4)
|
||||||
|
+#define MCHP_OTPC_MR_ADDR GENMASK(31, 16)
|
||||||
|
+#define MCHP_OTPC_AR (0x8)
|
||||||
|
+#define MCHP_OTPC_SR (0xc)
|
||||||
|
+#define MCHP_OTPC_SR_READ BIT(6)
|
||||||
|
+#define MCHP_OTPC_HR (0x20)
|
||||||
|
+#define MCHP_OTPC_HR_SIZE GENMASK(15, 8)
|
||||||
|
+#define MCHP_OTPC_DR (0x24)
|
||||||
|
+
|
||||||
|
+#define MCHP_OTPC_NAME "mchp-otpc"
|
||||||
|
+#define MCHP_OTPC_SIZE (11 * 1024)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * struct mchp_otpc - OTPC private data structure
|
||||||
|
+ * @base: base address
|
||||||
|
+ * @dev: struct device pointer
|
||||||
|
+ * @packets: list of packets in OTP memory
|
||||||
|
+ * @npackets: number of packets in OTP memory
|
||||||
|
+ */
|
||||||
|
+struct mchp_otpc {
|
||||||
|
+ void __iomem *base;
|
||||||
|
+ struct device *dev;
|
||||||
|
+ struct list_head packets;
|
||||||
|
+ u32 npackets;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * struct mchp_otpc_packet - OTPC packet data structure
|
||||||
|
+ * @list: list head
|
||||||
|
+ * @id: packet ID
|
||||||
|
+ * @offset: packet offset (in words) in OTP memory
|
||||||
|
+ */
|
||||||
|
+struct mchp_otpc_packet {
|
||||||
|
+ struct list_head list;
|
||||||
|
+ u32 id;
|
||||||
|
+ u32 offset;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct mchp_otpc_packet *mchp_otpc_id_to_packet(struct mchp_otpc *otpc,
|
||||||
|
+ u32 id)
|
||||||
|
+{
|
||||||
|
+ struct mchp_otpc_packet *packet;
|
||||||
|
+
|
||||||
|
+ if (id >= otpc->npackets)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ list_for_each_entry(packet, &otpc->packets, list) {
|
||||||
|
+ if (packet->id == id)
|
||||||
|
+ return packet;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mchp_otpc_prepare_read(struct mchp_otpc *otpc,
|
||||||
|
+ unsigned int offset)
|
||||||
|
+{
|
||||||
|
+ u32 tmp;
|
||||||
|
+
|
||||||
|
+ /* Set address. */
|
||||||
|
+ tmp = readl_relaxed(otpc->base + MCHP_OTPC_MR);
|
||||||
|
+ tmp &= ~MCHP_OTPC_MR_ADDR;
|
||||||
|
+ tmp |= FIELD_PREP(MCHP_OTPC_MR_ADDR, offset);
|
||||||
|
+ writel_relaxed(tmp, otpc->base + MCHP_OTPC_MR);
|
||||||
|
+
|
||||||
|
+ /* Set read. */
|
||||||
|
+ tmp = readl_relaxed(otpc->base + MCHP_OTPC_CR);
|
||||||
|
+ tmp |= MCHP_OTPC_CR_READ;
|
||||||
|
+ writel_relaxed(tmp, otpc->base + MCHP_OTPC_CR);
|
||||||
|
+
|
||||||
|
+ /* Wait for packet to be transferred into temporary buffers. */
|
||||||
|
+ return read_poll_timeout(readl_relaxed, tmp, !(tmp & MCHP_OTPC_SR_READ),
|
||||||
|
+ 10000, 2000, false, otpc->base + MCHP_OTPC_SR);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * OTPC memory is organized into packets. Each packets contains a header and
|
||||||
|
+ * a payload. Header is 4 bytes long and contains the size of the payload.
|
||||||
|
+ * Payload size varies. The memory footprint is something as follows:
|
||||||
|
+ *
|
||||||
|
+ * Memory offset Memory footprint Packet ID
|
||||||
|
+ * ------------- ---------------- ---------
|
||||||
|
+ *
|
||||||
|
+ * 0x0 +------------+ <-- packet 0
|
||||||
|
+ * | header 0 |
|
||||||
|
+ * 0x4 +------------+
|
||||||
|
+ * | payload 0 |
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * offset1 +------------+ <-- packet 1
|
||||||
|
+ * | header 1 |
|
||||||
|
+ * offset1 + 0x4 +------------+
|
||||||
|
+ * | payload 1 |
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * offset2 +------------+ <-- packet 2
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * offsetN +------------+ <-- packet N
|
||||||
|
+ * | header N |
|
||||||
|
+ * offsetN + 0x4 +------------+
|
||||||
|
+ * | payload N |
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * +------------+
|
||||||
|
+ *
|
||||||
|
+ * where offset1, offset2, offsetN depends on the size of payload 0, payload 1,
|
||||||
|
+ * payload N-1.
|
||||||
|
+ *
|
||||||
|
+ * The access to memory is done on a per packet basis: the control registers
|
||||||
|
+ * need to be updated with an offset address (within a packet range) and the
|
||||||
|
+ * data registers will be update by controller with information contained by
|
||||||
|
+ * that packet. E.g. if control registers are updated with any address within
|
||||||
|
+ * the range [offset1, offset2) the data registers are updated by controller
|
||||||
|
+ * with packet 1. Header data is accessible though MCHP_OTPC_HR register.
|
||||||
|
+ * Payload data is accessible though MCHP_OTPC_DR and MCHP_OTPC_AR registers.
|
||||||
|
+ * There is no direct mapping b/w the offset requested by software and the
|
||||||
|
+ * offset returned by hardware.
|
||||||
|
+ *
|
||||||
|
+ * For this, the read function will return the first requested bytes in the
|
||||||
|
+ * packet. The user will have to be aware of the memory footprint before doing
|
||||||
|
+ * the read request.
|
||||||
|
+ */
|
||||||
|
+static int mchp_otpc_read(void *priv, unsigned int off, void *val,
|
||||||
|
+ size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct mchp_otpc *otpc = priv;
|
||||||
|
+ struct mchp_otpc_packet *packet;
|
||||||
|
+ u32 *buf = val;
|
||||||
|
+ u32 offset;
|
||||||
|
+ size_t len = 0;
|
||||||
|
+ int ret, payload_size;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * We reach this point with off being multiple of stride = 4 to
|
||||||
|
+ * be able to cross the subsystem. Inside the driver we use continuous
|
||||||
|
+ * unsigned integer numbers for packet id, thus devide off by 4
|
||||||
|
+ * before passing it to mchp_otpc_id_to_packet().
|
||||||
|
+ */
|
||||||
|
+ packet = mchp_otpc_id_to_packet(otpc, off / 4);
|
||||||
|
+ if (!packet)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ offset = packet->offset;
|
||||||
|
+
|
||||||
|
+ while (len < bytes) {
|
||||||
|
+ ret = mchp_otpc_prepare_read(otpc, offset);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /* Read and save header content. */
|
||||||
|
+ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_HR);
|
||||||
|
+ len += sizeof(*buf);
|
||||||
|
+ offset++;
|
||||||
|
+ if (len >= bytes)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ /* Read and save payload content. */
|
||||||
|
+ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, *(buf - 1));
|
||||||
|
+ writel_relaxed(0UL, otpc->base + MCHP_OTPC_AR);
|
||||||
|
+ do {
|
||||||
|
+ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_DR);
|
||||||
|
+ len += sizeof(*buf);
|
||||||
|
+ offset++;
|
||||||
|
+ payload_size--;
|
||||||
|
+ } while (payload_size >= 0 && len < bytes);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mchp_otpc_init_packets_list(struct mchp_otpc *otpc, u32 *size)
|
||||||
|
+{
|
||||||
|
+ struct mchp_otpc_packet *packet;
|
||||||
|
+ u32 word, word_pos = 0, id = 0, npackets = 0, payload_size;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ INIT_LIST_HEAD(&otpc->packets);
|
||||||
|
+ *size = 0;
|
||||||
|
+
|
||||||
|
+ while (*size < MCHP_OTPC_SIZE) {
|
||||||
|
+ ret = mchp_otpc_prepare_read(otpc, word_pos);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ word = readl_relaxed(otpc->base + MCHP_OTPC_HR);
|
||||||
|
+ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, word);
|
||||||
|
+ if (!payload_size)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ packet = devm_kzalloc(otpc->dev, sizeof(*packet), GFP_KERNEL);
|
||||||
|
+ if (!packet)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ packet->id = id++;
|
||||||
|
+ packet->offset = word_pos;
|
||||||
|
+ INIT_LIST_HEAD(&packet->list);
|
||||||
|
+ list_add_tail(&packet->list, &otpc->packets);
|
||||||
|
+
|
||||||
|
+ /* Count size by adding header and paload sizes. */
|
||||||
|
+ *size += 4 * (payload_size + 1);
|
||||||
|
+ /* Next word: this packet (header, payload) position + 1. */
|
||||||
|
+ word_pos += payload_size + 2;
|
||||||
|
+
|
||||||
|
+ npackets++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ otpc->npackets = npackets;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config mchp_nvmem_config = {
|
||||||
|
+ .name = MCHP_OTPC_NAME,
|
||||||
|
+ .type = NVMEM_TYPE_OTP,
|
||||||
|
+ .read_only = true,
|
||||||
|
+ .word_size = 4,
|
||||||
|
+ .stride = 4,
|
||||||
|
+ .reg_read = mchp_otpc_read,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int mchp_otpc_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ struct mchp_otpc *otpc;
|
||||||
|
+ u32 size;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ otpc = devm_kzalloc(&pdev->dev, sizeof(*otpc), GFP_KERNEL);
|
||||||
|
+ if (!otpc)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ otpc->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(otpc->base))
|
||||||
|
+ return PTR_ERR(otpc->base);
|
||||||
|
+
|
||||||
|
+ otpc->dev = &pdev->dev;
|
||||||
|
+ ret = mchp_otpc_init_packets_list(otpc, &size);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ mchp_nvmem_config.dev = otpc->dev;
|
||||||
|
+ mchp_nvmem_config.size = size;
|
||||||
|
+ mchp_nvmem_config.priv = otpc;
|
||||||
|
+ nvmem = devm_nvmem_register(&pdev->dev, &mchp_nvmem_config);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id __maybe_unused mchp_otpc_ids[] = {
|
||||||
|
+ { .compatible = "microchip,sama7g5-otpc", },
|
||||||
|
+ { },
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, mchp_otpc_ids);
|
||||||
|
+
|
||||||
|
+static struct platform_driver mchp_otpc_driver = {
|
||||||
|
+ .probe = mchp_otpc_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = MCHP_OTPC_NAME,
|
||||||
|
+ .of_match_table = of_match_ptr(mchp_otpc_ids),
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_platform_driver(mchp_otpc_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Claudiu Beznea <claudiu.beznea@microchip.com>");
|
||||||
|
+MODULE_DESCRIPTION("Microchip SAMA7G5 OTPC driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -0,0 +1,32 @@
|
|||||||
|
From f5c97da8037b18d1256a58459fa96ed68e50fb41 Mon Sep 17 00:00:00 2001
|
||||||
|
From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||||
|
Date: Wed, 6 Jul 2022 11:06:27 +0100
|
||||||
|
Subject: [PATCH] nvmem: mtk-efuse: Simplify with
|
||||||
|
devm_platform_get_and_ioremap_resource()
|
||||||
|
|
||||||
|
Convert platform_get_resource(), devm_ioremap_resource() to a single
|
||||||
|
call to devm_platform_get_and_ioremap_resource(), as this is exactly
|
||||||
|
what this function does.
|
||||||
|
|
||||||
|
No functional changes.
|
||||||
|
|
||||||
|
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220706100627.6534-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/mtk-efuse.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/mtk-efuse.c
|
||||||
|
+++ b/drivers/nvmem/mtk-efuse.c
|
||||||
|
@@ -41,8 +41,7 @@ static int mtk_efuse_probe(struct platfo
|
||||||
|
if (!priv)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
- priv->base = devm_ioremap_resource(dev, res);
|
||||||
|
+ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||||
|
if (IS_ERR(priv->base))
|
||||||
|
return PTR_ERR(priv->base);
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
From bd1244561fa2a4531ded40dbf09c9599084f8b29 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||||
|
Date: Fri, 16 Sep 2022 13:04:02 +0100
|
||||||
|
Subject: [PATCH] nvmem: core: Fix memleak in nvmem_register()
|
||||||
|
|
||||||
|
dev_set_name will alloc memory for nvmem->dev.kobj.name in
|
||||||
|
nvmem_register, when nvmem_validate_keepouts failed, nvmem's
|
||||||
|
memory will be freed and return, but nobody will free memory
|
||||||
|
for nvmem->dev.kobj.name, there will be memleak, so moving
|
||||||
|
nvmem_validate_keepouts() after device_register() and let
|
||||||
|
the device core deal with cleaning name in error cases.
|
||||||
|
|
||||||
|
Fixes: de0534df9347 ("nvmem: core: fix error handling while validating keepout regions")
|
||||||
|
Cc: stable@vger.kernel.org
|
||||||
|
Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916120402.38753-1-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 15 ++++++---------
|
||||||
|
1 file changed, 6 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -829,21 +829,18 @@ struct nvmem_device *nvmem_register(cons
|
||||||
|
nvmem->dev.groups = nvmem_dev_groups;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
- if (nvmem->nkeepout) {
|
||||||
|
- rval = nvmem_validate_keepouts(nvmem);
|
||||||
|
- if (rval) {
|
||||||
|
- ida_free(&nvmem_ida, nvmem->id);
|
||||||
|
- kfree(nvmem);
|
||||||
|
- return ERR_PTR(rval);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
|
||||||
|
|
||||||
|
rval = device_register(&nvmem->dev);
|
||||||
|
if (rval)
|
||||||
|
goto err_put_device;
|
||||||
|
|
||||||
|
+ if (nvmem->nkeepout) {
|
||||||
|
+ rval = nvmem_validate_keepouts(nvmem);
|
||||||
|
+ if (rval)
|
||||||
|
+ goto err_device_del;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (config->compat) {
|
||||||
|
rval = nvmem_sysfs_setup_compat(nvmem, config);
|
||||||
|
if (rval)
|
@ -1,6 +1,6 @@
|
|||||||
From f955dc14450695564926711cf9fa8e1d5d854302 Mon Sep 17 00:00:00 2001
|
From d5542923f200f95bddf524f36fd495f78aa28e3c Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Wed, 15 Jun 2022 21:43:00 +0200
|
Date: Fri, 16 Sep 2022 13:20:48 +0100
|
||||||
Subject: [PATCH] nvmem: add driver handling U-Boot environment variables
|
Subject: [PATCH] nvmem: add driver handling U-Boot environment variables
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -22,16 +22,24 @@ Kernel-parsed NVMEM cells can be read however by Linux drivers. This may
|
|||||||
be useful for Ethernet drivers for reading device MAC address which is
|
be useful for Ethernet drivers for reading device MAC address which is
|
||||||
often stored as U-Boot env variable.
|
often stored as U-Boot env variable.
|
||||||
|
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
|
||||||
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
||||||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
|
MAINTAINERS | 1 +
|
||||||
|
drivers/nvmem/Kconfig | 13 +++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/u-boot-env.c | 218 +++++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 234 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/u-boot-env.c
|
||||||
|
|
||||||
--- a/drivers/nvmem/Kconfig
|
--- a/drivers/nvmem/Kconfig
|
||||||
+++ b/drivers/nvmem/Kconfig
|
+++ b/drivers/nvmem/Kconfig
|
||||||
@@ -300,4 +300,17 @@ config NVMEM_BRCM_NVRAM
|
@@ -344,4 +344,17 @@ config NVMEM_APPLE_EFUSES
|
||||||
This driver provides support for Broadcom's NVRAM that can be accessed
|
This driver can also be built as a module. If so, the module will
|
||||||
using I/O mapping.
|
be called nvmem-apple-efuses.
|
||||||
|
|
||||||
+config NVMEM_U_BOOT_ENV
|
+config NVMEM_U_BOOT_ENV
|
||||||
+ tristate "U-Boot environment variables support"
|
+ tristate "U-Boot environment variables support"
|
||||||
@ -49,10 +57,10 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|||||||
endif
|
endif
|
||||||
--- a/drivers/nvmem/Makefile
|
--- a/drivers/nvmem/Makefile
|
||||||
+++ b/drivers/nvmem/Makefile
|
+++ b/drivers/nvmem/Makefile
|
||||||
@@ -61,3 +61,5 @@ obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.
|
@@ -69,3 +69,5 @@ obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvme
|
||||||
nvmem-rmem-y := rmem.o
|
nvmem-apple-efuses-y := apple-efuses.o
|
||||||
obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
nvmem_brcm_nvram-y := brcm_nvram.o
|
nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
+nvmem_u-boot-env-y := u-boot-env.o
|
+nvmem_u-boot-env-y := u-boot-env.o
|
||||||
--- /dev/null
|
--- /dev/null
|
@ -0,0 +1,47 @@
|
|||||||
|
From 5544e90c81261e82e02bbf7c6015a4b9c8c825ef Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:50 +0100
|
||||||
|
Subject: [PATCH] nvmem: core: add error handling for dev_set_name
|
||||||
|
|
||||||
|
The type of return value of dev_set_name is int, which may return
|
||||||
|
wrong result, so we add error handling for it to reclaim memory
|
||||||
|
of nvmem resource, and return early when an error occurs.
|
||||||
|
|
||||||
|
Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 12 +++++++++---
|
||||||
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -810,18 +810,24 @@ struct nvmem_device *nvmem_register(cons
|
||||||
|
|
||||||
|
switch (config->id) {
|
||||||
|
case NVMEM_DEVID_NONE:
|
||||||
|
- dev_set_name(&nvmem->dev, "%s", config->name);
|
||||||
|
+ rval = dev_set_name(&nvmem->dev, "%s", config->name);
|
||||||
|
break;
|
||||||
|
case NVMEM_DEVID_AUTO:
|
||||||
|
- dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
|
||||||
|
+ rval = dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
- dev_set_name(&nvmem->dev, "%s%d",
|
||||||
|
+ rval = dev_set_name(&nvmem->dev, "%s%d",
|
||||||
|
config->name ? : "nvmem",
|
||||||
|
config->name ? config->id : nvmem->id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (rval) {
|
||||||
|
+ ida_free(&nvmem_ida, nvmem->id);
|
||||||
|
+ kfree(nvmem);
|
||||||
|
+ return ERR_PTR(rval);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
nvmem->read_only = device_property_present(config->dev, "read-only") ||
|
||||||
|
config->read_only || !nvmem->reg_write;
|
||||||
|
|
@ -0,0 +1,29 @@
|
|||||||
|
From d3524bb5b9a0c567b853a0024526afe87dde01ed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kenneth Lee <klee33@uw.edu>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:52 +0100
|
||||||
|
Subject: [PATCH] nvmem: brcm_nvram: Use kzalloc for allocating only one
|
||||||
|
element
|
||||||
|
|
||||||
|
Use kzalloc(...) rather than kcalloc(1, ...) because the number of
|
||||||
|
elements we are specifying in this case is 1, so kzalloc would
|
||||||
|
accomplish the same thing and we can simplify.
|
||||||
|
|
||||||
|
Signed-off-by: Kenneth Lee <klee33@uw.edu>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-6-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/brcm_nvram.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/brcm_nvram.c
|
||||||
|
+++ b/drivers/nvmem/brcm_nvram.c
|
||||||
|
@@ -96,7 +96,7 @@ static int brcm_nvram_parse(struct brcm_
|
||||||
|
|
||||||
|
len = le32_to_cpu(header.len);
|
||||||
|
|
||||||
|
- data = kcalloc(1, len, GFP_KERNEL);
|
||||||
|
+ data = kzalloc(len, GFP_KERNEL);
|
||||||
|
memcpy_fromio(data, priv->base, len);
|
||||||
|
data[len - 1] = '\0';
|
||||||
|
|
@ -0,0 +1,270 @@
|
|||||||
|
From 28fc7c986f01fdcfd28af648be2597624cac0e27 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:54 +0100
|
||||||
|
Subject: [PATCH] nvmem: prefix all symbols with NVMEM_
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This unifies all NVMEM symbols. They follow one style now.
|
||||||
|
|
||||||
|
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
|
||||||
|
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
arch/arm/configs/multi_v7_defconfig | 6 +++---
|
||||||
|
arch/arm/configs/qcom_defconfig | 2 +-
|
||||||
|
arch/arm64/configs/defconfig | 10 +++++-----
|
||||||
|
arch/mips/configs/ci20_defconfig | 2 +-
|
||||||
|
drivers/cpufreq/Kconfig.arm | 2 +-
|
||||||
|
drivers/nvmem/Kconfig | 24 ++++++++++++------------
|
||||||
|
drivers/nvmem/Makefile | 24 ++++++++++++------------
|
||||||
|
drivers/soc/mediatek/Kconfig | 2 +-
|
||||||
|
drivers/thermal/qcom/Kconfig | 2 +-
|
||||||
|
9 files changed, 37 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm/configs/multi_v7_defconfig
|
||||||
|
+++ b/arch/arm/configs/multi_v7_defconfig
|
||||||
|
@@ -1085,10 +1085,10 @@ CONFIG_OMAP_USB2=y
|
||||||
|
CONFIG_TI_PIPE3=y
|
||||||
|
CONFIG_TWL4030_USB=m
|
||||||
|
CONFIG_NVMEM_IMX_OCOTP=y
|
||||||
|
-CONFIG_ROCKCHIP_EFUSE=m
|
||||||
|
+CONFIG_NVMEM_ROCKCHIP_EFUSE=m
|
||||||
|
CONFIG_NVMEM_SUNXI_SID=y
|
||||||
|
CONFIG_NVMEM_VF610_OCOTP=y
|
||||||
|
-CONFIG_MESON_MX_EFUSE=m
|
||||||
|
+CONFIG_NVMEM_MESON_MX_EFUSE=m
|
||||||
|
CONFIG_FSI=m
|
||||||
|
CONFIG_FSI_MASTER_GPIO=m
|
||||||
|
CONFIG_FSI_MASTER_HUB=m
|
||||||
|
--- a/arch/arm/configs/qcom_defconfig
|
||||||
|
+++ b/arch/arm/configs/qcom_defconfig
|
||||||
|
@@ -257,7 +257,7 @@ CONFIG_PHY_QCOM_APQ8064_SATA=y
|
||||||
|
CONFIG_PHY_QCOM_IPQ806X_SATA=y
|
||||||
|
CONFIG_PHY_QCOM_USB_HS=y
|
||||||
|
CONFIG_PHY_QCOM_USB_HSIC=y
|
||||||
|
-CONFIG_QCOM_QFPROM=y
|
||||||
|
+CONFIG_NVMEM_QCOM_QFPROM=y
|
||||||
|
CONFIG_INTERCONNECT=y
|
||||||
|
CONFIG_INTERCONNECT_QCOM=y
|
||||||
|
CONFIG_INTERCONNECT_QCOM_MSM8974=m
|
||||||
|
--- a/arch/arm64/configs/defconfig
|
||||||
|
+++ b/arch/arm64/configs/defconfig
|
||||||
|
@@ -1022,11 +1022,11 @@ CONFIG_QCOM_L2_PMU=y
|
||||||
|
CONFIG_QCOM_L3_PMU=y
|
||||||
|
CONFIG_NVMEM_IMX_OCOTP=y
|
||||||
|
CONFIG_NVMEM_IMX_OCOTP_SCU=y
|
||||||
|
-CONFIG_QCOM_QFPROM=y
|
||||||
|
-CONFIG_ROCKCHIP_EFUSE=y
|
||||||
|
+CONFIG_NVMEM_QCOM_QFPROM=y
|
||||||
|
+CONFIG_NVMEM_ROCKCHIP_EFUSE=y
|
||||||
|
CONFIG_NVMEM_SUNXI_SID=y
|
||||||
|
-CONFIG_UNIPHIER_EFUSE=y
|
||||||
|
-CONFIG_MESON_EFUSE=m
|
||||||
|
+CONFIG_NVMEM_UNIPHIER_EFUSE=y
|
||||||
|
+CONFIG_NVMEM_MESON_EFUSE=m
|
||||||
|
CONFIG_FPGA=y
|
||||||
|
CONFIG_FPGA_MGR_STRATIX10_SOC=m
|
||||||
|
CONFIG_FPGA_BRIDGE=m
|
||||||
|
--- a/drivers/cpufreq/Kconfig.arm
|
||||||
|
+++ b/drivers/cpufreq/Kconfig.arm
|
||||||
|
@@ -131,7 +131,7 @@ config ARM_OMAP2PLUS_CPUFREQ
|
||||||
|
config ARM_QCOM_CPUFREQ_NVMEM
|
||||||
|
tristate "Qualcomm nvmem based CPUFreq"
|
||||||
|
depends on ARCH_QCOM
|
||||||
|
- depends on QCOM_QFPROM
|
||||||
|
+ depends on NVMEM_QCOM_QFPROM
|
||||||
|
depends on QCOM_SMEM
|
||||||
|
select PM_OPP
|
||||||
|
help
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -52,7 +52,7 @@ config NVMEM_IMX_OCOTP_SCU
|
||||||
|
This is a driver for the SCU On-Chip OTP Controller (OCOTP)
|
||||||
|
available on i.MX8 SoCs.
|
||||||
|
|
||||||
|
-config JZ4780_EFUSE
|
||||||
|
+config NVMEM_JZ4780_EFUSE
|
||||||
|
tristate "JZ4780 EFUSE Memory Support"
|
||||||
|
depends on MACH_INGENIC || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -96,7 +96,7 @@ config NVMEM_MXS_OCOTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-mxs-ocotp.
|
||||||
|
|
||||||
|
-config MTK_EFUSE
|
||||||
|
+config NVMEM_MTK_EFUSE
|
||||||
|
tristate "Mediatek SoCs EFUSE support"
|
||||||
|
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -107,7 +107,7 @@ config MTK_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called efuse-mtk.
|
||||||
|
|
||||||
|
-config MICROCHIP_OTPC
|
||||||
|
+config NVMEM_MICROCHIP_OTPC
|
||||||
|
tristate "Microchip OTPC support"
|
||||||
|
depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
help
|
||||||
|
@@ -126,7 +126,7 @@ config NVMEM_NINTENDO_OTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-nintendo-otp.
|
||||||
|
|
||||||
|
-config QCOM_QFPROM
|
||||||
|
+config NVMEM_QCOM_QFPROM
|
||||||
|
tristate "QCOM QFPROM Support"
|
||||||
|
depends on ARCH_QCOM || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -145,7 +145,7 @@ config NVMEM_SPMI_SDAM
|
||||||
|
Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||||
|
an interface to read/write to the SDAM module's shared memory.
|
||||||
|
|
||||||
|
-config ROCKCHIP_EFUSE
|
||||||
|
+config NVMEM_ROCKCHIP_EFUSE
|
||||||
|
tristate "Rockchip eFuse Support"
|
||||||
|
depends on ARCH_ROCKCHIP || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -156,7 +156,7 @@ config ROCKCHIP_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_rockchip_efuse.
|
||||||
|
|
||||||
|
-config ROCKCHIP_OTP
|
||||||
|
+config NVMEM_ROCKCHIP_OTP
|
||||||
|
tristate "Rockchip OTP controller support"
|
||||||
|
depends on ARCH_ROCKCHIP || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -199,7 +199,7 @@ config NVMEM_SUNXI_SID
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_sunxi_sid.
|
||||||
|
|
||||||
|
-config UNIPHIER_EFUSE
|
||||||
|
+config NVMEM_UNIPHIER_EFUSE
|
||||||
|
tristate "UniPhier SoCs eFuse support"
|
||||||
|
depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -221,7 +221,7 @@ config NVMEM_VF610_OCOTP
|
||||||
|
This driver can also be build as a module. If so, the module will
|
||||||
|
be called nvmem-vf610-ocotp.
|
||||||
|
|
||||||
|
-config MESON_EFUSE
|
||||||
|
+config NVMEM_MESON_EFUSE
|
||||||
|
tristate "Amlogic Meson GX eFuse Support"
|
||||||
|
depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||||
|
help
|
||||||
|
@@ -231,7 +231,7 @@ config MESON_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_meson_efuse.
|
||||||
|
|
||||||
|
-config MESON_MX_EFUSE
|
||||||
|
+config NVMEM_MESON_MX_EFUSE
|
||||||
|
tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||||
|
depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
help
|
||||||
|
@@ -251,13 +251,13 @@ config NVMEM_SNVS_LPGPR
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-snvs-lpgpr.
|
||||||
|
|
||||||
|
-config RAVE_SP_EEPROM
|
||||||
|
+config NVMEM_RAVE_SP_EEPROM
|
||||||
|
tristate "Rave SP EEPROM Support"
|
||||||
|
depends on RAVE_SP_CORE
|
||||||
|
help
|
||||||
|
Say y here to enable Rave SP EEPROM support.
|
||||||
|
|
||||||
|
-config SC27XX_EFUSE
|
||||||
|
+config NVMEM_SC27XX_EFUSE
|
||||||
|
tristate "Spreadtrum SC27XX eFuse Support"
|
||||||
|
depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -278,7 +278,7 @@ config NVMEM_ZYNQMP
|
||||||
|
|
||||||
|
If sure, say yes. If unsure, say no.
|
||||||
|
|
||||||
|
-config SPRD_EFUSE
|
||||||
|
+config NVMEM_SPRD_EFUSE
|
||||||
|
tristate "Spreadtrum SoC eFuse Support"
|
||||||
|
depends on ARCH_SPRD || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -15,7 +15,7 @@ obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-i
|
||||||
|
nvmem-imx-ocotp-y := imx-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o
|
||||||
|
nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
-obj-$(CONFIG_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||||
|
nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||||
|
@@ -25,37 +25,37 @@ obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-m
|
||||||
|
nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||||
|
nvmem-nintendo-otp-y := nintendo-otp.o
|
||||||
|
-obj-$(CONFIG_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||||
|
nvmem_mtk-efuse-y := mtk-efuse.o
|
||||||
|
-obj-$(CONFIG_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
nvmem_qfprom-y := qfprom.o
|
||||||
|
obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||||
|
nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||||
|
-obj-$(CONFIG_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||||
|
nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||||
|
-obj-$(CONFIG_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||||
|
nvmem-rockchip-otp-y := rockchip-otp.o
|
||||||
|
obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||||
|
nvmem_stm32_romem-y := stm32-romem.o
|
||||||
|
obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||||
|
nvmem_sunxi_sid-y := sunxi_sid.o
|
||||||
|
-obj-$(CONFIG_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||||
|
nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||||
|
-obj-$(CONFIG_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
nvmem_meson_efuse-y := meson-efuse.o
|
||||||
|
-obj-$(CONFIG_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||||
|
nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||||
|
-obj-$(CONFIG_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||||
|
-obj-$(CONFIG_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||||
|
nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||||
|
nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||||
|
-obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
nvmem_sprd_efuse-y := sprd-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||||
|
nvmem-rmem-y := rmem.o
|
||||||
|
@@ -67,7 +67,7 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm
|
||||||
|
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
-obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
|
nvmem_u-boot-env-y := u-boot-env.o
|
||||||
|
--- a/drivers/thermal/qcom/Kconfig
|
||||||
|
+++ b/drivers/thermal/qcom/Kconfig
|
||||||
|
@@ -1,7 +1,7 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
config QCOM_TSENS
|
||||||
|
tristate "Qualcomm TSENS Temperature Alarm"
|
||||||
|
- depends on QCOM_QFPROM
|
||||||
|
+ depends on NVMEM_QCOM_QFPROM
|
||||||
|
depends on ARCH_QCOM || COMPILE_TEST
|
||||||
|
help
|
||||||
|
This enables the thermal sysfs driver for the TSENS device. It shows
|
@ -0,0 +1,535 @@
|
|||||||
|
From a06d9e5a63b7c2f622c908cd9600ce735e70f7c6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:55 +0100
|
||||||
|
Subject: [PATCH] nvmem: sort config symbols alphabetically
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
1. Match what most subsystems do
|
||||||
|
2. Simplify maintenance a bit
|
||||||
|
3. Reduce amount of conflicts for new drivers patches
|
||||||
|
|
||||||
|
While at it unify indent level in Makefile.
|
||||||
|
|
||||||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-9-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 300 +++++++++++++++++++++--------------------
|
||||||
|
drivers/nvmem/Makefile | 114 ++++++++--------
|
||||||
|
2 files changed, 208 insertions(+), 206 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -21,6 +21,40 @@ config NVMEM_SYSFS
|
||||||
|
This interface is mostly used by userspace applications to
|
||||||
|
read/write directly into nvmem.
|
||||||
|
|
||||||
|
+# Devices
|
||||||
|
+
|
||||||
|
+config NVMEM_APPLE_EFUSES
|
||||||
|
+ tristate "Apple eFuse support"
|
||||||
|
+ depends on ARCH_APPLE || COMPILE_TEST
|
||||||
|
+ default ARCH_APPLE
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable support for reading eFuses on Apple SoCs
|
||||||
|
+ such as the M1. These are e.g. used to store factory programmed
|
||||||
|
+ calibration data required for the PCIe or the USB-C PHY.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module will
|
||||||
|
+ be called nvmem-apple-efuses.
|
||||||
|
+
|
||||||
|
+config NVMEM_BCM_OCOTP
|
||||||
|
+ tristate "Broadcom On-Chip OTP Controller support"
|
||||||
|
+ depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ default ARCH_BCM_IPROC
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable read/write access to the Broadcom OTP
|
||||||
|
+ controller.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-bcm-ocotp.
|
||||||
|
+
|
||||||
|
+config NVMEM_BRCM_NVRAM
|
||||||
|
+ tristate "Broadcom's NVRAM support"
|
||||||
|
+ depends on ARCH_BCM_5301X || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver provides support for Broadcom's NVRAM that can be accessed
|
||||||
|
+ using I/O mapping.
|
||||||
|
+
|
||||||
|
config NVMEM_IMX_IIM
|
||||||
|
tristate "i.MX IC Identification Module support"
|
||||||
|
depends on ARCH_MXC || COMPILE_TEST
|
||||||
|
@@ -64,6 +98,19 @@ config NVMEM_JZ4780_EFUSE
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called nvmem_jz4780_efuse.
|
||||||
|
|
||||||
|
+config NVMEM_LAYERSCAPE_SFP
|
||||||
|
+ tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
+ depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ select REGMAP_MMIO
|
||||||
|
+ help
|
||||||
|
+ This driver provides support to read the eFuses on Freescale
|
||||||
|
+ Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
+ unique ID there.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called layerscape-sfp.
|
||||||
|
+
|
||||||
|
config NVMEM_LPC18XX_EEPROM
|
||||||
|
tristate "NXP LPC18XX EEPROM Memory Support"
|
||||||
|
depends on ARCH_LPC18XX || COMPILE_TEST
|
||||||
|
@@ -84,17 +131,32 @@ config NVMEM_LPC18XX_OTP
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called nvmem_lpc18xx_otp.
|
||||||
|
|
||||||
|
-config NVMEM_MXS_OCOTP
|
||||||
|
- tristate "Freescale MXS On-Chip OTP Memory Support"
|
||||||
|
- depends on ARCH_MXS || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
+config NVMEM_MESON_EFUSE
|
||||||
|
+ tristate "Amlogic Meson GX eFuse Support"
|
||||||
|
+ depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||||
|
help
|
||||||
|
- If you say Y here, you will get readonly access to the
|
||||||
|
- One Time Programmable memory pages that are stored
|
||||||
|
- on the Freescale i.MX23/i.MX28 processor.
|
||||||
|
+ This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
+ the Amlogic Meson GX SoCs.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-mxs-ocotp.
|
||||||
|
+ will be called nvmem_meson_efuse.
|
||||||
|
+
|
||||||
|
+config NVMEM_MESON_MX_EFUSE
|
||||||
|
+ tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||||
|
+ depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
+ help
|
||||||
|
+ This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
+ the Amlogic Meson6, Meson8 and Meson8b SoCs.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem_meson_mx_efuse.
|
||||||
|
+
|
||||||
|
+config NVMEM_MICROCHIP_OTPC
|
||||||
|
+ tristate "Microchip OTPC support"
|
||||||
|
+ depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
+ help
|
||||||
|
+ This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
+ SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
|
||||||
|
config NVMEM_MTK_EFUSE
|
||||||
|
tristate "Mediatek SoCs EFUSE support"
|
||||||
|
@@ -107,12 +169,17 @@ config NVMEM_MTK_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called efuse-mtk.
|
||||||
|
|
||||||
|
-config NVMEM_MICROCHIP_OTPC
|
||||||
|
- tristate "Microchip OTPC support"
|
||||||
|
- depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
+config NVMEM_MXS_OCOTP
|
||||||
|
+ tristate "Freescale MXS On-Chip OTP Memory Support"
|
||||||
|
+ depends on ARCH_MXS || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
help
|
||||||
|
- This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
- SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
+ If you say Y here, you will get readonly access to the
|
||||||
|
+ One Time Programmable memory pages that are stored
|
||||||
|
+ on the Freescale i.MX23/i.MX28 processor.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-mxs-ocotp.
|
||||||
|
|
||||||
|
config NVMEM_NINTENDO_OTP
|
||||||
|
tristate "Nintendo Wii and Wii U OTP Support"
|
||||||
|
@@ -137,13 +204,21 @@ config NVMEM_QCOM_QFPROM
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_qfprom.
|
||||||
|
|
||||||
|
-config NVMEM_SPMI_SDAM
|
||||||
|
- tristate "SPMI SDAM Support"
|
||||||
|
- depends on SPMI
|
||||||
|
+config NVMEM_RAVE_SP_EEPROM
|
||||||
|
+ tristate "Rave SP EEPROM Support"
|
||||||
|
+ depends on RAVE_SP_CORE
|
||||||
|
help
|
||||||
|
- This driver supports the Shared Direct Access Memory Module on
|
||||||
|
- Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||||
|
- an interface to read/write to the SDAM module's shared memory.
|
||||||
|
+ Say y here to enable Rave SP EEPROM support.
|
||||||
|
+
|
||||||
|
+config NVMEM_RMEM
|
||||||
|
+ tristate "Reserved Memory Based Driver Support"
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver maps reserved memory into an nvmem device. It might be
|
||||||
|
+ useful to expose information left by firmware in memory.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-rmem.
|
||||||
|
|
||||||
|
config NVMEM_ROCKCHIP_EFUSE
|
||||||
|
tristate "Rockchip eFuse Support"
|
||||||
|
@@ -167,79 +242,16 @@ config NVMEM_ROCKCHIP_OTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_rockchip_otp.
|
||||||
|
|
||||||
|
-config NVMEM_BCM_OCOTP
|
||||||
|
- tristate "Broadcom On-Chip OTP Controller support"
|
||||||
|
- depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- default ARCH_BCM_IPROC
|
||||||
|
- help
|
||||||
|
- Say y here to enable read/write access to the Broadcom OTP
|
||||||
|
- controller.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-bcm-ocotp.
|
||||||
|
-
|
||||||
|
-config NVMEM_STM32_ROMEM
|
||||||
|
- tristate "STMicroelectronics STM32 factory-programmed memory support"
|
||||||
|
- depends on ARCH_STM32 || COMPILE_TEST
|
||||||
|
- help
|
||||||
|
- Say y here to enable read-only access for STMicroelectronics STM32
|
||||||
|
- factory-programmed memory area.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-stm32-romem.
|
||||||
|
-
|
||||||
|
-config NVMEM_SUNXI_SID
|
||||||
|
- tristate "Allwinner SoCs SID support"
|
||||||
|
- depends on ARCH_SUNXI
|
||||||
|
- help
|
||||||
|
- This is a driver for the 'security ID' available on various Allwinner
|
||||||
|
- devices.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem_sunxi_sid.
|
||||||
|
-
|
||||||
|
-config NVMEM_UNIPHIER_EFUSE
|
||||||
|
- tristate "UniPhier SoCs eFuse support"
|
||||||
|
- depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This is a simple driver to dump specified values of UniPhier SoC
|
||||||
|
- from eFuse.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-uniphier-efuse.
|
||||||
|
-
|
||||||
|
-config NVMEM_VF610_OCOTP
|
||||||
|
- tristate "VF610 SoC OCOTP support"
|
||||||
|
- depends on SOC_VF610 || COMPILE_TEST
|
||||||
|
+config NVMEM_SC27XX_EFUSE
|
||||||
|
+ tristate "Spreadtrum SC27XX eFuse Support"
|
||||||
|
+ depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
help
|
||||||
|
- This is a driver for the 'OCOTP' peripheral available on Vybrid
|
||||||
|
- devices like VF5xx and VF6xx.
|
||||||
|
-
|
||||||
|
- This driver can also be build as a module. If so, the module will
|
||||||
|
- be called nvmem-vf610-ocotp.
|
||||||
|
-
|
||||||
|
-config NVMEM_MESON_EFUSE
|
||||||
|
- tristate "Amlogic Meson GX eFuse Support"
|
||||||
|
- depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||||
|
- help
|
||||||
|
- This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
- the Amlogic Meson GX SoCs.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem_meson_efuse.
|
||||||
|
-
|
||||||
|
-config NVMEM_MESON_MX_EFUSE
|
||||||
|
- tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||||
|
- depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
- help
|
||||||
|
- This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
- the Amlogic Meson6, Meson8 and Meson8b SoCs.
|
||||||
|
+ This is a simple driver to dump specified values of Spreadtrum
|
||||||
|
+ SC27XX PMICs from eFuse.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem_meson_mx_efuse.
|
||||||
|
+ will be called nvmem-sc27xx-efuse.
|
||||||
|
|
||||||
|
config NVMEM_SNVS_LPGPR
|
||||||
|
tristate "Support for Low Power General Purpose Register"
|
||||||
|
@@ -251,32 +263,13 @@ config NVMEM_SNVS_LPGPR
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-snvs-lpgpr.
|
||||||
|
|
||||||
|
-config NVMEM_RAVE_SP_EEPROM
|
||||||
|
- tristate "Rave SP EEPROM Support"
|
||||||
|
- depends on RAVE_SP_CORE
|
||||||
|
- help
|
||||||
|
- Say y here to enable Rave SP EEPROM support.
|
||||||
|
-
|
||||||
|
-config NVMEM_SC27XX_EFUSE
|
||||||
|
- tristate "Spreadtrum SC27XX eFuse Support"
|
||||||
|
- depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This is a simple driver to dump specified values of Spreadtrum
|
||||||
|
- SC27XX PMICs from eFuse.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-sc27xx-efuse.
|
||||||
|
-
|
||||||
|
-config NVMEM_ZYNQMP
|
||||||
|
- bool "Xilinx ZYNQMP SoC nvmem firmware support"
|
||||||
|
- depends on ARCH_ZYNQMP
|
||||||
|
+config NVMEM_SPMI_SDAM
|
||||||
|
+ tristate "SPMI SDAM Support"
|
||||||
|
+ depends on SPMI
|
||||||
|
help
|
||||||
|
- This is a driver to access hardware related data like
|
||||||
|
- soc revision, IDCODE... etc by using the firmware
|
||||||
|
- interface.
|
||||||
|
-
|
||||||
|
- If sure, say yes. If unsure, say no.
|
||||||
|
+ This driver supports the Shared Direct Access Memory Module on
|
||||||
|
+ Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||||
|
+ an interface to read/write to the SDAM module's shared memory.
|
||||||
|
|
||||||
|
config NVMEM_SPRD_EFUSE
|
||||||
|
tristate "Spreadtrum SoC eFuse Support"
|
||||||
|
@@ -289,36 +282,15 @@ config NVMEM_SPRD_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-sprd-efuse.
|
||||||
|
|
||||||
|
-config NVMEM_RMEM
|
||||||
|
- tristate "Reserved Memory Based Driver Support"
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This driver maps reserved memory into an nvmem device. It might be
|
||||||
|
- useful to expose information left by firmware in memory.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-rmem.
|
||||||
|
-
|
||||||
|
-config NVMEM_BRCM_NVRAM
|
||||||
|
- tristate "Broadcom's NVRAM support"
|
||||||
|
- depends on ARCH_BCM_5301X || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This driver provides support for Broadcom's NVRAM that can be accessed
|
||||||
|
- using I/O mapping.
|
||||||
|
-
|
||||||
|
-config NVMEM_LAYERSCAPE_SFP
|
||||||
|
- tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
- depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- select REGMAP_MMIO
|
||||||
|
+config NVMEM_STM32_ROMEM
|
||||||
|
+ tristate "STMicroelectronics STM32 factory-programmed memory support"
|
||||||
|
+ depends on ARCH_STM32 || COMPILE_TEST
|
||||||
|
help
|
||||||
|
- This driver provides support to read the eFuses on Freescale
|
||||||
|
- Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
- unique ID there.
|
||||||
|
+ Say y here to enable read-only access for STMicroelectronics STM32
|
||||||
|
+ factory-programmed memory area.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
- will be called layerscape-sfp.
|
||||||
|
+ will be called nvmem-stm32-romem.
|
||||||
|
|
||||||
|
config NVMEM_SUNPLUS_OCOTP
|
||||||
|
tristate "Sunplus SoC OTP support"
|
||||||
|
@@ -332,17 +304,15 @@ config NVMEM_SUNPLUS_OCOTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-sunplus-ocotp.
|
||||||
|
|
||||||
|
-config NVMEM_APPLE_EFUSES
|
||||||
|
- tristate "Apple eFuse support"
|
||||||
|
- depends on ARCH_APPLE || COMPILE_TEST
|
||||||
|
- default ARCH_APPLE
|
||||||
|
+config NVMEM_SUNXI_SID
|
||||||
|
+ tristate "Allwinner SoCs SID support"
|
||||||
|
+ depends on ARCH_SUNXI
|
||||||
|
help
|
||||||
|
- Say y here to enable support for reading eFuses on Apple SoCs
|
||||||
|
- such as the M1. These are e.g. used to store factory programmed
|
||||||
|
- calibration data required for the PCIe or the USB-C PHY.
|
||||||
|
+ This is a driver for the 'security ID' available on various Allwinner
|
||||||
|
+ devices.
|
||||||
|
|
||||||
|
- This driver can also be built as a module. If so, the module will
|
||||||
|
- be called nvmem-apple-efuses.
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem_sunxi_sid.
|
||||||
|
|
||||||
|
config NVMEM_U_BOOT_ENV
|
||||||
|
tristate "U-Boot environment variables support"
|
||||||
|
@@ -357,4 +327,36 @@ config NVMEM_U_BOOT_ENV
|
||||||
|
|
||||||
|
If compiled as module it will be called nvmem_u-boot-env.
|
||||||
|
|
||||||
|
+config NVMEM_UNIPHIER_EFUSE
|
||||||
|
+ tristate "UniPhier SoCs eFuse support"
|
||||||
|
+ depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This is a simple driver to dump specified values of UniPhier SoC
|
||||||
|
+ from eFuse.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-uniphier-efuse.
|
||||||
|
+
|
||||||
|
+config NVMEM_VF610_OCOTP
|
||||||
|
+ tristate "VF610 SoC OCOTP support"
|
||||||
|
+ depends on SOC_VF610 || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This is a driver for the 'OCOTP' peripheral available on Vybrid
|
||||||
|
+ devices like VF5xx and VF6xx.
|
||||||
|
+
|
||||||
|
+ This driver can also be build as a module. If so, the module will
|
||||||
|
+ be called nvmem-vf610-ocotp.
|
||||||
|
+
|
||||||
|
+config NVMEM_ZYNQMP
|
||||||
|
+ bool "Xilinx ZYNQMP SoC nvmem firmware support"
|
||||||
|
+ depends on ARCH_ZYNQMP
|
||||||
|
+ help
|
||||||
|
+ This is a driver to access hardware related data like
|
||||||
|
+ soc revision, IDCODE... etc by using the firmware
|
||||||
|
+ interface.
|
||||||
|
+
|
||||||
|
+ If sure, say yes. If unsure, say no.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -7,67 +7,67 @@ obj-$(CONFIG_NVMEM) += nvmem_core.o
|
||||||
|
nvmem_core-y := core.o
|
||||||
|
|
||||||
|
# Devices
|
||||||
|
-obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o
|
||||||
|
-nvmem-bcm-ocotp-y := bcm-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o
|
||||||
|
-nvmem-imx-iim-y := imx-iim.o
|
||||||
|
-obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o
|
||||||
|
-nvmem-imx-ocotp-y := imx-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
+nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
+obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o
|
||||||
|
+nvmem-bcm-ocotp-y := bcm-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||||
|
+nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
+obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o
|
||||||
|
+nvmem-imx-iim-y := imx-iim.o
|
||||||
|
+obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o
|
||||||
|
+nvmem-imx-ocotp-y := imx-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o
|
||||||
|
-nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
-obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
-nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
+nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
+obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
+nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
+nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||||
|
-nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||||
|
-obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o
|
||||||
|
-nvmem_lpc18xx_otp-y := lpc18xx_otp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o
|
||||||
|
-nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||||
|
-nvmem-nintendo-otp-y := nintendo-otp.o
|
||||||
|
+nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o
|
||||||
|
+nvmem_lpc18xx_otp-y := lpc18xx_otp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
+nvmem_meson_efuse-y := meson-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
+nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
+nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||||
|
-nvmem_mtk-efuse-y := mtk-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
-nvmem_qfprom-y := qfprom.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||||
|
-nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||||
|
+nvmem_mtk-efuse-y := mtk-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o
|
||||||
|
+nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||||
|
+nvmem-nintendo-otp-y := nintendo-otp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
+nvmem_qfprom-y := qfprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
+nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||||
|
+nvmem-rmem-y := rmem.o
|
||||||
|
obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||||
|
-nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||||
|
+nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||||
|
-nvmem-rockchip-otp-y := rockchip-otp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||||
|
-nvmem_stm32_romem-y := stm32-romem.o
|
||||||
|
-obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||||
|
-nvmem_sunxi_sid-y := sunxi_sid.o
|
||||||
|
-obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
-nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||||
|
-nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
-nvmem_meson_efuse-y := meson-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
-nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||||
|
-nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||||
|
-obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
-nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||||
|
+nvmem-rockchip-otp-y := rockchip-otp.o
|
||||||
|
obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||||
|
-nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||||
|
-nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
-nvmem_sprd_efuse-y := sprd-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||||
|
-nvmem-rmem-y := rmem.o
|
||||||
|
-obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||||
|
-nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
-obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
-nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
+nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||||
|
+nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||||
|
+nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
+nvmem_sprd_efuse-y := sprd-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||||
|
+nvmem_stm32_romem-y := stm32-romem.o
|
||||||
|
obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||||
|
-nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
-nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
-nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
-obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
|
-nvmem_u-boot-env-y := u-boot-env.o
|
||||||
|
+nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||||
|
+nvmem_sunxi_sid-y := sunxi_sid.o
|
||||||
|
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
|
+nvmem_u-boot-env-y := u-boot-env.o
|
||||||
|
+obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
+nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||||
|
+nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||||
|
+nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
@ -1,6 +1,6 @@
|
|||||||
From d69efcf951df4dcc74a0e1554969c533aec8aa9b Mon Sep 17 00:00:00 2001
|
From d4d432670f7dee0a5432fcffcfc8699b25181ace Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Thu, 15 Sep 2022 22:06:29 +0200
|
Date: Fri, 16 Sep 2022 13:20:57 +0100
|
||||||
Subject: [PATCH] nvmem: u-boot-env: find Device Tree nodes for NVMEM cells
|
Subject: [PATCH] nvmem: u-boot-env: find Device Tree nodes for NVMEM cells
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -13,6 +13,8 @@ This allows NVMEM consumers to use U-Boot environment variables.
|
|||||||
|
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-11-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 1 +
|
drivers/nvmem/u-boot-env.c | 1 +
|
||||||
1 file changed, 1 insertion(+)
|
1 file changed, 1 insertion(+)
|
@ -0,0 +1,274 @@
|
|||||||
|
From 9e8f208ad5229ddda97cd4a83ecf89c735d99592 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:59 +0100
|
||||||
|
Subject: [PATCH] nvmem: lan9662-otp: add support
|
||||||
|
|
||||||
|
Add support for OTP controller available on LAN9662. The OTPC controls
|
||||||
|
the access to a non-volatile memory. The size of the memory is 8KB.
|
||||||
|
The OTPC can access the memory based on an offset.
|
||||||
|
Implement both the read and the write functionality.
|
||||||
|
|
||||||
|
Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-13-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 8 ++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/lan9662-otpc.c | 222 +++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 232 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/lan9662-otpc.c
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -98,6 +98,14 @@ config NVMEM_JZ4780_EFUSE
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called nvmem_jz4780_efuse.
|
||||||
|
|
||||||
|
+config NVMEM_LAN9662_OTPC
|
||||||
|
+ tristate "Microchip LAN9662 OTP controller support"
|
||||||
|
+ depends on SOC_LAN966 || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver enables the OTP controller available on Microchip LAN9662
|
||||||
|
+ SoCs. It controls the access to the OTP memory connected to it.
|
||||||
|
+
|
||||||
|
config NVMEM_LAYERSCAPE_SFP
|
||||||
|
tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -21,6 +21,8 @@ obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvm
|
||||||
|
nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LAN9662_OTPC) += nvmem-lan9662-otpc.o
|
||||||
|
+nvmem-lan9662-otpc-y := lan9662-otpc.o
|
||||||
|
obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/lan9662-otpc.c
|
||||||
|
@@ -0,0 +1,222 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+
|
||||||
|
+#include <linux/iopoll.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+#define OTP_OTP_PWR_DN(t) (t + 0x00)
|
||||||
|
+#define OTP_OTP_PWR_DN_OTP_PWRDN_N BIT(0)
|
||||||
|
+#define OTP_OTP_ADDR_HI(t) (t + 0x04)
|
||||||
|
+#define OTP_OTP_ADDR_LO(t) (t + 0x08)
|
||||||
|
+#define OTP_OTP_PRGM_DATA(t) (t + 0x10)
|
||||||
|
+#define OTP_OTP_PRGM_MODE(t) (t + 0x14)
|
||||||
|
+#define OTP_OTP_PRGM_MODE_OTP_PGM_MODE_BYTE BIT(0)
|
||||||
|
+#define OTP_OTP_RD_DATA(t) (t + 0x18)
|
||||||
|
+#define OTP_OTP_FUNC_CMD(t) (t + 0x20)
|
||||||
|
+#define OTP_OTP_FUNC_CMD_OTP_PROGRAM BIT(1)
|
||||||
|
+#define OTP_OTP_FUNC_CMD_OTP_READ BIT(0)
|
||||||
|
+#define OTP_OTP_CMD_GO(t) (t + 0x28)
|
||||||
|
+#define OTP_OTP_CMD_GO_OTP_GO BIT(0)
|
||||||
|
+#define OTP_OTP_PASS_FAIL(t) (t + 0x2c)
|
||||||
|
+#define OTP_OTP_PASS_FAIL_OTP_READ_PROHIBITED BIT(3)
|
||||||
|
+#define OTP_OTP_PASS_FAIL_OTP_WRITE_PROHIBITED BIT(2)
|
||||||
|
+#define OTP_OTP_PASS_FAIL_OTP_FAIL BIT(0)
|
||||||
|
+#define OTP_OTP_STATUS(t) (t + 0x30)
|
||||||
|
+#define OTP_OTP_STATUS_OTP_CPUMPEN BIT(1)
|
||||||
|
+#define OTP_OTP_STATUS_OTP_BUSY BIT(0)
|
||||||
|
+
|
||||||
|
+#define OTP_MEM_SIZE 8192
|
||||||
|
+#define OTP_SLEEP_US 10
|
||||||
|
+#define OTP_TIMEOUT_US 500000
|
||||||
|
+
|
||||||
|
+struct lan9662_otp {
|
||||||
|
+ struct device *dev;
|
||||||
|
+ void __iomem *base;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static bool lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ return readl_poll_timeout(reg, val, !(val & flag),
|
||||||
|
+ OTP_SLEEP_US, OTP_TIMEOUT_US);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_power(struct lan9662_otp *otp, bool up)
|
||||||
|
+{
|
||||||
|
+ void __iomem *pwrdn = OTP_OTP_PWR_DN(otp->base);
|
||||||
|
+
|
||||||
|
+ if (up) {
|
||||||
|
+ writel(readl(pwrdn) & ~OTP_OTP_PWR_DN_OTP_PWRDN_N, pwrdn);
|
||||||
|
+ if (lan9662_otp_wait_flag_clear(OTP_OTP_STATUS(otp->base),
|
||||||
|
+ OTP_OTP_STATUS_OTP_CPUMPEN))
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
+ } else {
|
||||||
|
+ writel(readl(pwrdn) | OTP_OTP_PWR_DN_OTP_PWRDN_N, pwrdn);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_execute(struct lan9662_otp *otp)
|
||||||
|
+{
|
||||||
|
+ if (lan9662_otp_wait_flag_clear(OTP_OTP_CMD_GO(otp->base),
|
||||||
|
+ OTP_OTP_CMD_GO_OTP_GO))
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
+
|
||||||
|
+ if (lan9662_otp_wait_flag_clear(OTP_OTP_STATUS(otp->base),
|
||||||
|
+ OTP_OTP_STATUS_OTP_BUSY))
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void lan9662_otp_set_address(struct lan9662_otp *otp, u32 offset)
|
||||||
|
+{
|
||||||
|
+ writel(0xff & (offset >> 8), OTP_OTP_ADDR_HI(otp->base));
|
||||||
|
+ writel(0xff & offset, OTP_OTP_ADDR_LO(otp->base));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_read_byte(struct lan9662_otp *otp, u32 offset, u8 *dst)
|
||||||
|
+{
|
||||||
|
+ u32 pass;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_set_address(otp, offset);
|
||||||
|
+ writel(OTP_OTP_FUNC_CMD_OTP_READ, OTP_OTP_FUNC_CMD(otp->base));
|
||||||
|
+ writel(OTP_OTP_CMD_GO_OTP_GO, OTP_OTP_CMD_GO(otp->base));
|
||||||
|
+ rc = lan9662_otp_execute(otp);
|
||||||
|
+ if (!rc) {
|
||||||
|
+ pass = readl(OTP_OTP_PASS_FAIL(otp->base));
|
||||||
|
+ if (pass & OTP_OTP_PASS_FAIL_OTP_READ_PROHIBITED)
|
||||||
|
+ return -EACCES;
|
||||||
|
+ *dst = (u8) readl(OTP_OTP_RD_DATA(otp->base));
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_write_byte(struct lan9662_otp *otp, u32 offset, u8 data)
|
||||||
|
+{
|
||||||
|
+ u32 pass;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_set_address(otp, offset);
|
||||||
|
+ writel(OTP_OTP_PRGM_MODE_OTP_PGM_MODE_BYTE, OTP_OTP_PRGM_MODE(otp->base));
|
||||||
|
+ writel(data, OTP_OTP_PRGM_DATA(otp->base));
|
||||||
|
+ writel(OTP_OTP_FUNC_CMD_OTP_PROGRAM, OTP_OTP_FUNC_CMD(otp->base));
|
||||||
|
+ writel(OTP_OTP_CMD_GO_OTP_GO, OTP_OTP_CMD_GO(otp->base));
|
||||||
|
+
|
||||||
|
+ rc = lan9662_otp_execute(otp);
|
||||||
|
+ if (!rc) {
|
||||||
|
+ pass = readl(OTP_OTP_PASS_FAIL(otp->base));
|
||||||
|
+ if (pass & OTP_OTP_PASS_FAIL_OTP_WRITE_PROHIBITED)
|
||||||
|
+ return -EACCES;
|
||||||
|
+ if (pass & OTP_OTP_PASS_FAIL_OTP_FAIL)
|
||||||
|
+ return -EIO;
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_read(void *context, unsigned int offset,
|
||||||
|
+ void *_val, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct lan9662_otp *otp = context;
|
||||||
|
+ u8 *val = _val;
|
||||||
|
+ uint8_t data;
|
||||||
|
+ int i, rc = 0;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_power(otp, true);
|
||||||
|
+ for (i = 0; i < bytes; i++) {
|
||||||
|
+ rc = lan9662_otp_read_byte(otp, offset + i, &data);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ break;
|
||||||
|
+ *val++ = data;
|
||||||
|
+ }
|
||||||
|
+ lan9662_otp_power(otp, false);
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_write(void *context, unsigned int offset,
|
||||||
|
+ void *_val, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct lan9662_otp *otp = context;
|
||||||
|
+ u8 *val = _val;
|
||||||
|
+ u8 data, newdata;
|
||||||
|
+ int i, rc = 0;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_power(otp, true);
|
||||||
|
+ for (i = 0; i < bytes; i++) {
|
||||||
|
+ /* Skip zero bytes */
|
||||||
|
+ if (val[i]) {
|
||||||
|
+ rc = lan9662_otp_read_byte(otp, offset + i, &data);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ newdata = data | val[i];
|
||||||
|
+ if (newdata == data)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ rc = lan9662_otp_write_byte(otp, offset + i,
|
||||||
|
+ newdata);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ lan9662_otp_power(otp, false);
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config otp_config = {
|
||||||
|
+ .name = "lan9662-otp",
|
||||||
|
+ .stride = 1,
|
||||||
|
+ .word_size = 1,
|
||||||
|
+ .reg_read = lan9662_otp_read,
|
||||||
|
+ .reg_write = lan9662_otp_write,
|
||||||
|
+ .size = OTP_MEM_SIZE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ struct lan9662_otp *otp;
|
||||||
|
+
|
||||||
|
+ otp = devm_kzalloc(&pdev->dev, sizeof(*otp), GFP_KERNEL);
|
||||||
|
+ if (!otp)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ otp->dev = dev;
|
||||||
|
+ otp->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(otp->base))
|
||||||
|
+ return PTR_ERR(otp->base);
|
||||||
|
+
|
||||||
|
+ otp_config.priv = otp;
|
||||||
|
+ otp_config.dev = dev;
|
||||||
|
+
|
||||||
|
+ nvmem = devm_nvmem_register(dev, &otp_config);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id lan9662_otp_match[] = {
|
||||||
|
+ { .compatible = "microchip,lan9662-otp", },
|
||||||
|
+ { },
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, lan9662_otp_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver lan9662_otp_driver = {
|
||||||
|
+ .probe = lan9662_otp_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "lan9662-otp",
|
||||||
|
+ .of_match_table = lan9662_otp_match,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_platform_driver(lan9662_otp_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Horatiu Vultur <horatiu.vultur@microchip.com>");
|
||||||
|
+MODULE_DESCRIPTION("lan9662 OTP driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -1,6 +1,6 @@
|
|||||||
From 60bbaad38109684b156e21112322e0a922f92cde Mon Sep 17 00:00:00 2001
|
From 3717ca3e0cc8683f93b41d3f06ca79631eb58715 Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Thu, 18 Aug 2022 06:38:37 +0200
|
Date: Fri, 16 Sep 2022 13:21:00 +0100
|
||||||
Subject: [PATCH] nvmem: u-boot-env: fix crc32 casting type
|
Subject: [PATCH] nvmem: u-boot-env: fix crc32 casting type
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -9,10 +9,12 @@ Content-Transfer-Encoding: 8bit
|
|||||||
This fixes:
|
This fixes:
|
||||||
drivers/nvmem/u-boot-env.c:141:17: sparse: sparse: cast to restricted __le32
|
drivers/nvmem/u-boot-env.c:141:17: sparse: sparse: cast to restricted __le32
|
||||||
|
|
||||||
|
Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables")
|
||||||
Reported-by: kernel test robot <lkp@intel.com>
|
Reported-by: kernel test robot <lkp@intel.com>
|
||||||
Fixes: f955dc1445069 ("nvmem: add driver handling U-Boot environment variables")
|
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-14-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 2 +-
|
drivers/nvmem/u-boot-env.c | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
@ -0,0 +1,34 @@
|
|||||||
|
From 1aeb122d214b92474c86fde00a03d6e2d69381b5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Date: Wed, 28 Sep 2022 21:51:12 +0200
|
||||||
|
Subject: [PATCH] nvmem: lan9662-otp: Fix compatible string
|
||||||
|
|
||||||
|
The device tree bindings for lan9662-otp expects the compatible string
|
||||||
|
to be one of following compatible strings:
|
||||||
|
microchip,lan9662-otpc
|
||||||
|
microchip,lan9668-otpc
|
||||||
|
|
||||||
|
The problem is that the lan9662-otp driver contains the
|
||||||
|
microchip,lan9662-otp compatible string instead of
|
||||||
|
microchip,lan9662-otpc.
|
||||||
|
Fix this by updating the compatible string in the driver.
|
||||||
|
|
||||||
|
Fixes: 9e8f208ad5229d ("nvmem: lan9662-otp: add support")
|
||||||
|
Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Link: https://lore.kernel.org/r/20220928195112.630351-1-horatiu.vultur@microchip.com
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/lan9662-otpc.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/lan9662-otpc.c
|
||||||
|
+++ b/drivers/nvmem/lan9662-otpc.c
|
||||||
|
@@ -203,7 +203,7 @@ static int lan9662_otp_probe(struct plat
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id lan9662_otp_match[] = {
|
||||||
|
- { .compatible = "microchip,lan9662-otp", },
|
||||||
|
+ { .compatible = "microchip,lan9662-otpc", },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, lan9662_otp_match);
|
@ -1,4 +1,4 @@
|
|||||||
From 7a69ff9c9bde03a690ea783970f664782fc303d8 Mon Sep 17 00:00:00 2001
|
From ee424f7d3960152f5f862bbb6943e59828dc7917 Mon Sep 17 00:00:00 2001
|
||||||
From: Christian Lamparter <chunkeey@gmail.com>
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
Date: Fri, 4 Nov 2022 17:52:03 +0100
|
Date: Fri, 4 Nov 2022 17:52:03 +0100
|
||||||
Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant
|
Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant
|
||||||
@ -37,8 +37,11 @@ crc32 sum... which is unfortunate :(
|
|||||||
|
|
|
|
||||||
|
|
||||||
[0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951
|
[0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951
|
||||||
|
|
||||||
Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables")
|
Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables")
|
||||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/70a16eae113e08db2390b76e174f4837caa135c3.1667580636.git.chunkeey@gmail.com
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 2 +-
|
drivers/nvmem/u-boot-env.c | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
@ -0,0 +1,36 @@
|
|||||||
|
From 58e92c4a496b27156020a59a98c7f4a92c2b1533 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Wei Yongjun <weiyongjun1@huawei.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:38:38 +0000
|
||||||
|
Subject: [PATCH] nvmem: rmem: Fix return value check in rmem_read()
|
||||||
|
|
||||||
|
In case of error, the function memremap() returns NULL pointer
|
||||||
|
not ERR_PTR(). The IS_ERR() test in the return value check
|
||||||
|
should be replaced with NULL test.
|
||||||
|
|
||||||
|
Fixes: 5a3fa75a4d9c ("nvmem: Add driver to expose reserved memory as nvmem")
|
||||||
|
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Cc: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||||
|
Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
|
||||||
|
Acked-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de>
|
||||||
|
Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063840.6357-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/rmem.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/rmem.c
|
||||||
|
+++ b/drivers/nvmem/rmem.c
|
||||||
|
@@ -37,9 +37,9 @@ static int rmem_read(void *context, unsi
|
||||||
|
* but as of Dec 2020 this isn't possible on arm64.
|
||||||
|
*/
|
||||||
|
addr = memremap(priv->mem->base, available, MEMREMAP_WB);
|
||||||
|
- if (IS_ERR(addr)) {
|
||||||
|
+ if (!addr) {
|
||||||
|
dev_err(priv->dev, "Failed to remap memory region\n");
|
||||||
|
- return PTR_ERR(addr);
|
||||||
|
+ return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
count = memory_read_from_buffer(val, bytes, &off, addr, available);
|
@ -0,0 +1,35 @@
|
|||||||
|
From 022b68f271de0e53024e6d5e96fee8e76d25eb95 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:38:40 +0000
|
||||||
|
Subject: [PATCH] nvmem: lan9662-otp: Change return type of
|
||||||
|
lan9662_otp_wait_flag_clear()
|
||||||
|
|
||||||
|
The blamed commit introduced the following smatch warning in the
|
||||||
|
function lan9662_otp_wait_flag_clear:
|
||||||
|
drivers/nvmem/lan9662-otpc.c:43 lan9662_otp_wait_flag_clear() warn: signedness bug returning '(-110)'
|
||||||
|
|
||||||
|
Fix this by changing the return type of the function
|
||||||
|
lan9662_otp_wait_flag_clear() to be int instead of bool.
|
||||||
|
|
||||||
|
Fixes: 9e8f208ad5229d ("nvmem: lan9662-otp: add support")
|
||||||
|
Reported-by: kernel test robot <lkp@intel.com>
|
||||||
|
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||||
|
Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063840.6357-5-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/lan9662-otpc.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/lan9662-otpc.c
|
||||||
|
+++ b/drivers/nvmem/lan9662-otpc.c
|
||||||
|
@@ -36,7 +36,7 @@ struct lan9662_otp {
|
||||||
|
void __iomem *base;
|
||||||
|
};
|
||||||
|
|
||||||
|
-static bool lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag)
|
||||||
|
+static int lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
@ -0,0 +1,82 @@
|
|||||||
|
From fbfc4ca465a1f8d81bf2d67d95bf7fc67c3cf0c2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:20 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: move STM32MP15_BSEC_NUM_LOWER in config
|
||||||
|
|
||||||
|
Support STM32MP15_BSEC_NUM_LOWER in stm32 romem config to prepare
|
||||||
|
the next SoC in STM32MP family.
|
||||||
|
|
||||||
|
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 21 ++++++++++++++++-----
|
||||||
|
1 file changed, 16 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -22,16 +22,15 @@
|
||||||
|
/* shadow registers offest */
|
||||||
|
#define STM32MP15_BSEC_DATA0 0x200
|
||||||
|
|
||||||
|
-/* 32 (x 32-bits) lower shadow registers */
|
||||||
|
-#define STM32MP15_BSEC_NUM_LOWER 32
|
||||||
|
-
|
||||||
|
struct stm32_romem_cfg {
|
||||||
|
int size;
|
||||||
|
+ u8 lower;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_romem_priv {
|
||||||
|
void __iomem *base;
|
||||||
|
struct nvmem_config cfg;
|
||||||
|
+ u8 lower;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int stm32_romem_read(void *context, unsigned int offset, void *buf,
|
||||||
|
@@ -85,7 +84,7 @@ static int stm32_bsec_read(void *context
|
||||||
|
for (i = roffset; (i < roffset + rbytes); i += 4) {
|
||||||
|
u32 otp = i >> 2;
|
||||||
|
|
||||||
|
- if (otp < STM32MP15_BSEC_NUM_LOWER) {
|
||||||
|
+ if (otp < priv->lower) {
|
||||||
|
/* read lower data from shadow registers */
|
||||||
|
val = readl_relaxed(
|
||||||
|
priv->base + STM32MP15_BSEC_DATA0 + i);
|
||||||
|
@@ -159,6 +158,8 @@ static int stm32_romem_probe(struct plat
|
||||||
|
priv->cfg.priv = priv;
|
||||||
|
priv->cfg.owner = THIS_MODULE;
|
||||||
|
|
||||||
|
+ priv->lower = 0;
|
||||||
|
+
|
||||||
|
cfg = (const struct stm32_romem_cfg *)
|
||||||
|
of_match_device(dev->driver->of_match_table, dev)->data;
|
||||||
|
if (!cfg) {
|
||||||
|
@@ -167,6 +168,7 @@ static int stm32_romem_probe(struct plat
|
||||||
|
priv->cfg.reg_read = stm32_romem_read;
|
||||||
|
} else {
|
||||||
|
priv->cfg.size = cfg->size;
|
||||||
|
+ priv->lower = cfg->lower;
|
||||||
|
priv->cfg.reg_read = stm32_bsec_read;
|
||||||
|
priv->cfg.reg_write = stm32_bsec_write;
|
||||||
|
}
|
||||||
|
@@ -174,8 +176,17 @@ static int stm32_romem_probe(struct plat
|
||||||
|
return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &priv->cfg));
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * STM32MP15 BSEC OTP regions: 4096 OTP bits (with 3072 effective bits)
|
||||||
|
+ * => 96 x 32-bits data words
|
||||||
|
+ * - Lower: 1K bits, 2:1 redundancy, incremental bit programming
|
||||||
|
+ * => 32 (x 32-bits) lower shadow registers = words 0 to 31
|
||||||
|
+ * - Upper: 2K bits, ECC protection, word programming only
|
||||||
|
+ * => 64 (x 32-bits) = words 32 to 95
|
||||||
|
+ */
|
||||||
|
static const struct stm32_romem_cfg stm32mp15_bsec_cfg = {
|
||||||
|
- .size = 384, /* 96 x 32-bits data words */
|
||||||
|
+ .size = 384,
|
||||||
|
+ .lower = 32,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id stm32_romem_of_match[] = {
|
@ -0,0 +1,34 @@
|
|||||||
|
From d61784e6410f3df2028e6eb91b06ffed37a660e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:21 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: add warning when upper OTPs are updated
|
||||||
|
|
||||||
|
As the upper OTPs are ECC protected, they support only one 32 bits word
|
||||||
|
programming.
|
||||||
|
For a second modification of this word, these ECC become invalid and
|
||||||
|
this OTP will be no more accessible, the shadowed value is invalid.
|
||||||
|
|
||||||
|
This patch adds a warning to indicate an upper OTP update, because this
|
||||||
|
operation is dangerous as OTP is not locked by the driver after the first
|
||||||
|
update to avoid a second update.
|
||||||
|
|
||||||
|
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -132,6 +132,9 @@ static int stm32_bsec_write(void *contex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (offset + bytes >= priv->lower * 4)
|
||||||
|
+ dev_warn(dev, "Update of upper OTPs with ECC protection (word programming, only once)\n");
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
From a3816a7d7c097c1da46aad5f5d1e229b607dce04 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:22 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: add nvmem type attribute
|
||||||
|
|
||||||
|
Inform NVMEM framework of type attribute for stm32-romem as NVMEM_TYPE_OTP
|
||||||
|
so userspace is able to know how the data is stored in BSEC.
|
||||||
|
|
||||||
|
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -160,6 +160,7 @@ static int stm32_romem_probe(struct plat
|
||||||
|
priv->cfg.dev = dev;
|
||||||
|
priv->cfg.priv = priv;
|
||||||
|
priv->cfg.owner = THIS_MODULE;
|
||||||
|
+ priv->cfg.type = NVMEM_TYPE_OTP;
|
||||||
|
|
||||||
|
priv->lower = 0;
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
From 06aac0e11960a7ddccc1888326b5906d017e0f24 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jiangshan Yi <yijiangshan@kylinos.cn>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:24 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: fix spelling typo in comment
|
||||||
|
|
||||||
|
Fix spelling typo in comment.
|
||||||
|
|
||||||
|
Reported-by: k2ci <kernel-bot@kylinos.cn>
|
||||||
|
Signed-off-by: Jiangshan Yi <yijiangshan@kylinos.cn>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-6-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -19,7 +19,7 @@
|
||||||
|
#define STM32_SMC_WRITE_SHADOW 0x03
|
||||||
|
#define STM32_SMC_READ_OTP 0x04
|
||||||
|
|
||||||
|
-/* shadow registers offest */
|
||||||
|
+/* shadow registers offset */
|
||||||
|
#define STM32MP15_BSEC_DATA0 0x200
|
||||||
|
|
||||||
|
struct stm32_romem_cfg {
|
@ -0,0 +1,27 @@
|
|||||||
|
From fb817c4ef63e8cfb6e77ae4a2875ae854c80708f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Colin Ian King <colin.i.king@gmail.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:26 +0000
|
||||||
|
Subject: [PATCH] nvmem: Kconfig: Fix spelling mistake "controlls" ->
|
||||||
|
"controls"
|
||||||
|
|
||||||
|
There is a spelling mistake in a Kconfig description. Fix it.
|
||||||
|
|
||||||
|
Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -164,7 +164,7 @@ config NVMEM_MICROCHIP_OTPC
|
||||||
|
depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
help
|
||||||
|
This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
- SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
+ SoCs. It controls the access to the OTP memory connected to it.
|
||||||
|
|
||||||
|
config NVMEM_MTK_EFUSE
|
||||||
|
tristate "Mediatek SoCs EFUSE support"
|
@ -1,6 +1,6 @@
|
|||||||
From 5b4eaafbeac472fc19049152f18e88aecb2b2829 Mon Sep 17 00:00:00 2001
|
From ada84d07af6097b2addd18262668ce6cb9e15206 Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Mon, 17 Oct 2022 09:17:22 +0200
|
Date: Fri, 18 Nov 2022 06:39:27 +0000
|
||||||
Subject: [PATCH] nvmem: u-boot-env: add Broadcom format support
|
Subject: [PATCH] nvmem: u-boot-env: add Broadcom format support
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -15,6 +15,8 @@ Add support for Broadcom's specific binding and their custom format.
|
|||||||
Ref: 6b0584c19d87 ("dt-bindings: nvmem: u-boot,env: add Broadcom's variant binding")
|
Ref: 6b0584c19d87 ("dt-bindings: nvmem: u-boot,env: add Broadcom's variant binding")
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-9-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 14 ++++++++++++++
|
drivers/nvmem/u-boot-env.c | 14 ++++++++++++++
|
||||||
1 file changed, 14 insertions(+)
|
1 file changed, 14 insertions(+)
|
@ -36,7 +36,7 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|||||||
|
|
||||||
--- a/drivers/nvmem/u-boot-env.c
|
--- a/drivers/nvmem/u-boot-env.c
|
||||||
+++ b/drivers/nvmem/u-boot-env.c
|
+++ b/drivers/nvmem/u-boot-env.c
|
||||||
@@ -143,7 +143,7 @@ static int u_boot_env_parse(struct u_boo
|
@@ -156,7 +156,7 @@ static int u_boot_env_parse(struct u_boo
|
||||||
crc32_data_len = priv->mtd->size - crc32_data_offset;
|
crc32_data_len = priv->mtd->size - crc32_data_offset;
|
||||||
data_len = priv->mtd->size - data_offset;
|
data_len = priv->mtd->size - data_offset;
|
||||||
|
|
@ -0,0 +1,456 @@
|
|||||||
|
From 7ae6478b304bc004c3139b422665b0e23b57f05c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Wed, 13 Oct 2021 14:19:55 +0100
|
||||||
|
Subject: [PATCH] nvmem: core: rework nvmem cell instance creation
|
||||||
|
|
||||||
|
In the existing design, we do not create a instance per nvmem cell consumer
|
||||||
|
but we directly refer cell from nvmem cell list that are added to provider.
|
||||||
|
|
||||||
|
However this design has some limitations when consumers want to assign name
|
||||||
|
or connection id the nvmem cell instance, ex: via "nvmem-cell-names" or
|
||||||
|
id in nvmem_cell_get(id).
|
||||||
|
|
||||||
|
Having a name associated with nvmem cell consumer instance will help
|
||||||
|
provider drivers in performing post processing of nvmem cell data if required
|
||||||
|
before data is seen by the consumers. This is pretty normal with some vendors
|
||||||
|
storing nvmem cells like mac-address in a vendor specific data layouts that
|
||||||
|
are not directly usable by the consumer drivers.
|
||||||
|
|
||||||
|
With this patch nvmem cell will be created dynamically during nvmem_cell_get
|
||||||
|
and destroyed in nvmem_cell_put, allowing consumers to associate name with
|
||||||
|
nvmem cell consumer instance.
|
||||||
|
|
||||||
|
With this patch a new struct nvmem_cell_entry replaces struct nvmem_cell
|
||||||
|
for storing nvmem cell information within the core.
|
||||||
|
This patch does not change nvmem-consumer interface based on nvmem_cell.
|
||||||
|
|
||||||
|
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20211013131957.30271-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 165 +++++++++++++++++++++++++++----------------
|
||||||
|
1 file changed, 105 insertions(+), 60 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -45,8 +45,7 @@ struct nvmem_device {
|
||||||
|
#define to_nvmem_device(d) container_of(d, struct nvmem_device, dev)
|
||||||
|
|
||||||
|
#define FLAG_COMPAT BIT(0)
|
||||||
|
-
|
||||||
|
-struct nvmem_cell {
|
||||||
|
+struct nvmem_cell_entry {
|
||||||
|
const char *name;
|
||||||
|
int offset;
|
||||||
|
int bytes;
|
||||||
|
@@ -57,6 +56,11 @@ struct nvmem_cell {
|
||||||
|
struct list_head node;
|
||||||
|
};
|
||||||
|
|
||||||
|
+struct nvmem_cell {
|
||||||
|
+ struct nvmem_cell_entry *entry;
|
||||||
|
+ const char *id;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static DEFINE_MUTEX(nvmem_mutex);
|
||||||
|
static DEFINE_IDA(nvmem_ida);
|
||||||
|
|
||||||
|
@@ -424,7 +428,7 @@ static struct bus_type nvmem_bus_type =
|
||||||
|
.name = "nvmem",
|
||||||
|
};
|
||||||
|
|
||||||
|
-static void nvmem_cell_drop(struct nvmem_cell *cell)
|
||||||
|
+static void nvmem_cell_entry_drop(struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell);
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
@@ -437,13 +441,13 @@ static void nvmem_cell_drop(struct nvmem
|
||||||
|
|
||||||
|
static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell *cell, *p;
|
||||||
|
+ struct nvmem_cell_entry *cell, *p;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(cell, p, &nvmem->cells, node)
|
||||||
|
- nvmem_cell_drop(cell);
|
||||||
|
+ nvmem_cell_entry_drop(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void nvmem_cell_add(struct nvmem_cell *cell)
|
||||||
|
+static void nvmem_cell_entry_add(struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
list_add_tail(&cell->node, &cell->nvmem->cells);
|
||||||
|
@@ -451,9 +455,9 @@ static void nvmem_cell_add(struct nvmem_
|
||||||
|
blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int nvmem_cell_info_to_nvmem_cell_nodup(struct nvmem_device *nvmem,
|
||||||
|
- const struct nvmem_cell_info *info,
|
||||||
|
- struct nvmem_cell *cell)
|
||||||
|
+static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem,
|
||||||
|
+ const struct nvmem_cell_info *info,
|
||||||
|
+ struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
cell->nvmem = nvmem;
|
||||||
|
cell->offset = info->offset;
|
||||||
|
@@ -477,13 +481,13 @@ static int nvmem_cell_info_to_nvmem_cell
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem,
|
||||||
|
- const struct nvmem_cell_info *info,
|
||||||
|
- struct nvmem_cell *cell)
|
||||||
|
+static int nvmem_cell_info_to_nvmem_cell_entry(struct nvmem_device *nvmem,
|
||||||
|
+ const struct nvmem_cell_info *info,
|
||||||
|
+ struct nvmem_cell_entry *cell)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
- err = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, cell);
|
||||||
|
+ err = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, cell);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
@@ -507,7 +511,7 @@ static int nvmem_add_cells(struct nvmem_
|
||||||
|
const struct nvmem_cell_info *info,
|
||||||
|
int ncells)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell **cells;
|
||||||
|
+ struct nvmem_cell_entry **cells;
|
||||||
|
int i, rval;
|
||||||
|
|
||||||
|
cells = kcalloc(ncells, sizeof(*cells), GFP_KERNEL);
|
||||||
|
@@ -521,13 +525,13 @@ static int nvmem_add_cells(struct nvmem_
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]);
|
||||||
|
+ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, &info[i], cells[i]);
|
||||||
|
if (rval) {
|
||||||
|
kfree(cells[i]);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nvmem_cell_add(cells[i]);
|
||||||
|
+ nvmem_cell_entry_add(cells[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* remove tmp array */
|
||||||
|
@@ -536,7 +540,7 @@ static int nvmem_add_cells(struct nvmem_
|
||||||
|
return 0;
|
||||||
|
err:
|
||||||
|
while (i--)
|
||||||
|
- nvmem_cell_drop(cells[i]);
|
||||||
|
+ nvmem_cell_entry_drop(cells[i]);
|
||||||
|
|
||||||
|
kfree(cells);
|
||||||
|
|
||||||
|
@@ -573,7 +577,7 @@ static int nvmem_add_cells_from_table(st
|
||||||
|
{
|
||||||
|
const struct nvmem_cell_info *info;
|
||||||
|
struct nvmem_cell_table *table;
|
||||||
|
- struct nvmem_cell *cell;
|
||||||
|
+ struct nvmem_cell_entry *cell;
|
||||||
|
int rval = 0, i;
|
||||||
|
|
||||||
|
mutex_lock(&nvmem_cell_mutex);
|
||||||
|
@@ -588,15 +592,13 @@ static int nvmem_add_cells_from_table(st
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- rval = nvmem_cell_info_to_nvmem_cell(nvmem,
|
||||||
|
- info,
|
||||||
|
- cell);
|
||||||
|
+ rval = nvmem_cell_info_to_nvmem_cell_entry(nvmem, info, cell);
|
||||||
|
if (rval) {
|
||||||
|
kfree(cell);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
- nvmem_cell_add(cell);
|
||||||
|
+ nvmem_cell_entry_add(cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -606,10 +608,10 @@ out:
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static struct nvmem_cell *
|
||||||
|
-nvmem_find_cell_by_name(struct nvmem_device *nvmem, const char *cell_id)
|
||||||
|
+static struct nvmem_cell_entry *
|
||||||
|
+nvmem_find_cell_entry_by_name(struct nvmem_device *nvmem, const char *cell_id)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell *iter, *cell = NULL;
|
||||||
|
+ struct nvmem_cell_entry *iter, *cell = NULL;
|
||||||
|
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
list_for_each_entry(iter, &nvmem->cells, node) {
|
||||||
|
@@ -680,7 +682,7 @@ static int nvmem_add_cells_from_of(struc
|
||||||
|
{
|
||||||
|
struct device_node *parent, *child;
|
||||||
|
struct device *dev = &nvmem->dev;
|
||||||
|
- struct nvmem_cell *cell;
|
||||||
|
+ struct nvmem_cell_entry *cell;
|
||||||
|
const __be32 *addr;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
@@ -729,7 +731,7 @@ static int nvmem_add_cells_from_of(struc
|
||||||
|
}
|
||||||
|
|
||||||
|
cell->np = of_node_get(child);
|
||||||
|
- nvmem_cell_add(cell);
|
||||||
|
+ nvmem_cell_entry_add(cell);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -1141,9 +1143,33 @@ struct nvmem_device *devm_nvmem_device_g
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_nvmem_device_get);
|
||||||
|
|
||||||
|
+static struct nvmem_cell *nvmem_create_cell(struct nvmem_cell_entry *entry, const char *id)
|
||||||
|
+{
|
||||||
|
+ struct nvmem_cell *cell;
|
||||||
|
+ const char *name = NULL;
|
||||||
|
+
|
||||||
|
+ cell = kzalloc(sizeof(*cell), GFP_KERNEL);
|
||||||
|
+ if (!cell)
|
||||||
|
+ return ERR_PTR(-ENOMEM);
|
||||||
|
+
|
||||||
|
+ if (id) {
|
||||||
|
+ name = kstrdup_const(id, GFP_KERNEL);
|
||||||
|
+ if (!name) {
|
||||||
|
+ kfree(cell);
|
||||||
|
+ return ERR_PTR(-ENOMEM);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ cell->id = name;
|
||||||
|
+ cell->entry = entry;
|
||||||
|
+
|
||||||
|
+ return cell;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static struct nvmem_cell *
|
||||||
|
nvmem_cell_get_from_lookup(struct device *dev, const char *con_id)
|
||||||
|
{
|
||||||
|
+ struct nvmem_cell_entry *cell_entry;
|
||||||
|
struct nvmem_cell *cell = ERR_PTR(-ENOENT);
|
||||||
|
struct nvmem_cell_lookup *lookup;
|
||||||
|
struct nvmem_device *nvmem;
|
||||||
|
@@ -1168,11 +1194,15 @@ nvmem_cell_get_from_lookup(struct device
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- cell = nvmem_find_cell_by_name(nvmem,
|
||||||
|
- lookup->cell_name);
|
||||||
|
- if (!cell) {
|
||||||
|
+ cell_entry = nvmem_find_cell_entry_by_name(nvmem,
|
||||||
|
+ lookup->cell_name);
|
||||||
|
+ if (!cell_entry) {
|
||||||
|
__nvmem_device_put(nvmem);
|
||||||
|
cell = ERR_PTR(-ENOENT);
|
||||||
|
+ } else {
|
||||||
|
+ cell = nvmem_create_cell(cell_entry, con_id);
|
||||||
|
+ if (IS_ERR(cell))
|
||||||
|
+ __nvmem_device_put(nvmem);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -1183,10 +1213,10 @@ nvmem_cell_get_from_lookup(struct device
|
||||||
|
}
|
||||||
|
|
||||||
|
#if IS_ENABLED(CONFIG_OF)
|
||||||
|
-static struct nvmem_cell *
|
||||||
|
-nvmem_find_cell_by_node(struct nvmem_device *nvmem, struct device_node *np)
|
||||||
|
+static struct nvmem_cell_entry *
|
||||||
|
+nvmem_find_cell_entry_by_node(struct nvmem_device *nvmem, struct device_node *np)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell *iter, *cell = NULL;
|
||||||
|
+ struct nvmem_cell_entry *iter, *cell = NULL;
|
||||||
|
|
||||||
|
mutex_lock(&nvmem_mutex);
|
||||||
|
list_for_each_entry(iter, &nvmem->cells, node) {
|
||||||
|
@@ -1216,6 +1246,7 @@ struct nvmem_cell *of_nvmem_cell_get(str
|
||||||
|
{
|
||||||
|
struct device_node *cell_np, *nvmem_np;
|
||||||
|
struct nvmem_device *nvmem;
|
||||||
|
+ struct nvmem_cell_entry *cell_entry;
|
||||||
|
struct nvmem_cell *cell;
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
@@ -1236,12 +1267,16 @@ struct nvmem_cell *of_nvmem_cell_get(str
|
||||||
|
if (IS_ERR(nvmem))
|
||||||
|
return ERR_CAST(nvmem);
|
||||||
|
|
||||||
|
- cell = nvmem_find_cell_by_node(nvmem, cell_np);
|
||||||
|
- if (!cell) {
|
||||||
|
+ cell_entry = nvmem_find_cell_entry_by_node(nvmem, cell_np);
|
||||||
|
+ if (!cell_entry) {
|
||||||
|
__nvmem_device_put(nvmem);
|
||||||
|
return ERR_PTR(-ENOENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ cell = nvmem_create_cell(cell_entry, id);
|
||||||
|
+ if (IS_ERR(cell))
|
||||||
|
+ __nvmem_device_put(nvmem);
|
||||||
|
+
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(of_nvmem_cell_get);
|
||||||
|
@@ -1347,13 +1382,17 @@ EXPORT_SYMBOL(devm_nvmem_cell_put);
|
||||||
|
*/
|
||||||
|
void nvmem_cell_put(struct nvmem_cell *cell)
|
||||||
|
{
|
||||||
|
- struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
+ struct nvmem_device *nvmem = cell->entry->nvmem;
|
||||||
|
+
|
||||||
|
+ if (cell->id)
|
||||||
|
+ kfree_const(cell->id);
|
||||||
|
|
||||||
|
+ kfree(cell);
|
||||||
|
__nvmem_device_put(nvmem);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_cell_put);
|
||||||
|
|
||||||
|
-static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
|
||||||
|
+static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void *buf)
|
||||||
|
{
|
||||||
|
u8 *p, *b;
|
||||||
|
int i, extra, bit_offset = cell->bit_offset;
|
||||||
|
@@ -1387,8 +1426,8 @@ static void nvmem_shift_read_buffer_in_p
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __nvmem_cell_read(struct nvmem_device *nvmem,
|
||||||
|
- struct nvmem_cell *cell,
|
||||||
|
- void *buf, size_t *len)
|
||||||
|
+ struct nvmem_cell_entry *cell,
|
||||||
|
+ void *buf, size_t *len, const char *id)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
@@ -1419,18 +1458,18 @@ static int __nvmem_cell_read(struct nvme
|
||||||
|
*/
|
||||||
|
void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
|
||||||
|
{
|
||||||
|
- struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
+ struct nvmem_device *nvmem = cell->entry->nvmem;
|
||||||
|
u8 *buf;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (!nvmem)
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
|
- buf = kzalloc(cell->bytes, GFP_KERNEL);
|
||||||
|
+ buf = kzalloc(cell->entry->bytes, GFP_KERNEL);
|
||||||
|
if (!buf)
|
||||||
|
return ERR_PTR(-ENOMEM);
|
||||||
|
|
||||||
|
- rc = __nvmem_cell_read(nvmem, cell, buf, len);
|
||||||
|
+ rc = __nvmem_cell_read(nvmem, cell->entry, buf, len, cell->id);
|
||||||
|
if (rc) {
|
||||||
|
kfree(buf);
|
||||||
|
return ERR_PTR(rc);
|
||||||
|
@@ -1440,7 +1479,7 @@ void *nvmem_cell_read(struct nvmem_cell
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_cell_read);
|
||||||
|
|
||||||
|
-static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell *cell,
|
||||||
|
+static void *nvmem_cell_prepare_write_buffer(struct nvmem_cell_entry *cell,
|
||||||
|
u8 *_buf, int len)
|
||||||
|
{
|
||||||
|
struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
@@ -1493,16 +1532,7 @@ err:
|
||||||
|
return ERR_PTR(rc);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/**
|
||||||
|
- * nvmem_cell_write() - Write to a given nvmem cell
|
||||||
|
- *
|
||||||
|
- * @cell: nvmem cell to be written.
|
||||||
|
- * @buf: Buffer to be written.
|
||||||
|
- * @len: length of buffer to be written to nvmem cell.
|
||||||
|
- *
|
||||||
|
- * Return: length of bytes written or negative on failure.
|
||||||
|
- */
|
||||||
|
-int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
|
||||||
|
+static int __nvmem_cell_entry_write(struct nvmem_cell_entry *cell, void *buf, size_t len)
|
||||||
|
{
|
||||||
|
struct nvmem_device *nvmem = cell->nvmem;
|
||||||
|
int rc;
|
||||||
|
@@ -1528,6 +1558,21 @@ int nvmem_cell_write(struct nvmem_cell *
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * nvmem_cell_write() - Write to a given nvmem cell
|
||||||
|
+ *
|
||||||
|
+ * @cell: nvmem cell to be written.
|
||||||
|
+ * @buf: Buffer to be written.
|
||||||
|
+ * @len: length of buffer to be written to nvmem cell.
|
||||||
|
+ *
|
||||||
|
+ * Return: length of bytes written or negative on failure.
|
||||||
|
+ */
|
||||||
|
+int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
|
||||||
|
+{
|
||||||
|
+ return __nvmem_cell_entry_write(cell->entry, buf, len);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_cell_write);
|
||||||
|
|
||||||
|
static int nvmem_cell_read_common(struct device *dev, const char *cell_id,
|
||||||
|
@@ -1630,7 +1675,7 @@ static const void *nvmem_cell_read_varia
|
||||||
|
if (IS_ERR(cell))
|
||||||
|
return cell;
|
||||||
|
|
||||||
|
- nbits = cell->nbits;
|
||||||
|
+ nbits = cell->entry->nbits;
|
||||||
|
buf = nvmem_cell_read(cell, len);
|
||||||
|
nvmem_cell_put(cell);
|
||||||
|
if (IS_ERR(buf))
|
||||||
|
@@ -1726,18 +1771,18 @@ EXPORT_SYMBOL_GPL(nvmem_cell_read_variab
|
||||||
|
ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
|
||||||
|
struct nvmem_cell_info *info, void *buf)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell cell;
|
||||||
|
+ struct nvmem_cell_entry cell;
|
||||||
|
int rc;
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
if (!nvmem)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell);
|
||||||
|
+ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
- rc = __nvmem_cell_read(nvmem, &cell, buf, &len);
|
||||||
|
+ rc = __nvmem_cell_read(nvmem, &cell, buf, &len, NULL);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
@@ -1757,17 +1802,17 @@ EXPORT_SYMBOL_GPL(nvmem_device_cell_read
|
||||||
|
int nvmem_device_cell_write(struct nvmem_device *nvmem,
|
||||||
|
struct nvmem_cell_info *info, void *buf)
|
||||||
|
{
|
||||||
|
- struct nvmem_cell cell;
|
||||||
|
+ struct nvmem_cell_entry cell;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
if (!nvmem)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
- rc = nvmem_cell_info_to_nvmem_cell_nodup(nvmem, info, &cell);
|
||||||
|
+ rc = nvmem_cell_info_to_nvmem_cell_entry_nodup(nvmem, info, &cell);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
- return nvmem_cell_write(&cell, buf, cell.bytes);
|
||||||
|
+ return __nvmem_cell_entry_write(&cell, buf, cell.bytes);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_device_cell_write);
|
||||||
|
|
@ -0,0 +1,82 @@
|
|||||||
|
From 5008062f1c3f5af3acf86164aa6fcc77b0c7bdce Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Wed, 13 Oct 2021 14:19:56 +0100
|
||||||
|
Subject: [PATCH] nvmem: core: add nvmem cell post processing callback
|
||||||
|
|
||||||
|
Some NVMEM providers have certain nvmem cells encoded, which requires
|
||||||
|
post processing before actually using it.
|
||||||
|
|
||||||
|
For example mac-address is stored in either in ascii or delimited or reverse-order.
|
||||||
|
|
||||||
|
Having a post-process callback hook to provider drivers would enable them to
|
||||||
|
do this vendor specific post processing before nvmem consumers see it.
|
||||||
|
|
||||||
|
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20211013131957.30271-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 9 +++++++++
|
||||||
|
include/linux/nvmem-provider.h | 5 +++++
|
||||||
|
2 files changed, 14 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -38,6 +38,7 @@ struct nvmem_device {
|
||||||
|
unsigned int nkeepout;
|
||||||
|
nvmem_reg_read_t reg_read;
|
||||||
|
nvmem_reg_write_t reg_write;
|
||||||
|
+ nvmem_cell_post_process_t cell_post_process;
|
||||||
|
struct gpio_desc *wp_gpio;
|
||||||
|
void *priv;
|
||||||
|
};
|
||||||
|
@@ -798,6 +799,7 @@ struct nvmem_device *nvmem_register(cons
|
||||||
|
nvmem->type = config->type;
|
||||||
|
nvmem->reg_read = config->reg_read;
|
||||||
|
nvmem->reg_write = config->reg_write;
|
||||||
|
+ nvmem->cell_post_process = config->cell_post_process;
|
||||||
|
nvmem->keepout = config->keepout;
|
||||||
|
nvmem->nkeepout = config->nkeepout;
|
||||||
|
if (config->of_node)
|
||||||
|
@@ -1440,6 +1442,13 @@ static int __nvmem_cell_read(struct nvme
|
||||||
|
if (cell->bit_offset || cell->nbits)
|
||||||
|
nvmem_shift_read_buffer_in_place(cell, buf);
|
||||||
|
|
||||||
|
+ if (nvmem->cell_post_process) {
|
||||||
|
+ rc = nvmem->cell_post_process(nvmem->priv, id,
|
||||||
|
+ cell->offset, buf, cell->bytes);
|
||||||
|
+ if (rc)
|
||||||
|
+ return rc;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (len)
|
||||||
|
*len = cell->bytes;
|
||||||
|
|
||||||
|
--- a/include/linux/nvmem-provider.h
|
||||||
|
+++ b/include/linux/nvmem-provider.h
|
||||||
|
@@ -19,6 +19,9 @@ typedef int (*nvmem_reg_read_t)(void *pr
|
||||||
|
void *val, size_t bytes);
|
||||||
|
typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset,
|
||||||
|
void *val, size_t bytes);
|
||||||
|
+/* used for vendor specific post processing of cell data */
|
||||||
|
+typedef int (*nvmem_cell_post_process_t)(void *priv, const char *id, unsigned int offset,
|
||||||
|
+ void *buf, size_t bytes);
|
||||||
|
|
||||||
|
enum nvmem_type {
|
||||||
|
NVMEM_TYPE_UNKNOWN = 0,
|
||||||
|
@@ -62,6 +65,7 @@ struct nvmem_keepout {
|
||||||
|
* @no_of_node: Device should not use the parent's of_node even if it's !NULL.
|
||||||
|
* @reg_read: Callback to read data.
|
||||||
|
* @reg_write: Callback to write data.
|
||||||
|
+ * @cell_post_process: Callback for vendor specific post processing of cell data
|
||||||
|
* @size: Device size.
|
||||||
|
* @word_size: Minimum read/write access granularity.
|
||||||
|
* @stride: Minimum read/write access stride.
|
||||||
|
@@ -94,6 +98,7 @@ struct nvmem_config {
|
||||||
|
bool no_of_node;
|
||||||
|
nvmem_reg_read_t reg_read;
|
||||||
|
nvmem_reg_write_t reg_write;
|
||||||
|
+ nvmem_cell_post_process_t cell_post_process;
|
||||||
|
int size;
|
||||||
|
int word_size;
|
||||||
|
int stride;
|
@ -0,0 +1,92 @@
|
|||||||
|
From d0221a780cbc99fec6c27a98dba2828dc5735c00 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Wed, 13 Oct 2021 14:19:57 +0100
|
||||||
|
Subject: [PATCH] nvmem: imx-ocotp: add support for post processing
|
||||||
|
|
||||||
|
Add .cell_post_process callback for imx-ocotp to deal with MAC address,
|
||||||
|
since MAC address need to be reversed byte for some i.MX SoCs.
|
||||||
|
|
||||||
|
Tested-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20211013131957.30271-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/imx-ocotp.c | 25 +++++++++++++++++++++++++
|
||||||
|
1 file changed, 25 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/imx-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/imx-ocotp.c
|
||||||
|
@@ -97,6 +97,7 @@ struct ocotp_params {
|
||||||
|
unsigned int bank_address_words;
|
||||||
|
void (*set_timing)(struct ocotp_priv *priv);
|
||||||
|
struct ocotp_ctrl_reg ctrl;
|
||||||
|
+ bool reverse_mac_address;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int imx_ocotp_wait_for_busy(struct ocotp_priv *priv, u32 flags)
|
||||||
|
@@ -221,6 +222,25 @@ read_end:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int imx_ocotp_cell_pp(void *context, const char *id, unsigned int offset,
|
||||||
|
+ void *data, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct ocotp_priv *priv = context;
|
||||||
|
+
|
||||||
|
+ /* Deal with some post processing of nvmem cell data */
|
||||||
|
+ if (id && !strcmp(id, "mac-address")) {
|
||||||
|
+ if (priv->params->reverse_mac_address) {
|
||||||
|
+ u8 *buf = data;
|
||||||
|
+ int i;
|
||||||
|
+
|
||||||
|
+ for (i = 0; i < bytes/2; i++)
|
||||||
|
+ swap(buf[i], buf[bytes - i - 1]);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void imx_ocotp_set_imx6_timing(struct ocotp_priv *priv)
|
||||||
|
{
|
||||||
|
unsigned long clk_rate;
|
||||||
|
@@ -468,6 +488,7 @@ static struct nvmem_config imx_ocotp_nvm
|
||||||
|
.stride = 1,
|
||||||
|
.reg_read = imx_ocotp_read,
|
||||||
|
.reg_write = imx_ocotp_write,
|
||||||
|
+ .cell_post_process = imx_ocotp_cell_pp,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx6q_params = {
|
||||||
|
@@ -530,6 +551,7 @@ static const struct ocotp_params imx8mq_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx8mm_params = {
|
||||||
|
@@ -537,6 +559,7 @@ static const struct ocotp_params imx8mm_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx8mn_params = {
|
||||||
|
@@ -544,6 +567,7 @@ static const struct ocotp_params imx8mn_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_DEFAULT,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ocotp_params imx8mp_params = {
|
||||||
|
@@ -551,6 +575,7 @@ static const struct ocotp_params imx8mp_
|
||||||
|
.bank_address_words = 0,
|
||||||
|
.set_timing = imx_ocotp_set_imx6_timing,
|
||||||
|
.ctrl = IMX_OCOTP_BM_CTRL_8MP,
|
||||||
|
+ .reverse_mac_address = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id imx_ocotp_dt_ids[] = {
|
@ -0,0 +1,47 @@
|
|||||||
|
From 98e2c4efae214fb7086cac9117616eb6ea11475d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Chunfeng Yun <chunfeng.yun@mediatek.com>
|
||||||
|
Date: Thu, 9 Dec 2021 17:42:34 +0000
|
||||||
|
Subject: [PATCH] nvmem: mtk-efuse: support minimum one byte access stride and
|
||||||
|
granularity
|
||||||
|
|
||||||
|
In order to support nvmem bits property, should support minimum 1 byte
|
||||||
|
read stride and minimum 1 byte read granularity at the same time.
|
||||||
|
|
||||||
|
Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20211209174235.14049-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/mtk-efuse.c | 13 +++++++------
|
||||||
|
1 file changed, 7 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/mtk-efuse.c
|
||||||
|
+++ b/drivers/nvmem/mtk-efuse.c
|
||||||
|
@@ -19,11 +19,12 @@ static int mtk_reg_read(void *context,
|
||||||
|
unsigned int reg, void *_val, size_t bytes)
|
||||||
|
{
|
||||||
|
struct mtk_efuse_priv *priv = context;
|
||||||
|
- u32 *val = _val;
|
||||||
|
- int i = 0, words = bytes / 4;
|
||||||
|
+ void __iomem *addr = priv->base + reg;
|
||||||
|
+ u8 *val = _val;
|
||||||
|
+ int i;
|
||||||
|
|
||||||
|
- while (words--)
|
||||||
|
- *val++ = readl(priv->base + reg + (i++ * 4));
|
||||||
|
+ for (i = 0; i < bytes; i++, val++)
|
||||||
|
+ *val = readb(addr + i);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -45,8 +46,8 @@ static int mtk_efuse_probe(struct platfo
|
||||||
|
if (IS_ERR(priv->base))
|
||||||
|
return PTR_ERR(priv->base);
|
||||||
|
|
||||||
|
- econfig.stride = 4;
|
||||||
|
- econfig.word_size = 4;
|
||||||
|
+ econfig.stride = 1;
|
||||||
|
+ econfig.word_size = 1;
|
||||||
|
econfig.reg_read = mtk_reg_read;
|
||||||
|
econfig.size = resource_size(res);
|
||||||
|
econfig.priv = priv;
|
@ -0,0 +1,72 @@
|
|||||||
|
From 190fae468592bc2f0efc8b928920f8f712b5831e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:15 +0000
|
||||||
|
Subject: [PATCH] nvmem: core: Remove unused devm_nvmem_unregister()
|
||||||
|
|
||||||
|
There are no users and seems no will come of the devm_nvmem_unregister().
|
||||||
|
Remove the function and remove the unused devm_nvmem_match() along with it.
|
||||||
|
|
||||||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 22 ----------------------
|
||||||
|
include/linux/nvmem-provider.h | 8 --------
|
||||||
|
2 files changed, 30 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -942,28 +942,6 @@ struct nvmem_device *devm_nvmem_register
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(devm_nvmem_register);
|
||||||
|
|
||||||
|
-static int devm_nvmem_match(struct device *dev, void *res, void *data)
|
||||||
|
-{
|
||||||
|
- struct nvmem_device **r = res;
|
||||||
|
-
|
||||||
|
- return *r == data;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-/**
|
||||||
|
- * devm_nvmem_unregister() - Unregister previously registered managed nvmem
|
||||||
|
- * device.
|
||||||
|
- *
|
||||||
|
- * @dev: Device that uses the nvmem device.
|
||||||
|
- * @nvmem: Pointer to previously registered nvmem device.
|
||||||
|
- *
|
||||||
|
- * Return: Will be negative on error or zero on success.
|
||||||
|
- */
|
||||||
|
-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
|
||||||
|
-{
|
||||||
|
- return devres_release(dev, devm_nvmem_release, devm_nvmem_match, nvmem);
|
||||||
|
-}
|
||||||
|
-EXPORT_SYMBOL(devm_nvmem_unregister);
|
||||||
|
-
|
||||||
|
static struct nvmem_device *__nvmem_device_get(void *data,
|
||||||
|
int (*match)(struct device *dev, const void *data))
|
||||||
|
{
|
||||||
|
--- a/include/linux/nvmem-provider.h
|
||||||
|
+++ b/include/linux/nvmem-provider.h
|
||||||
|
@@ -135,8 +135,6 @@ void nvmem_unregister(struct nvmem_devic
|
||||||
|
struct nvmem_device *devm_nvmem_register(struct device *dev,
|
||||||
|
const struct nvmem_config *cfg);
|
||||||
|
|
||||||
|
-int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem);
|
||||||
|
-
|
||||||
|
void nvmem_add_cell_table(struct nvmem_cell_table *table);
|
||||||
|
void nvmem_del_cell_table(struct nvmem_cell_table *table);
|
||||||
|
|
||||||
|
@@ -155,12 +153,6 @@ devm_nvmem_register(struct device *dev,
|
||||||
|
return nvmem_register(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static inline int
|
||||||
|
-devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
|
||||||
|
-{
|
||||||
|
- return -EOPNOTSUPP;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {}
|
||||||
|
static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {}
|
||||||
|
|
@ -0,0 +1,58 @@
|
|||||||
|
From 5825b2c6762611e67ccaf3ccf64485365a120f0b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:16 +0000
|
||||||
|
Subject: [PATCH] nvmem: core: Use devm_add_action_or_reset()
|
||||||
|
|
||||||
|
Slightly simplify the devm_nvmem_register() by using the
|
||||||
|
devm_add_action_or_reset().
|
||||||
|
|
||||||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 22 +++++++++-------------
|
||||||
|
1 file changed, 9 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -904,9 +904,9 @@ void nvmem_unregister(struct nvmem_devic
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_unregister);
|
||||||
|
|
||||||
|
-static void devm_nvmem_release(struct device *dev, void *res)
|
||||||
|
+static void devm_nvmem_unregister(void *nvmem)
|
||||||
|
{
|
||||||
|
- nvmem_unregister(*(struct nvmem_device **)res);
|
||||||
|
+ nvmem_unregister(nvmem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
@@ -923,20 +923,16 @@ static void devm_nvmem_release(struct de
|
||||||
|
struct nvmem_device *devm_nvmem_register(struct device *dev,
|
||||||
|
const struct nvmem_config *config)
|
||||||
|
{
|
||||||
|
- struct nvmem_device **ptr, *nvmem;
|
||||||
|
-
|
||||||
|
- ptr = devres_alloc(devm_nvmem_release, sizeof(*ptr), GFP_KERNEL);
|
||||||
|
- if (!ptr)
|
||||||
|
- return ERR_PTR(-ENOMEM);
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ int ret;
|
||||||
|
|
||||||
|
nvmem = nvmem_register(config);
|
||||||
|
+ if (IS_ERR(nvmem))
|
||||||
|
+ return nvmem;
|
||||||
|
|
||||||
|
- if (!IS_ERR(nvmem)) {
|
||||||
|
- *ptr = nvmem;
|
||||||
|
- devres_add(dev, ptr);
|
||||||
|
- } else {
|
||||||
|
- devres_free(ptr);
|
||||||
|
- }
|
||||||
|
+ ret = devm_add_action_or_reset(dev, devm_nvmem_unregister, nvmem);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ERR_PTR(ret);
|
||||||
|
|
||||||
|
return nvmem;
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
From 8c751e0d9a5264376935a84429a2d468c8877d99 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:17 +0000
|
||||||
|
Subject: [PATCH] nvmem: core: Check input parameter for NULL in
|
||||||
|
nvmem_unregister()
|
||||||
|
|
||||||
|
nvmem_unregister() frees resources and standard pattern is to allow
|
||||||
|
caller to not care if it's NULL or not. This will reduce burden on
|
||||||
|
the callers to perform this check.
|
||||||
|
|
||||||
|
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -900,7 +900,8 @@ static void nvmem_device_release(struct
|
||||||
|
*/
|
||||||
|
void nvmem_unregister(struct nvmem_device *nvmem)
|
||||||
|
{
|
||||||
|
- kref_put(&nvmem->refcnt, nvmem_device_release);
|
||||||
|
+ if (nvmem)
|
||||||
|
+ kref_put(&nvmem->refcnt, nvmem_device_release);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(nvmem_unregister);
|
||||||
|
|
@ -0,0 +1,29 @@
|
|||||||
|
From 05196facc052385960028ac634447ecf6c764ec3 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:18 +0000
|
||||||
|
Subject: [PATCH] nvmem: qfprom: fix kerneldoc warning
|
||||||
|
|
||||||
|
This patch fixes below kernel doc warning,
|
||||||
|
warning: expecting prototype for qfprom_efuse_reg_write().
|
||||||
|
Prototype was for qfprom_reg_write() instead
|
||||||
|
|
||||||
|
No code changes.
|
||||||
|
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-5-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/qfprom.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/qfprom.c
|
||||||
|
+++ b/drivers/nvmem/qfprom.c
|
||||||
|
@@ -244,7 +244,7 @@ err_clk_prepared:
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * qfprom_efuse_reg_write() - Write to fuses.
|
||||||
|
+ * qfprom_reg_write() - Write to fuses.
|
||||||
|
* @context: Our driver data.
|
||||||
|
* @reg: The offset to write at.
|
||||||
|
* @_val: Pointer to data to write.
|
@ -0,0 +1,38 @@
|
|||||||
|
From 07ae4fde9efada7878e1383d6ccc7da70315ca23 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Samuel Holland <samuel@sholland.org>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:20 +0000
|
||||||
|
Subject: [PATCH] nvmem: sunxi_sid: Add support for D1 variant
|
||||||
|
|
||||||
|
D1 has a smaller eFuse block than some other recent SoCs, and it no
|
||||||
|
longer requires a workaround to read the eFuse data.
|
||||||
|
|
||||||
|
Signed-off-by: Samuel Holland <samuel@sholland.org>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-7-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/sunxi_sid.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/sunxi_sid.c
|
||||||
|
+++ b/drivers/nvmem/sunxi_sid.c
|
||||||
|
@@ -184,6 +184,11 @@ static const struct sunxi_sid_cfg sun8i_
|
||||||
|
.need_register_readout = true,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static const struct sunxi_sid_cfg sun20i_d1_cfg = {
|
||||||
|
+ .value_offset = 0x200,
|
||||||
|
+ .size = 0x100,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct sunxi_sid_cfg sun50i_a64_cfg = {
|
||||||
|
.value_offset = 0x200,
|
||||||
|
.size = 0x100,
|
||||||
|
@@ -200,6 +205,7 @@ static const struct of_device_id sunxi_s
|
||||||
|
{ .compatible = "allwinner,sun7i-a20-sid", .data = &sun7i_a20_cfg },
|
||||||
|
{ .compatible = "allwinner,sun8i-a83t-sid", .data = &sun50i_a64_cfg },
|
||||||
|
{ .compatible = "allwinner,sun8i-h3-sid", .data = &sun8i_h3_cfg },
|
||||||
|
+ { .compatible = "allwinner,sun20i-d1-sid", .data = &sun20i_d1_cfg },
|
||||||
|
{ .compatible = "allwinner,sun50i-a64-sid", .data = &sun50i_a64_cfg },
|
||||||
|
{ .compatible = "allwinner,sun50i-h5-sid", .data = &sun50i_a64_cfg },
|
||||||
|
{ .compatible = "allwinner,sun50i-h6-sid", .data = &sun50i_h6_cfg },
|
@ -0,0 +1,28 @@
|
|||||||
|
From 4dc8d89faed9bb05f116fa1794fc955b14910386 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiaoke Wang <xkernel.wang@foxmail.com>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:21 +0000
|
||||||
|
Subject: [PATCH] nvmem: meson-mx-efuse: replace unnecessary devm_kstrdup()
|
||||||
|
|
||||||
|
Replace unnecessary devm_kstrdup() so to avoid redundant memory allocation.
|
||||||
|
|
||||||
|
Suggested-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
|
||||||
|
Signed-off-by: Xiaoke Wang <xkernel.wang@foxmail.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/meson-mx-efuse.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/meson-mx-efuse.c
|
||||||
|
+++ b/drivers/nvmem/meson-mx-efuse.c
|
||||||
|
@@ -209,8 +209,7 @@ static int meson_mx_efuse_probe(struct p
|
||||||
|
if (IS_ERR(efuse->base))
|
||||||
|
return PTR_ERR(efuse->base);
|
||||||
|
|
||||||
|
- efuse->config.name = devm_kstrdup(&pdev->dev, drvdata->name,
|
||||||
|
- GFP_KERNEL);
|
||||||
|
+ efuse->config.name = drvdata->name;
|
||||||
|
efuse->config.owner = THIS_MODULE;
|
||||||
|
efuse->config.dev = &pdev->dev;
|
||||||
|
efuse->config.priv = efuse;
|
@ -0,0 +1,139 @@
|
|||||||
|
From f78451012b9e159afdba31c3eb69f223a9f42adc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Michael Walle <michael@walle.cc>
|
||||||
|
Date: Sun, 20 Feb 2022 15:15:23 +0000
|
||||||
|
Subject: [PATCH] nvmem: add driver for Layerscape SFP (Security Fuse
|
||||||
|
Processor)
|
||||||
|
|
||||||
|
Add support for the Security Fuse Processor found on Layerscape SoCs.
|
||||||
|
This driver implements basic read access.
|
||||||
|
|
||||||
|
Signed-off-by: Michael Walle <michael@walle.cc>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220220151527.17216-10-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 12 +++++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/layerscape-sfp.c | 89 ++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 103 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/layerscape-sfp.c
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -300,4 +300,16 @@ config NVMEM_BRCM_NVRAM
|
||||||
|
This driver provides support for Broadcom's NVRAM that can be accessed
|
||||||
|
using I/O mapping.
|
||||||
|
|
||||||
|
+config NVMEM_LAYERSCAPE_SFP
|
||||||
|
+ tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
+ depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver provides support to read the eFuses on Freescale
|
||||||
|
+ Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
+ unique ID there.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called layerscape-sfp.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -61,3 +61,5 @@ obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.
|
||||||
|
nvmem-rmem-y := rmem.o
|
||||||
|
obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||||
|
nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
+nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||||
|
@@ -0,0 +1,89 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
+/*
|
||||||
|
+ * Layerscape SFP driver
|
||||||
|
+ *
|
||||||
|
+ * Copyright (c) 2022 Michael Walle <michael@walle.cc>
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/device.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/mod_devicetable.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+#include <linux/property.h>
|
||||||
|
+
|
||||||
|
+#define LAYERSCAPE_SFP_OTP_OFFSET 0x0200
|
||||||
|
+
|
||||||
|
+struct layerscape_sfp_priv {
|
||||||
|
+ void __iomem *base;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct layerscape_sfp_data {
|
||||||
|
+ int size;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int layerscape_sfp_read(void *context, unsigned int offset, void *val,
|
||||||
|
+ size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct layerscape_sfp_priv *priv = context;
|
||||||
|
+
|
||||||
|
+ memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset,
|
||||||
|
+ bytes);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config layerscape_sfp_nvmem_config = {
|
||||||
|
+ .name = "fsl-sfp",
|
||||||
|
+ .reg_read = layerscape_sfp_read,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int layerscape_sfp_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ const struct layerscape_sfp_data *data;
|
||||||
|
+ struct layerscape_sfp_priv *priv;
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+
|
||||||
|
+ priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
+ if (!priv)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(priv->base))
|
||||||
|
+ return PTR_ERR(priv->base);
|
||||||
|
+
|
||||||
|
+ data = device_get_match_data(&pdev->dev);
|
||||||
|
+
|
||||||
|
+ layerscape_sfp_nvmem_config.size = data->size;
|
||||||
|
+ layerscape_sfp_nvmem_config.dev = &pdev->dev;
|
||||||
|
+ layerscape_sfp_nvmem_config.priv = priv;
|
||||||
|
+
|
||||||
|
+ nvmem = devm_nvmem_register(&pdev->dev, &layerscape_sfp_nvmem_config);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct layerscape_sfp_data ls1028a_data = {
|
||||||
|
+ .size = 0x88,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
||||||
|
+ { .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data },
|
||||||
|
+ {},
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, layerscape_sfp_dt_ids);
|
||||||
|
+
|
||||||
|
+static struct platform_driver layerscape_sfp_driver = {
|
||||||
|
+ .probe = layerscape_sfp_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "layerscape_sfp",
|
||||||
|
+ .of_match_table = layerscape_sfp_dt_ids,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_platform_driver(layerscape_sfp_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Michael Walle <michael@walle.cc>");
|
||||||
|
+MODULE_DESCRIPTION("Layerscape Security Fuse Processor driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -0,0 +1,32 @@
|
|||||||
|
From bc5c75e0a5a9400f81a987cc720100ac475fa4d8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Knox Chiou <knoxchiou@chromium.org>
|
||||||
|
Date: Wed, 23 Feb 2022 22:35:00 +0000
|
||||||
|
Subject: [PATCH] nvmem: qfprom: Increase fuse blow timeout to prevent write
|
||||||
|
fail
|
||||||
|
|
||||||
|
sc7180 blow fuses got slightly chances to hit qfprom_reg_write timeout.
|
||||||
|
Current timeout is simply too low. Since blowing fuses is a
|
||||||
|
very rare operation, so the risk associated with overestimating this
|
||||||
|
number is low.
|
||||||
|
Increase fuse blow timeout from 1ms to 10ms.
|
||||||
|
|
||||||
|
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||||||
|
Signed-off-by: Knox Chiou <knoxchiou@chromium.org>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220223223502.29454-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/qfprom.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/qfprom.c
|
||||||
|
+++ b/drivers/nvmem/qfprom.c
|
||||||
|
@@ -22,7 +22,7 @@
|
||||||
|
|
||||||
|
/* Amount of time required to hold charge to blow fuse in micro-seconds */
|
||||||
|
#define QFPROM_FUSE_BLOW_POLL_US 100
|
||||||
|
-#define QFPROM_FUSE_BLOW_TIMEOUT_US 1000
|
||||||
|
+#define QFPROM_FUSE_BLOW_TIMEOUT_US 10000
|
||||||
|
|
||||||
|
#define QFPROM_BLOW_STATUS_OFFSET 0x048
|
||||||
|
#define QFPROM_BLOW_STATUS_BUSY 0x1
|
@ -0,0 +1,291 @@
|
|||||||
|
From 8747ec2e9762ed9ae53b3a590938f454b6a1abdf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Vincent Shih <vincent.sunplus@gmail.com>
|
||||||
|
Date: Wed, 23 Feb 2022 22:35:01 +0000
|
||||||
|
Subject: [PATCH] nvmem: Add driver for OCOTP in Sunplus SP7021
|
||||||
|
|
||||||
|
Add driver for OCOTP in Sunplus SP7021
|
||||||
|
|
||||||
|
Signed-off-by: Vincent Shih <vincent.sunplus@gmail.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220223223502.29454-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
MAINTAINERS | 5 +
|
||||||
|
drivers/nvmem/Kconfig | 12 ++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/sunplus-ocotp.c | 228 ++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 247 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/sunplus-ocotp.c
|
||||||
|
|
||||||
|
--- a/MAINTAINERS
|
||||||
|
+++ b/MAINTAINERS
|
||||||
|
@@ -17953,6 +17953,11 @@ L: netdev@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/net/ethernet/dlink/sundance.c
|
||||||
|
|
||||||
|
+SUNPLUS OCOTP DRIVER
|
||||||
|
+M: Vincent Shih <vincent.sunplus@gmail.com>
|
||||||
|
+S: Maintained
|
||||||
|
+F: drivers/nvmem/sunplus-ocotp.c
|
||||||
|
+
|
||||||
|
SUPERH
|
||||||
|
M: Yoshinori Sato <ysato@users.sourceforge.jp>
|
||||||
|
M: Rich Felker <dalias@libc.org>
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -312,4 +312,16 @@ config NVMEM_LAYERSCAPE_SFP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called layerscape-sfp.
|
||||||
|
|
||||||
|
+config NVMEM_SUNPLUS_OCOTP
|
||||||
|
+ tristate "Sunplus SoC OTP support"
|
||||||
|
+ depends on SOC_SP7021 || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This is a driver for the On-chip OTP controller (OCOTP) available
|
||||||
|
+ on Sunplus SoCs. It provides access to 128 bytes of one-time
|
||||||
|
+ programmable eFuse.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-sunplus-ocotp.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -63,3 +63,5 @@ obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_
|
||||||
|
nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||||
|
+nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
@@ -0,0 +1,228 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * The OCOTP driver for Sunplus SP7021
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2019 Sunplus Technology Inc., All rights reserved.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <linux/clk.h>
|
||||||
|
+#include <linux/delay.h>
|
||||||
|
+#include <linux/device.h>
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/iopoll.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/of_device.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * OTP memory
|
||||||
|
+ * Each bank contains 4 words (32 bits).
|
||||||
|
+ * Bank 0 starts at offset 0 from the base.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#define OTP_WORDS_PER_BANK 4
|
||||||
|
+#define OTP_WORD_SIZE sizeof(u32)
|
||||||
|
+#define OTP_BIT_ADDR_OF_BANK (8 * OTP_WORD_SIZE * OTP_WORDS_PER_BANK)
|
||||||
|
+#define QAC628_OTP_NUM_BANKS 8
|
||||||
|
+#define QAC628_OTP_SIZE (QAC628_OTP_NUM_BANKS * OTP_WORDS_PER_BANK * OTP_WORD_SIZE)
|
||||||
|
+#define OTP_READ_TIMEOUT_US 200000
|
||||||
|
+
|
||||||
|
+/* HB_GPIO */
|
||||||
|
+#define ADDRESS_8_DATA 0x20
|
||||||
|
+
|
||||||
|
+/* OTP_RX */
|
||||||
|
+#define OTP_CONTROL_2 0x48
|
||||||
|
+#define OTP_RD_PERIOD GENMASK(15, 8)
|
||||||
|
+#define OTP_RD_PERIOD_MASK ~GENMASK(15, 8)
|
||||||
|
+#define CPU_CLOCK FIELD_PREP(OTP_RD_PERIOD, 30)
|
||||||
|
+#define SEL_BAK_KEY2 BIT(5)
|
||||||
|
+#define SEL_BAK_KEY2_MASK ~BIT(5)
|
||||||
|
+#define SW_TRIM_EN BIT(4)
|
||||||
|
+#define SW_TRIM_EN_MASK ~BIT(4)
|
||||||
|
+#define SEL_BAK_KEY BIT(3)
|
||||||
|
+#define SEL_BAK_KEY_MASK ~BIT(3)
|
||||||
|
+#define OTP_READ BIT(2)
|
||||||
|
+#define OTP_LOAD_SECURE_DATA BIT(1)
|
||||||
|
+#define OTP_LOAD_SECURE_DATA_MASK ~BIT(1)
|
||||||
|
+#define OTP_DO_CRC BIT(0)
|
||||||
|
+#define OTP_DO_CRC_MASK ~BIT(0)
|
||||||
|
+#define OTP_STATUS 0x4c
|
||||||
|
+#define OTP_READ_DONE BIT(4)
|
||||||
|
+#define OTP_READ_DONE_MASK ~BIT(4)
|
||||||
|
+#define OTP_LOAD_SECURE_DONE_MASK ~BIT(2)
|
||||||
|
+#define OTP_READ_ADDRESS 0x50
|
||||||
|
+
|
||||||
|
+enum base_type {
|
||||||
|
+ HB_GPIO,
|
||||||
|
+ OTPRX,
|
||||||
|
+ BASEMAX,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct sp_ocotp_priv {
|
||||||
|
+ struct device *dev;
|
||||||
|
+ void __iomem *base[BASEMAX];
|
||||||
|
+ struct clk *clk;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct sp_ocotp_data {
|
||||||
|
+ int size;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+const struct sp_ocotp_data sp_otp_v0 = {
|
||||||
|
+ .size = QAC628_OTP_SIZE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int sp_otp_read_real(struct sp_ocotp_priv *otp, int addr, char *value)
|
||||||
|
+{
|
||||||
|
+ unsigned int addr_data;
|
||||||
|
+ unsigned int byte_shift;
|
||||||
|
+ unsigned int status;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ addr_data = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||||
|
+ addr_data = addr_data / OTP_WORD_SIZE;
|
||||||
|
+
|
||||||
|
+ byte_shift = addr % (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||||
|
+ byte_shift = byte_shift % OTP_WORD_SIZE;
|
||||||
|
+
|
||||||
|
+ addr = addr / (OTP_WORD_SIZE * OTP_WORDS_PER_BANK);
|
||||||
|
+ addr = addr * OTP_BIT_ADDR_OF_BANK;
|
||||||
|
+
|
||||||
|
+ writel(readl(otp->base[OTPRX] + OTP_STATUS) & OTP_READ_DONE_MASK &
|
||||||
|
+ OTP_LOAD_SECURE_DONE_MASK, otp->base[OTPRX] + OTP_STATUS);
|
||||||
|
+ writel(addr, otp->base[OTPRX] + OTP_READ_ADDRESS);
|
||||||
|
+ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) | OTP_READ,
|
||||||
|
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||||
|
+ writel(readl(otp->base[OTPRX] + OTP_CONTROL_2) & SEL_BAK_KEY2_MASK & SW_TRIM_EN_MASK
|
||||||
|
+ & SEL_BAK_KEY_MASK & OTP_LOAD_SECURE_DATA_MASK & OTP_DO_CRC_MASK,
|
||||||
|
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||||
|
+ writel((readl(otp->base[OTPRX] + OTP_CONTROL_2) & OTP_RD_PERIOD_MASK) | CPU_CLOCK,
|
||||||
|
+ otp->base[OTPRX] + OTP_CONTROL_2);
|
||||||
|
+
|
||||||
|
+ ret = readl_poll_timeout(otp->base[OTPRX] + OTP_STATUS, status,
|
||||||
|
+ status & OTP_READ_DONE, 10, OTP_READ_TIMEOUT_US);
|
||||||
|
+
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ *value = (readl(otp->base[HB_GPIO] + ADDRESS_8_DATA + addr_data * OTP_WORD_SIZE)
|
||||||
|
+ >> (8 * byte_shift)) & 0xff;
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int sp_ocotp_read(void *priv, unsigned int offset, void *value, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct sp_ocotp_priv *otp = priv;
|
||||||
|
+ unsigned int addr;
|
||||||
|
+ char *buf = value;
|
||||||
|
+ char val[4];
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = clk_enable(otp->clk);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ *buf = 0;
|
||||||
|
+ for (addr = offset; addr < (offset + bytes); addr++) {
|
||||||
|
+ ret = sp_otp_read_real(otp, addr, val);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(otp->dev, "OTP read fail:%d at %d", ret, addr);
|
||||||
|
+ goto disable_clk;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *buf++ = *val;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+disable_clk:
|
||||||
|
+ clk_disable(otp->clk);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config sp_ocotp_nvmem_config = {
|
||||||
|
+ .name = "sp-ocotp",
|
||||||
|
+ .read_only = true,
|
||||||
|
+ .word_size = 1,
|
||||||
|
+ .size = QAC628_OTP_SIZE,
|
||||||
|
+ .stride = 1,
|
||||||
|
+ .reg_read = sp_ocotp_read,
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int sp_ocotp_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ struct sp_ocotp_priv *otp;
|
||||||
|
+ struct resource *res;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ otp = devm_kzalloc(dev, sizeof(*otp), GFP_KERNEL);
|
||||||
|
+ if (!otp)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ otp->dev = dev;
|
||||||
|
+
|
||||||
|
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hb_gpio");
|
||||||
|
+ otp->base[HB_GPIO] = devm_ioremap_resource(dev, res);
|
||||||
|
+ if (IS_ERR(otp->base[HB_GPIO]))
|
||||||
|
+ return PTR_ERR(otp->base[HB_GPIO]);
|
||||||
|
+
|
||||||
|
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "otprx");
|
||||||
|
+ otp->base[OTPRX] = devm_ioremap_resource(dev, res);
|
||||||
|
+ if (IS_ERR(otp->base[OTPRX]))
|
||||||
|
+ return PTR_ERR(otp->base[OTPRX]);
|
||||||
|
+
|
||||||
|
+ otp->clk = devm_clk_get(&pdev->dev, NULL);
|
||||||
|
+ if (IS_ERR(otp->clk))
|
||||||
|
+ return dev_err_probe(&pdev->dev, PTR_ERR(otp->clk),
|
||||||
|
+ "devm_clk_get fail\n");
|
||||||
|
+
|
||||||
|
+ ret = clk_prepare(otp->clk);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(dev, "failed to prepare clk: %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sp_ocotp_nvmem_config.priv = otp;
|
||||||
|
+ sp_ocotp_nvmem_config.dev = dev;
|
||||||
|
+
|
||||||
|
+ nvmem = devm_nvmem_register(dev, &sp_ocotp_nvmem_config);
|
||||||
|
+ if (IS_ERR(nvmem))
|
||||||
|
+ return dev_err_probe(&pdev->dev, PTR_ERR(nvmem),
|
||||||
|
+ "register nvmem device fail\n");
|
||||||
|
+
|
||||||
|
+ platform_set_drvdata(pdev, nvmem);
|
||||||
|
+
|
||||||
|
+ dev_dbg(dev, "banks:%d x wpb:%d x wsize:%d = %d",
|
||||||
|
+ (int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK,
|
||||||
|
+ (int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE);
|
||||||
|
+
|
||||||
|
+ dev_info(dev, "by Sunplus (C) 2020");
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id sp_ocotp_dt_ids[] = {
|
||||||
|
+ { .compatible = "sunplus,sp7021-ocotp", .data = &sp_otp_v0 },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, sp_ocotp_dt_ids);
|
||||||
|
+
|
||||||
|
+static struct platform_driver sp_otp_driver = {
|
||||||
|
+ .probe = sp_ocotp_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "sunplus,sp7021-ocotp",
|
||||||
|
+ .of_match_table = sp_ocotp_dt_ids,
|
||||||
|
+ }
|
||||||
|
+};
|
||||||
|
+module_platform_driver(sp_otp_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Vincent Shih <vincent.sunplus@gmail.com>");
|
||||||
|
+MODULE_DESCRIPTION("Sunplus On-Chip OTP driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
||||||
|
+
|
@ -0,0 +1,32 @@
|
|||||||
|
From 6bd0ffeaa389866089e9573b2298ae58d6359b75 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Date: Mon, 21 Mar 2022 12:03:24 +0100
|
||||||
|
Subject: [PATCH] nvmem: bcm-ocotp: mark ACPI device ID table as maybe unused
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
"bcm_otpc_acpi_ids" is used with ACPI_PTR, so a build with !CONFIG_ACPI
|
||||||
|
has a warning:
|
||||||
|
|
||||||
|
drivers/nvmem/bcm-ocotp.c:247:36: error:
|
||||||
|
‘bcm_otpc_acpi_ids’ defined but not used [-Werror=unused-const-variable=]
|
||||||
|
|
||||||
|
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220321110326.44652-1-krzk@kernel.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/bcm-ocotp.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/bcm-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/bcm-ocotp.c
|
||||||
|
@@ -244,7 +244,7 @@ static const struct of_device_id bcm_otp
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, bcm_otpc_dt_ids);
|
||||||
|
|
||||||
|
-static const struct acpi_device_id bcm_otpc_acpi_ids[] = {
|
||||||
|
+static const struct acpi_device_id bcm_otpc_acpi_ids[] __maybe_unused = {
|
||||||
|
{ .id = "BRCM0700", .driver_data = (kernel_ulong_t)&otp_map },
|
||||||
|
{ .id = "BRCM0701", .driver_data = (kernel_ulong_t)&otp_map_v2 },
|
||||||
|
{ /* sentinel */ }
|
@ -0,0 +1,30 @@
|
|||||||
|
From 1066f8156351fcd997125257cea47cf805ba4f6d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Date: Mon, 21 Mar 2022 12:03:25 +0100
|
||||||
|
Subject: [PATCH] nvmem: sunplus-ocotp: staticize sp_otp_v0
|
||||||
|
|
||||||
|
The "sp_otp_v0" file scope variable is not used outside, so make it
|
||||||
|
static to fix warning:
|
||||||
|
|
||||||
|
drivers/nvmem/sunplus-ocotp.c:74:29: sparse:
|
||||||
|
sparse: symbol 'sp_otp_v0' was not declared. Should it be static?
|
||||||
|
|
||||||
|
Reported-by: kernel test robot <lkp@intel.com>
|
||||||
|
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220321110326.44652-2-krzk@kernel.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/sunplus-ocotp.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
@@ -71,7 +71,7 @@ struct sp_ocotp_data {
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
-const struct sp_ocotp_data sp_otp_v0 = {
|
||||||
|
+static const struct sp_ocotp_data sp_otp_v0 = {
|
||||||
|
.size = QAC628_OTP_SIZE,
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
From 874dfbcf219ccc42a2cbd187d087c7db82c3024b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Date: Mon, 21 Mar 2022 12:03:26 +0100
|
||||||
|
Subject: [PATCH] nvmem: sunplus-ocotp: drop useless probe confirmation
|
||||||
|
|
||||||
|
Printing probe success is discouraged, because we can use tracing for
|
||||||
|
this purpose. Remove useless print message after Sunplus OCOTP driver
|
||||||
|
probe.
|
||||||
|
|
||||||
|
Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220321110326.44652-3-krzk@kernel.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/sunplus-ocotp.c | 2 --
|
||||||
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
+++ b/drivers/nvmem/sunplus-ocotp.c
|
||||||
|
@@ -202,8 +202,6 @@ static int sp_ocotp_probe(struct platfor
|
||||||
|
(int)QAC628_OTP_NUM_BANKS, (int)OTP_WORDS_PER_BANK,
|
||||||
|
(int)OTP_WORD_SIZE, (int)QAC628_OTP_SIZE);
|
||||||
|
|
||||||
|
- dev_info(dev, "by Sunplus (C) 2020");
|
||||||
|
-
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -21,7 +21,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|||||||
|
|
||||||
--- a/drivers/nvmem/core.c
|
--- a/drivers/nvmem/core.c
|
||||||
+++ b/drivers/nvmem/core.c
|
+++ b/drivers/nvmem/core.c
|
||||||
@@ -462,6 +462,7 @@ static int nvmem_cell_info_to_nvmem_cell
|
@@ -467,6 +467,7 @@ static int nvmem_cell_info_to_nvmem_cell
|
||||||
|
|
||||||
cell->bit_offset = info->bit_offset;
|
cell->bit_offset = info->bit_offset;
|
||||||
cell->nbits = info->nbits;
|
cell->nbits = info->nbits;
|
@ -0,0 +1,130 @@
|
|||||||
|
From b6b7ef932ae838209254f016ecf8862d716a5ced Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sven Peter <sven@svenpeter.dev>
|
||||||
|
Date: Fri, 29 Apr 2022 17:26:50 +0100
|
||||||
|
Subject: [PATCH] nvmem: Add Apple eFuse driver
|
||||||
|
|
||||||
|
Apple SoCs contain eFuses used to store factory-programmed data such
|
||||||
|
as calibration values for the PCIe or the Type-C PHY. They are organized
|
||||||
|
as 32bit values exposed as MMIO.
|
||||||
|
|
||||||
|
Signed-off-by: Sven Peter <sven@svenpeter.dev>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-6-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 12 ++++++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/apple-efuses.c | 80 ++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 94 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/apple-efuses.c
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -324,4 +324,16 @@ config NVMEM_SUNPLUS_OCOTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-sunplus-ocotp.
|
||||||
|
|
||||||
|
+config NVMEM_APPLE_EFUSES
|
||||||
|
+ tristate "Apple eFuse support"
|
||||||
|
+ depends on ARCH_APPLE || COMPILE_TEST
|
||||||
|
+ default ARCH_APPLE
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable support for reading eFuses on Apple SoCs
|
||||||
|
+ such as the M1. These are e.g. used to store factory programmed
|
||||||
|
+ calibration data required for the PCIe or the USB-C PHY.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module will
|
||||||
|
+ be called nvmem-apple-efuses.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -65,3 +65,5 @@ obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nv
|
||||||
|
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||||
|
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
+nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/apple-efuses.c
|
||||||
|
@@ -0,0 +1,80 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
+/*
|
||||||
|
+ * Apple SoC eFuse driver
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) The Asahi Linux Contributors
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/io.h>
|
||||||
|
+#include <linux/mod_devicetable.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+struct apple_efuses_priv {
|
||||||
|
+ void __iomem *fuses;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int apple_efuses_read(void *context, unsigned int offset, void *val,
|
||||||
|
+ size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct apple_efuses_priv *priv = context;
|
||||||
|
+ u32 *dst = val;
|
||||||
|
+
|
||||||
|
+ while (bytes >= sizeof(u32)) {
|
||||||
|
+ *dst++ = readl_relaxed(priv->fuses + offset);
|
||||||
|
+ bytes -= sizeof(u32);
|
||||||
|
+ offset += sizeof(u32);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int apple_efuses_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct apple_efuses_priv *priv;
|
||||||
|
+ struct resource *res;
|
||||||
|
+ struct nvmem_config config = {
|
||||||
|
+ .dev = &pdev->dev,
|
||||||
|
+ .read_only = true,
|
||||||
|
+ .reg_read = apple_efuses_read,
|
||||||
|
+ .stride = sizeof(u32),
|
||||||
|
+ .word_size = sizeof(u32),
|
||||||
|
+ .name = "apple_efuses_nvmem",
|
||||||
|
+ .id = NVMEM_DEVID_AUTO,
|
||||||
|
+ .root_only = true,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ priv = devm_kzalloc(config.dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
+ if (!priv)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ priv->fuses = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||||
|
+ if (IS_ERR(priv->fuses))
|
||||||
|
+ return PTR_ERR(priv->fuses);
|
||||||
|
+
|
||||||
|
+ config.priv = priv;
|
||||||
|
+ config.size = resource_size(res);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(devm_nvmem_register(config.dev, &config));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id apple_efuses_of_match[] = {
|
||||||
|
+ { .compatible = "apple,efuses", },
|
||||||
|
+ {}
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+MODULE_DEVICE_TABLE(of, apple_efuses_of_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver apple_efuses_driver = {
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "apple_efuses",
|
||||||
|
+ .of_match_table = apple_efuses_of_match,
|
||||||
|
+ },
|
||||||
|
+ .probe = apple_efuses_probe,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+module_platform_driver(apple_efuses_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Sven Peter <sven@svenpeter.dev>");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -0,0 +1,31 @@
|
|||||||
|
From 517f6e2641a2802dce5a5aa0d18c7d37a35678d2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Minghao Chi <chi.minghao@zte.com.cn>
|
||||||
|
Date: Fri, 29 Apr 2022 17:26:54 +0100
|
||||||
|
Subject: [PATCH] nvmem: qfprom: using pm_runtime_resume_and_get instead of
|
||||||
|
pm_runtime_get_sync
|
||||||
|
|
||||||
|
Using pm_runtime_resume_and_get is more appropriate
|
||||||
|
for simplifing code
|
||||||
|
|
||||||
|
Reported-by: Zeal Robot <zealci@zte.com.cn>
|
||||||
|
Signed-off-by: Minghao Chi <chi.minghao@zte.com.cn>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-10-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/qfprom.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/qfprom.c
|
||||||
|
+++ b/drivers/nvmem/qfprom.c
|
||||||
|
@@ -217,9 +217,8 @@ static int qfprom_enable_fuse_blowing(co
|
||||||
|
goto err_clk_rate_set;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ret = pm_runtime_get_sync(priv->dev);
|
||||||
|
+ ret = pm_runtime_resume_and_get(priv->dev);
|
||||||
|
if (ret < 0) {
|
||||||
|
- pm_runtime_put_noidle(priv->dev);
|
||||||
|
dev_err(priv->dev, "Failed to enable power-domain\n");
|
||||||
|
goto err_reg_enable;
|
||||||
|
}
|
@ -0,0 +1,109 @@
|
|||||||
|
From 943eadbdb11314b41eacbcc484dfb7f93e271ff4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Date: Fri, 29 Apr 2022 17:27:00 +0100
|
||||||
|
Subject: [PATCH] nvmem: sfp: Use regmap
|
||||||
|
|
||||||
|
This converts the SFP driver to use regmap. This will allow easily
|
||||||
|
supporting devices with different endians. We disallow byte-level
|
||||||
|
access, as regmap_bulk_read doesn't support it (and it's unclear what
|
||||||
|
the correct result would be when we have an endianness difference).
|
||||||
|
|
||||||
|
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-16-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 1 +
|
||||||
|
drivers/nvmem/layerscape-sfp.c | 30 ++++++++++++++++++++++--------
|
||||||
|
2 files changed, 23 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -304,6 +304,7 @@ config NVMEM_LAYERSCAPE_SFP
|
||||||
|
tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
+ select REGMAP_MMIO
|
||||||
|
help
|
||||||
|
This driver provides support to read the eFuses on Freescale
|
||||||
|
Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
--- a/drivers/nvmem/layerscape-sfp.c
|
||||||
|
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||||
|
@@ -13,15 +13,17 @@
|
||||||
|
#include <linux/nvmem-provider.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/property.h>
|
||||||
|
+#include <linux/regmap.h>
|
||||||
|
|
||||||
|
#define LAYERSCAPE_SFP_OTP_OFFSET 0x0200
|
||||||
|
|
||||||
|
struct layerscape_sfp_priv {
|
||||||
|
- void __iomem *base;
|
||||||
|
+ struct regmap *regmap;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct layerscape_sfp_data {
|
||||||
|
int size;
|
||||||
|
+ enum regmap_endian endian;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int layerscape_sfp_read(void *context, unsigned int offset, void *val,
|
||||||
|
@@ -29,15 +31,16 @@ static int layerscape_sfp_read(void *con
|
||||||
|
{
|
||||||
|
struct layerscape_sfp_priv *priv = context;
|
||||||
|
|
||||||
|
- memcpy_fromio(val, priv->base + LAYERSCAPE_SFP_OTP_OFFSET + offset,
|
||||||
|
- bytes);
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
+ return regmap_bulk_read(priv->regmap,
|
||||||
|
+ LAYERSCAPE_SFP_OTP_OFFSET + offset, val,
|
||||||
|
+ bytes / 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct nvmem_config layerscape_sfp_nvmem_config = {
|
||||||
|
.name = "fsl-sfp",
|
||||||
|
.reg_read = layerscape_sfp_read,
|
||||||
|
+ .word_size = 4,
|
||||||
|
+ .stride = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int layerscape_sfp_probe(struct platform_device *pdev)
|
||||||
|
@@ -45,16 +48,26 @@ static int layerscape_sfp_probe(struct p
|
||||||
|
const struct layerscape_sfp_data *data;
|
||||||
|
struct layerscape_sfp_priv *priv;
|
||||||
|
struct nvmem_device *nvmem;
|
||||||
|
+ struct regmap_config config = { 0 };
|
||||||
|
+ void __iomem *base;
|
||||||
|
|
||||||
|
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
if (!priv)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
- priv->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
- if (IS_ERR(priv->base))
|
||||||
|
- return PTR_ERR(priv->base);
|
||||||
|
+ base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(base))
|
||||||
|
+ return PTR_ERR(base);
|
||||||
|
|
||||||
|
data = device_get_match_data(&pdev->dev);
|
||||||
|
+ config.reg_bits = 32;
|
||||||
|
+ config.reg_stride = 4;
|
||||||
|
+ config.val_bits = 32;
|
||||||
|
+ config.val_format_endian = data->endian;
|
||||||
|
+ config.max_register = LAYERSCAPE_SFP_OTP_OFFSET + data->size - 4;
|
||||||
|
+ priv->regmap = devm_regmap_init_mmio(&pdev->dev, base, &config);
|
||||||
|
+ if (IS_ERR(priv->regmap))
|
||||||
|
+ return PTR_ERR(priv->regmap);
|
||||||
|
|
||||||
|
layerscape_sfp_nvmem_config.size = data->size;
|
||||||
|
layerscape_sfp_nvmem_config.dev = &pdev->dev;
|
||||||
|
@@ -67,6 +80,7 @@ static int layerscape_sfp_probe(struct p
|
||||||
|
|
||||||
|
static const struct layerscape_sfp_data ls1028a_data = {
|
||||||
|
.size = 0x88,
|
||||||
|
+ .endian = REGMAP_ENDIAN_LITTLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
@ -0,0 +1,38 @@
|
|||||||
|
From 33a1c6618677fe33f8e84cb7bedc45abbce89a50 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Date: Fri, 29 Apr 2022 17:27:01 +0100
|
||||||
|
Subject: [PATCH] nvmem: sfp: Add support for TA 2.1 devices
|
||||||
|
|
||||||
|
This adds support for Trust Architecture (TA) 2.1 devices to the SFP driver.
|
||||||
|
There are few differences between TA 2.1 and TA 3.0, especially for
|
||||||
|
read-only support, so just re-use the existing data.
|
||||||
|
|
||||||
|
Signed-off-by: Sean Anderson <sean.anderson@seco.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220429162701.2222-17-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/layerscape-sfp.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/layerscape-sfp.c
|
||||||
|
+++ b/drivers/nvmem/layerscape-sfp.c
|
||||||
|
@@ -78,12 +78,18 @@ static int layerscape_sfp_probe(struct p
|
||||||
|
return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const struct layerscape_sfp_data ls1021a_data = {
|
||||||
|
+ .size = 0x88,
|
||||||
|
+ .endian = REGMAP_ENDIAN_BIG,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static const struct layerscape_sfp_data ls1028a_data = {
|
||||||
|
.size = 0x88,
|
||||||
|
.endian = REGMAP_ENDIAN_LITTLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id layerscape_sfp_dt_ids[] = {
|
||||||
|
+ { .compatible = "fsl,ls1021a-sfp", .data = &ls1021a_data },
|
||||||
|
{ .compatible = "fsl,ls1028a-sfp", .data = &ls1028a_data },
|
||||||
|
{},
|
||||||
|
};
|
@ -0,0 +1,389 @@
|
|||||||
|
From 98830350d3fc824c1ff5c338140fe20f041a5916 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
Date: Wed, 6 Jul 2022 11:06:22 +0100
|
||||||
|
Subject: [PATCH] nvmem: microchip-otpc: add support
|
||||||
|
|
||||||
|
Add support for Microchip OTP controller available on SAMA7G5. The OTPC
|
||||||
|
controls the access to a non-volatile memory. The memory behind OTPC is
|
||||||
|
organized into packets, packets are composed by a fixed length header
|
||||||
|
(4 bytes long) and a variable length payload (payload length is available
|
||||||
|
in the header). When software request the data at an offset in memory
|
||||||
|
the OTPC will return (via header + data registers) the whole packet that
|
||||||
|
has a word at that offset. For the OTP memory layout like below:
|
||||||
|
|
||||||
|
offset OTP Memory layout
|
||||||
|
|
||||||
|
. .
|
||||||
|
. ... .
|
||||||
|
. .
|
||||||
|
0x0E +-----------+ <--- packet X
|
||||||
|
| header X |
|
||||||
|
0x12 +-----------+
|
||||||
|
| payload X |
|
||||||
|
0x16 | |
|
||||||
|
| |
|
||||||
|
0x1A | |
|
||||||
|
+-----------+
|
||||||
|
. .
|
||||||
|
. ... .
|
||||||
|
. .
|
||||||
|
|
||||||
|
if user requests data at address 0x16 the data started at 0x0E will be
|
||||||
|
returned by controller. User will be able to fetch the whole packet
|
||||||
|
starting at 0x0E (or parts of the packet) via proper registers. The same
|
||||||
|
packet will be returned if software request the data at offset 0x0E or
|
||||||
|
0x12 or 0x1A.
|
||||||
|
|
||||||
|
The OTP will be populated by Microchip with at least 2 packets first one
|
||||||
|
being boot configuration packet and the 2nd one being temperature
|
||||||
|
calibration packet. The packet order will be preserved b/w different chip
|
||||||
|
revisions but the packet sizes may change.
|
||||||
|
|
||||||
|
For the above reasons and to keep the same software able to work on all
|
||||||
|
chip variants the read function of the driver is working with a packet
|
||||||
|
id instead of an offset in OTP memory.
|
||||||
|
|
||||||
|
Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220706100627.6534-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
MAINTAINERS | 8 +
|
||||||
|
drivers/nvmem/Kconfig | 7 +
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/microchip-otpc.c | 288 +++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 305 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/microchip-otpc.c
|
||||||
|
|
||||||
|
--- a/MAINTAINERS
|
||||||
|
+++ b/MAINTAINERS
|
||||||
|
@@ -12353,6 +12353,14 @@ S: Supported
|
||||||
|
F: Documentation/devicetree/bindings/mtd/atmel-nand.txt
|
||||||
|
F: drivers/mtd/nand/raw/atmel/*
|
||||||
|
|
||||||
|
+MICROCHIP OTPC DRIVER
|
||||||
|
+M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
+L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
+S: Supported
|
||||||
|
+F: Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
|
||||||
|
+F: drivers/nvmem/microchip-otpc.c
|
||||||
|
+F: dt-bindings/nvmem/microchip,sama7g5-otpc.h
|
||||||
|
+
|
||||||
|
MICROCHIP PWM DRIVER
|
||||||
|
M: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -107,6 +107,13 @@ config MTK_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called efuse-mtk.
|
||||||
|
|
||||||
|
+config MICROCHIP_OTPC
|
||||||
|
+ tristate "Microchip OTPC support"
|
||||||
|
+ depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
+ help
|
||||||
|
+ This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
+ SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
+
|
||||||
|
config NVMEM_NINTENDO_OTP
|
||||||
|
tristate "Nintendo Wii and Wii U OTP Support"
|
||||||
|
depends on WII || COMPILE_TEST
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -67,3 +67,5 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm
|
||||||
|
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
+obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
+nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/microchip-otpc.c
|
||||||
|
@@ -0,0 +1,288 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+/*
|
||||||
|
+ * OTP Memory controller
|
||||||
|
+ *
|
||||||
|
+ * Copyright (C) 2022 Microchip Technology Inc. and its subsidiaries
|
||||||
|
+ *
|
||||||
|
+ * Author: Claudiu Beznea <claudiu.beznea@microchip.com>
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <linux/bitfield.h>
|
||||||
|
+#include <linux/iopoll.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+#define MCHP_OTPC_CR (0x0)
|
||||||
|
+#define MCHP_OTPC_CR_READ BIT(6)
|
||||||
|
+#define MCHP_OTPC_MR (0x4)
|
||||||
|
+#define MCHP_OTPC_MR_ADDR GENMASK(31, 16)
|
||||||
|
+#define MCHP_OTPC_AR (0x8)
|
||||||
|
+#define MCHP_OTPC_SR (0xc)
|
||||||
|
+#define MCHP_OTPC_SR_READ BIT(6)
|
||||||
|
+#define MCHP_OTPC_HR (0x20)
|
||||||
|
+#define MCHP_OTPC_HR_SIZE GENMASK(15, 8)
|
||||||
|
+#define MCHP_OTPC_DR (0x24)
|
||||||
|
+
|
||||||
|
+#define MCHP_OTPC_NAME "mchp-otpc"
|
||||||
|
+#define MCHP_OTPC_SIZE (11 * 1024)
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * struct mchp_otpc - OTPC private data structure
|
||||||
|
+ * @base: base address
|
||||||
|
+ * @dev: struct device pointer
|
||||||
|
+ * @packets: list of packets in OTP memory
|
||||||
|
+ * @npackets: number of packets in OTP memory
|
||||||
|
+ */
|
||||||
|
+struct mchp_otpc {
|
||||||
|
+ void __iomem *base;
|
||||||
|
+ struct device *dev;
|
||||||
|
+ struct list_head packets;
|
||||||
|
+ u32 npackets;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * struct mchp_otpc_packet - OTPC packet data structure
|
||||||
|
+ * @list: list head
|
||||||
|
+ * @id: packet ID
|
||||||
|
+ * @offset: packet offset (in words) in OTP memory
|
||||||
|
+ */
|
||||||
|
+struct mchp_otpc_packet {
|
||||||
|
+ struct list_head list;
|
||||||
|
+ u32 id;
|
||||||
|
+ u32 offset;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct mchp_otpc_packet *mchp_otpc_id_to_packet(struct mchp_otpc *otpc,
|
||||||
|
+ u32 id)
|
||||||
|
+{
|
||||||
|
+ struct mchp_otpc_packet *packet;
|
||||||
|
+
|
||||||
|
+ if (id >= otpc->npackets)
|
||||||
|
+ return NULL;
|
||||||
|
+
|
||||||
|
+ list_for_each_entry(packet, &otpc->packets, list) {
|
||||||
|
+ if (packet->id == id)
|
||||||
|
+ return packet;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mchp_otpc_prepare_read(struct mchp_otpc *otpc,
|
||||||
|
+ unsigned int offset)
|
||||||
|
+{
|
||||||
|
+ u32 tmp;
|
||||||
|
+
|
||||||
|
+ /* Set address. */
|
||||||
|
+ tmp = readl_relaxed(otpc->base + MCHP_OTPC_MR);
|
||||||
|
+ tmp &= ~MCHP_OTPC_MR_ADDR;
|
||||||
|
+ tmp |= FIELD_PREP(MCHP_OTPC_MR_ADDR, offset);
|
||||||
|
+ writel_relaxed(tmp, otpc->base + MCHP_OTPC_MR);
|
||||||
|
+
|
||||||
|
+ /* Set read. */
|
||||||
|
+ tmp = readl_relaxed(otpc->base + MCHP_OTPC_CR);
|
||||||
|
+ tmp |= MCHP_OTPC_CR_READ;
|
||||||
|
+ writel_relaxed(tmp, otpc->base + MCHP_OTPC_CR);
|
||||||
|
+
|
||||||
|
+ /* Wait for packet to be transferred into temporary buffers. */
|
||||||
|
+ return read_poll_timeout(readl_relaxed, tmp, !(tmp & MCHP_OTPC_SR_READ),
|
||||||
|
+ 10000, 2000, false, otpc->base + MCHP_OTPC_SR);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * OTPC memory is organized into packets. Each packets contains a header and
|
||||||
|
+ * a payload. Header is 4 bytes long and contains the size of the payload.
|
||||||
|
+ * Payload size varies. The memory footprint is something as follows:
|
||||||
|
+ *
|
||||||
|
+ * Memory offset Memory footprint Packet ID
|
||||||
|
+ * ------------- ---------------- ---------
|
||||||
|
+ *
|
||||||
|
+ * 0x0 +------------+ <-- packet 0
|
||||||
|
+ * | header 0 |
|
||||||
|
+ * 0x4 +------------+
|
||||||
|
+ * | payload 0 |
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * offset1 +------------+ <-- packet 1
|
||||||
|
+ * | header 1 |
|
||||||
|
+ * offset1 + 0x4 +------------+
|
||||||
|
+ * | payload 1 |
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * offset2 +------------+ <-- packet 2
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * offsetN +------------+ <-- packet N
|
||||||
|
+ * | header N |
|
||||||
|
+ * offsetN + 0x4 +------------+
|
||||||
|
+ * | payload N |
|
||||||
|
+ * . .
|
||||||
|
+ * . ... .
|
||||||
|
+ * . .
|
||||||
|
+ * +------------+
|
||||||
|
+ *
|
||||||
|
+ * where offset1, offset2, offsetN depends on the size of payload 0, payload 1,
|
||||||
|
+ * payload N-1.
|
||||||
|
+ *
|
||||||
|
+ * The access to memory is done on a per packet basis: the control registers
|
||||||
|
+ * need to be updated with an offset address (within a packet range) and the
|
||||||
|
+ * data registers will be update by controller with information contained by
|
||||||
|
+ * that packet. E.g. if control registers are updated with any address within
|
||||||
|
+ * the range [offset1, offset2) the data registers are updated by controller
|
||||||
|
+ * with packet 1. Header data is accessible though MCHP_OTPC_HR register.
|
||||||
|
+ * Payload data is accessible though MCHP_OTPC_DR and MCHP_OTPC_AR registers.
|
||||||
|
+ * There is no direct mapping b/w the offset requested by software and the
|
||||||
|
+ * offset returned by hardware.
|
||||||
|
+ *
|
||||||
|
+ * For this, the read function will return the first requested bytes in the
|
||||||
|
+ * packet. The user will have to be aware of the memory footprint before doing
|
||||||
|
+ * the read request.
|
||||||
|
+ */
|
||||||
|
+static int mchp_otpc_read(void *priv, unsigned int off, void *val,
|
||||||
|
+ size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct mchp_otpc *otpc = priv;
|
||||||
|
+ struct mchp_otpc_packet *packet;
|
||||||
|
+ u32 *buf = val;
|
||||||
|
+ u32 offset;
|
||||||
|
+ size_t len = 0;
|
||||||
|
+ int ret, payload_size;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * We reach this point with off being multiple of stride = 4 to
|
||||||
|
+ * be able to cross the subsystem. Inside the driver we use continuous
|
||||||
|
+ * unsigned integer numbers for packet id, thus devide off by 4
|
||||||
|
+ * before passing it to mchp_otpc_id_to_packet().
|
||||||
|
+ */
|
||||||
|
+ packet = mchp_otpc_id_to_packet(otpc, off / 4);
|
||||||
|
+ if (!packet)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ offset = packet->offset;
|
||||||
|
+
|
||||||
|
+ while (len < bytes) {
|
||||||
|
+ ret = mchp_otpc_prepare_read(otpc, offset);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ /* Read and save header content. */
|
||||||
|
+ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_HR);
|
||||||
|
+ len += sizeof(*buf);
|
||||||
|
+ offset++;
|
||||||
|
+ if (len >= bytes)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ /* Read and save payload content. */
|
||||||
|
+ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, *(buf - 1));
|
||||||
|
+ writel_relaxed(0UL, otpc->base + MCHP_OTPC_AR);
|
||||||
|
+ do {
|
||||||
|
+ *buf++ = readl_relaxed(otpc->base + MCHP_OTPC_DR);
|
||||||
|
+ len += sizeof(*buf);
|
||||||
|
+ offset++;
|
||||||
|
+ payload_size--;
|
||||||
|
+ } while (payload_size >= 0 && len < bytes);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mchp_otpc_init_packets_list(struct mchp_otpc *otpc, u32 *size)
|
||||||
|
+{
|
||||||
|
+ struct mchp_otpc_packet *packet;
|
||||||
|
+ u32 word, word_pos = 0, id = 0, npackets = 0, payload_size;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ INIT_LIST_HEAD(&otpc->packets);
|
||||||
|
+ *size = 0;
|
||||||
|
+
|
||||||
|
+ while (*size < MCHP_OTPC_SIZE) {
|
||||||
|
+ ret = mchp_otpc_prepare_read(otpc, word_pos);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ word = readl_relaxed(otpc->base + MCHP_OTPC_HR);
|
||||||
|
+ payload_size = FIELD_GET(MCHP_OTPC_HR_SIZE, word);
|
||||||
|
+ if (!payload_size)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ packet = devm_kzalloc(otpc->dev, sizeof(*packet), GFP_KERNEL);
|
||||||
|
+ if (!packet)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ packet->id = id++;
|
||||||
|
+ packet->offset = word_pos;
|
||||||
|
+ INIT_LIST_HEAD(&packet->list);
|
||||||
|
+ list_add_tail(&packet->list, &otpc->packets);
|
||||||
|
+
|
||||||
|
+ /* Count size by adding header and paload sizes. */
|
||||||
|
+ *size += 4 * (payload_size + 1);
|
||||||
|
+ /* Next word: this packet (header, payload) position + 1. */
|
||||||
|
+ word_pos += payload_size + 2;
|
||||||
|
+
|
||||||
|
+ npackets++;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ otpc->npackets = npackets;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config mchp_nvmem_config = {
|
||||||
|
+ .name = MCHP_OTPC_NAME,
|
||||||
|
+ .type = NVMEM_TYPE_OTP,
|
||||||
|
+ .read_only = true,
|
||||||
|
+ .word_size = 4,
|
||||||
|
+ .stride = 4,
|
||||||
|
+ .reg_read = mchp_otpc_read,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int mchp_otpc_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ struct mchp_otpc *otpc;
|
||||||
|
+ u32 size;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ otpc = devm_kzalloc(&pdev->dev, sizeof(*otpc), GFP_KERNEL);
|
||||||
|
+ if (!otpc)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ otpc->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(otpc->base))
|
||||||
|
+ return PTR_ERR(otpc->base);
|
||||||
|
+
|
||||||
|
+ otpc->dev = &pdev->dev;
|
||||||
|
+ ret = mchp_otpc_init_packets_list(otpc, &size);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ mchp_nvmem_config.dev = otpc->dev;
|
||||||
|
+ mchp_nvmem_config.size = size;
|
||||||
|
+ mchp_nvmem_config.priv = otpc;
|
||||||
|
+ nvmem = devm_nvmem_register(&pdev->dev, &mchp_nvmem_config);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id __maybe_unused mchp_otpc_ids[] = {
|
||||||
|
+ { .compatible = "microchip,sama7g5-otpc", },
|
||||||
|
+ { },
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, mchp_otpc_ids);
|
||||||
|
+
|
||||||
|
+static struct platform_driver mchp_otpc_driver = {
|
||||||
|
+ .probe = mchp_otpc_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = MCHP_OTPC_NAME,
|
||||||
|
+ .of_match_table = of_match_ptr(mchp_otpc_ids),
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_platform_driver(mchp_otpc_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Claudiu Beznea <claudiu.beznea@microchip.com>");
|
||||||
|
+MODULE_DESCRIPTION("Microchip SAMA7G5 OTPC driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -0,0 +1,32 @@
|
|||||||
|
From f5c97da8037b18d1256a58459fa96ed68e50fb41 Mon Sep 17 00:00:00 2001
|
||||||
|
From: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||||
|
Date: Wed, 6 Jul 2022 11:06:27 +0100
|
||||||
|
Subject: [PATCH] nvmem: mtk-efuse: Simplify with
|
||||||
|
devm_platform_get_and_ioremap_resource()
|
||||||
|
|
||||||
|
Convert platform_get_resource(), devm_ioremap_resource() to a single
|
||||||
|
call to devm_platform_get_and_ioremap_resource(), as this is exactly
|
||||||
|
what this function does.
|
||||||
|
|
||||||
|
No functional changes.
|
||||||
|
|
||||||
|
Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220706100627.6534-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/mtk-efuse.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/mtk-efuse.c
|
||||||
|
+++ b/drivers/nvmem/mtk-efuse.c
|
||||||
|
@@ -41,8 +41,7 @@ static int mtk_efuse_probe(struct platfo
|
||||||
|
if (!priv)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
- priv->base = devm_ioremap_resource(dev, res);
|
||||||
|
+ priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
|
||||||
|
if (IS_ERR(priv->base))
|
||||||
|
return PTR_ERR(priv->base);
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
From f955dc14450695564926711cf9fa8e1d5d854302 Mon Sep 17 00:00:00 2001
|
From d5542923f200f95bddf524f36fd495f78aa28e3c Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Wed, 15 Jun 2022 21:43:00 +0200
|
Date: Fri, 16 Sep 2022 13:20:48 +0100
|
||||||
Subject: [PATCH] nvmem: add driver handling U-Boot environment variables
|
Subject: [PATCH] nvmem: add driver handling U-Boot environment variables
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -22,16 +22,24 @@ Kernel-parsed NVMEM cells can be read however by Linux drivers. This may
|
|||||||
be useful for Ethernet drivers for reading device MAC address which is
|
be useful for Ethernet drivers for reading device MAC address which is
|
||||||
often stored as U-Boot env variable.
|
often stored as U-Boot env variable.
|
||||||
|
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
|
||||||
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
|
||||||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
|
MAINTAINERS | 1 +
|
||||||
|
drivers/nvmem/Kconfig | 13 +++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/u-boot-env.c | 218 +++++++++++++++++++++++++++++++++++++
|
||||||
|
4 files changed, 234 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/u-boot-env.c
|
||||||
|
|
||||||
--- a/drivers/nvmem/Kconfig
|
--- a/drivers/nvmem/Kconfig
|
||||||
+++ b/drivers/nvmem/Kconfig
|
+++ b/drivers/nvmem/Kconfig
|
||||||
@@ -300,4 +300,17 @@ config NVMEM_BRCM_NVRAM
|
@@ -344,4 +344,17 @@ config NVMEM_APPLE_EFUSES
|
||||||
This driver provides support for Broadcom's NVRAM that can be accessed
|
This driver can also be built as a module. If so, the module will
|
||||||
using I/O mapping.
|
be called nvmem-apple-efuses.
|
||||||
|
|
||||||
+config NVMEM_U_BOOT_ENV
|
+config NVMEM_U_BOOT_ENV
|
||||||
+ tristate "U-Boot environment variables support"
|
+ tristate "U-Boot environment variables support"
|
||||||
@ -49,10 +57,10 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|||||||
endif
|
endif
|
||||||
--- a/drivers/nvmem/Makefile
|
--- a/drivers/nvmem/Makefile
|
||||||
+++ b/drivers/nvmem/Makefile
|
+++ b/drivers/nvmem/Makefile
|
||||||
@@ -61,3 +61,5 @@ obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.
|
@@ -69,3 +69,5 @@ obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvme
|
||||||
nvmem-rmem-y := rmem.o
|
nvmem-apple-efuses-y := apple-efuses.o
|
||||||
obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
nvmem_brcm_nvram-y := brcm_nvram.o
|
nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
+nvmem_u-boot-env-y := u-boot-env.o
|
+nvmem_u-boot-env-y := u-boot-env.o
|
||||||
--- /dev/null
|
--- /dev/null
|
@ -0,0 +1,47 @@
|
|||||||
|
From 5544e90c81261e82e02bbf7c6015a4b9c8c825ef Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:50 +0100
|
||||||
|
Subject: [PATCH] nvmem: core: add error handling for dev_set_name
|
||||||
|
|
||||||
|
The type of return value of dev_set_name is int, which may return
|
||||||
|
wrong result, so we add error handling for it to reclaim memory
|
||||||
|
of nvmem resource, and return early when an error occurs.
|
||||||
|
|
||||||
|
Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/core.c | 12 +++++++++---
|
||||||
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/core.c
|
||||||
|
+++ b/drivers/nvmem/core.c
|
||||||
|
@@ -810,18 +810,24 @@ struct nvmem_device *nvmem_register(cons
|
||||||
|
|
||||||
|
switch (config->id) {
|
||||||
|
case NVMEM_DEVID_NONE:
|
||||||
|
- dev_set_name(&nvmem->dev, "%s", config->name);
|
||||||
|
+ rval = dev_set_name(&nvmem->dev, "%s", config->name);
|
||||||
|
break;
|
||||||
|
case NVMEM_DEVID_AUTO:
|
||||||
|
- dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
|
||||||
|
+ rval = dev_set_name(&nvmem->dev, "%s%d", config->name, nvmem->id);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
- dev_set_name(&nvmem->dev, "%s%d",
|
||||||
|
+ rval = dev_set_name(&nvmem->dev, "%s%d",
|
||||||
|
config->name ? : "nvmem",
|
||||||
|
config->name ? config->id : nvmem->id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (rval) {
|
||||||
|
+ ida_free(&nvmem_ida, nvmem->id);
|
||||||
|
+ kfree(nvmem);
|
||||||
|
+ return ERR_PTR(rval);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
nvmem->read_only = device_property_present(config->dev, "read-only") ||
|
||||||
|
config->read_only || !nvmem->reg_write;
|
||||||
|
|
@ -0,0 +1,29 @@
|
|||||||
|
From d3524bb5b9a0c567b853a0024526afe87dde01ed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kenneth Lee <klee33@uw.edu>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:52 +0100
|
||||||
|
Subject: [PATCH] nvmem: brcm_nvram: Use kzalloc for allocating only one
|
||||||
|
element
|
||||||
|
|
||||||
|
Use kzalloc(...) rather than kcalloc(1, ...) because the number of
|
||||||
|
elements we are specifying in this case is 1, so kzalloc would
|
||||||
|
accomplish the same thing and we can simplify.
|
||||||
|
|
||||||
|
Signed-off-by: Kenneth Lee <klee33@uw.edu>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-6-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/brcm_nvram.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/brcm_nvram.c
|
||||||
|
+++ b/drivers/nvmem/brcm_nvram.c
|
||||||
|
@@ -96,7 +96,7 @@ static int brcm_nvram_parse(struct brcm_
|
||||||
|
|
||||||
|
len = le32_to_cpu(header.len);
|
||||||
|
|
||||||
|
- data = kcalloc(1, len, GFP_KERNEL);
|
||||||
|
+ data = kzalloc(len, GFP_KERNEL);
|
||||||
|
memcpy_fromio(data, priv->base, len);
|
||||||
|
data[len - 1] = '\0';
|
||||||
|
|
@ -0,0 +1,281 @@
|
|||||||
|
From 28fc7c986f01fdcfd28af648be2597624cac0e27 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:54 +0100
|
||||||
|
Subject: [PATCH] nvmem: prefix all symbols with NVMEM_
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
This unifies all NVMEM symbols. They follow one style now.
|
||||||
|
|
||||||
|
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
|
||||||
|
Acked-by: Arnd Bergmann <arnd@arndb.de>
|
||||||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
arch/arm/configs/multi_v7_defconfig | 6 +++---
|
||||||
|
arch/arm/configs/qcom_defconfig | 2 +-
|
||||||
|
arch/arm64/configs/defconfig | 10 +++++-----
|
||||||
|
arch/mips/configs/ci20_defconfig | 2 +-
|
||||||
|
drivers/cpufreq/Kconfig.arm | 2 +-
|
||||||
|
drivers/nvmem/Kconfig | 24 ++++++++++++------------
|
||||||
|
drivers/nvmem/Makefile | 24 ++++++++++++------------
|
||||||
|
drivers/soc/mediatek/Kconfig | 2 +-
|
||||||
|
drivers/thermal/qcom/Kconfig | 2 +-
|
||||||
|
9 files changed, 37 insertions(+), 37 deletions(-)
|
||||||
|
|
||||||
|
--- a/arch/arm/configs/multi_v7_defconfig
|
||||||
|
+++ b/arch/arm/configs/multi_v7_defconfig
|
||||||
|
@@ -1125,10 +1125,10 @@ CONFIG_TI_PIPE3=y
|
||||||
|
CONFIG_TWL4030_USB=m
|
||||||
|
CONFIG_RAS=y
|
||||||
|
CONFIG_NVMEM_IMX_OCOTP=y
|
||||||
|
-CONFIG_ROCKCHIP_EFUSE=m
|
||||||
|
+CONFIG_NVMEM_ROCKCHIP_EFUSE=m
|
||||||
|
CONFIG_NVMEM_SUNXI_SID=y
|
||||||
|
CONFIG_NVMEM_VF610_OCOTP=y
|
||||||
|
-CONFIG_MESON_MX_EFUSE=m
|
||||||
|
+CONFIG_NVMEM_MESON_MX_EFUSE=m
|
||||||
|
CONFIG_NVMEM_RMEM=m
|
||||||
|
CONFIG_FSI=m
|
||||||
|
CONFIG_FSI_MASTER_GPIO=m
|
||||||
|
--- a/arch/arm/configs/qcom_defconfig
|
||||||
|
+++ b/arch/arm/configs/qcom_defconfig
|
||||||
|
@@ -274,7 +274,7 @@ CONFIG_PHY_QCOM_USB_HS=y
|
||||||
|
CONFIG_PHY_QCOM_USB_HSIC=y
|
||||||
|
CONFIG_PHY_QCOM_QMP=y
|
||||||
|
CONFIG_PHY_QCOM_USB_SNPS_FEMTO_V2=y
|
||||||
|
-CONFIG_QCOM_QFPROM=y
|
||||||
|
+CONFIG_NVMEM_QCOM_QFPROM=y
|
||||||
|
CONFIG_INTERCONNECT=y
|
||||||
|
CONFIG_INTERCONNECT_QCOM=y
|
||||||
|
CONFIG_INTERCONNECT_QCOM_MSM8974=m
|
||||||
|
--- a/arch/arm64/configs/defconfig
|
||||||
|
+++ b/arch/arm64/configs/defconfig
|
||||||
|
@@ -1135,11 +1135,11 @@ CONFIG_QCOM_L3_PMU=y
|
||||||
|
CONFIG_NVMEM_IMX_OCOTP=y
|
||||||
|
CONFIG_NVMEM_IMX_OCOTP_SCU=y
|
||||||
|
CONFIG_QCOM_QFPROM=y
|
||||||
|
-CONFIG_MTK_EFUSE=y
|
||||||
|
-CONFIG_ROCKCHIP_EFUSE=y
|
||||||
|
+CONFIG_NVMEM_MTK_EFUSE=y
|
||||||
|
+CONFIG_NVMEM_ROCKCHIP_EFUSE=y
|
||||||
|
CONFIG_NVMEM_SUNXI_SID=y
|
||||||
|
-CONFIG_UNIPHIER_EFUSE=y
|
||||||
|
-CONFIG_MESON_EFUSE=m
|
||||||
|
+CONFIG_NVMEM_UNIPHIER_EFUSE=y
|
||||||
|
+CONFIG_NVMEM_MESON_EFUSE=m
|
||||||
|
CONFIG_NVMEM_RMEM=m
|
||||||
|
CONFIG_FPGA=y
|
||||||
|
CONFIG_FPGA_MGR_STRATIX10_SOC=m
|
||||||
|
--- a/arch/mips/configs/ci20_defconfig
|
||||||
|
+++ b/arch/mips/configs/ci20_defconfig
|
||||||
|
@@ -137,7 +137,7 @@ CONFIG_MEMORY=y
|
||||||
|
CONFIG_JZ4780_NEMC=y
|
||||||
|
CONFIG_PWM=y
|
||||||
|
CONFIG_PWM_JZ4740=m
|
||||||
|
-CONFIG_JZ4780_EFUSE=y
|
||||||
|
+CONFIG_NVMEM_JZ4780_EFUSE=y
|
||||||
|
CONFIG_JZ4770_PHY=y
|
||||||
|
CONFIG_EXT4_FS=y
|
||||||
|
# CONFIG_DNOTIFY is not set
|
||||||
|
--- a/drivers/cpufreq/Kconfig.arm
|
||||||
|
+++ b/drivers/cpufreq/Kconfig.arm
|
||||||
|
@@ -153,7 +153,7 @@ config ARM_OMAP2PLUS_CPUFREQ
|
||||||
|
config ARM_QCOM_CPUFREQ_NVMEM
|
||||||
|
tristate "Qualcomm nvmem based CPUFreq"
|
||||||
|
depends on ARCH_QCOM
|
||||||
|
- depends on QCOM_QFPROM
|
||||||
|
+ depends on NVMEM_QCOM_QFPROM
|
||||||
|
depends on QCOM_SMEM
|
||||||
|
select PM_OPP
|
||||||
|
help
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -52,7 +52,7 @@ config NVMEM_IMX_OCOTP_SCU
|
||||||
|
This is a driver for the SCU On-Chip OTP Controller (OCOTP)
|
||||||
|
available on i.MX8 SoCs.
|
||||||
|
|
||||||
|
-config JZ4780_EFUSE
|
||||||
|
+config NVMEM_JZ4780_EFUSE
|
||||||
|
tristate "JZ4780 EFUSE Memory Support"
|
||||||
|
depends on MACH_INGENIC || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -96,7 +96,7 @@ config NVMEM_MXS_OCOTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-mxs-ocotp.
|
||||||
|
|
||||||
|
-config MTK_EFUSE
|
||||||
|
+config NVMEM_MTK_EFUSE
|
||||||
|
tristate "Mediatek SoCs EFUSE support"
|
||||||
|
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -107,7 +107,7 @@ config MTK_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called efuse-mtk.
|
||||||
|
|
||||||
|
-config MICROCHIP_OTPC
|
||||||
|
+config NVMEM_MICROCHIP_OTPC
|
||||||
|
tristate "Microchip OTPC support"
|
||||||
|
depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
help
|
||||||
|
@@ -126,7 +126,7 @@ config NVMEM_NINTENDO_OTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-nintendo-otp.
|
||||||
|
|
||||||
|
-config QCOM_QFPROM
|
||||||
|
+config NVMEM_QCOM_QFPROM
|
||||||
|
tristate "QCOM QFPROM Support"
|
||||||
|
depends on ARCH_QCOM || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -145,7 +145,7 @@ config NVMEM_SPMI_SDAM
|
||||||
|
Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||||
|
an interface to read/write to the SDAM module's shared memory.
|
||||||
|
|
||||||
|
-config ROCKCHIP_EFUSE
|
||||||
|
+config NVMEM_ROCKCHIP_EFUSE
|
||||||
|
tristate "Rockchip eFuse Support"
|
||||||
|
depends on ARCH_ROCKCHIP || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -156,7 +156,7 @@ config ROCKCHIP_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_rockchip_efuse.
|
||||||
|
|
||||||
|
-config ROCKCHIP_OTP
|
||||||
|
+config NVMEM_ROCKCHIP_OTP
|
||||||
|
tristate "Rockchip OTP controller support"
|
||||||
|
depends on ARCH_ROCKCHIP || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -199,7 +199,7 @@ config NVMEM_SUNXI_SID
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_sunxi_sid.
|
||||||
|
|
||||||
|
-config UNIPHIER_EFUSE
|
||||||
|
+config NVMEM_UNIPHIER_EFUSE
|
||||||
|
tristate "UniPhier SoCs eFuse support"
|
||||||
|
depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -221,7 +221,7 @@ config NVMEM_VF610_OCOTP
|
||||||
|
This driver can also be build as a module. If so, the module will
|
||||||
|
be called nvmem-vf610-ocotp.
|
||||||
|
|
||||||
|
-config MESON_EFUSE
|
||||||
|
+config NVMEM_MESON_EFUSE
|
||||||
|
tristate "Amlogic Meson GX eFuse Support"
|
||||||
|
depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||||
|
help
|
||||||
|
@@ -231,7 +231,7 @@ config MESON_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_meson_efuse.
|
||||||
|
|
||||||
|
-config MESON_MX_EFUSE
|
||||||
|
+config NVMEM_MESON_MX_EFUSE
|
||||||
|
tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||||
|
depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
help
|
||||||
|
@@ -251,13 +251,13 @@ config NVMEM_SNVS_LPGPR
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-snvs-lpgpr.
|
||||||
|
|
||||||
|
-config RAVE_SP_EEPROM
|
||||||
|
+config NVMEM_RAVE_SP_EEPROM
|
||||||
|
tristate "Rave SP EEPROM Support"
|
||||||
|
depends on RAVE_SP_CORE
|
||||||
|
help
|
||||||
|
Say y here to enable Rave SP EEPROM support.
|
||||||
|
|
||||||
|
-config SC27XX_EFUSE
|
||||||
|
+config NVMEM_SC27XX_EFUSE
|
||||||
|
tristate "Spreadtrum SC27XX eFuse Support"
|
||||||
|
depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
@@ -278,7 +278,7 @@ config NVMEM_ZYNQMP
|
||||||
|
|
||||||
|
If sure, say yes. If unsure, say no.
|
||||||
|
|
||||||
|
-config SPRD_EFUSE
|
||||||
|
+config NVMEM_SPRD_EFUSE
|
||||||
|
tristate "Spreadtrum SoC eFuse Support"
|
||||||
|
depends on ARCH_SPRD || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -15,7 +15,7 @@ obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-i
|
||||||
|
nvmem-imx-ocotp-y := imx-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o
|
||||||
|
nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
-obj-$(CONFIG_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||||
|
nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||||
|
@@ -25,37 +25,37 @@ obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-m
|
||||||
|
nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||||
|
nvmem-nintendo-otp-y := nintendo-otp.o
|
||||||
|
-obj-$(CONFIG_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||||
|
nvmem_mtk-efuse-y := mtk-efuse.o
|
||||||
|
-obj-$(CONFIG_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
nvmem_qfprom-y := qfprom.o
|
||||||
|
obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||||
|
nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||||
|
-obj-$(CONFIG_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||||
|
nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||||
|
-obj-$(CONFIG_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||||
|
nvmem-rockchip-otp-y := rockchip-otp.o
|
||||||
|
obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||||
|
nvmem_stm32_romem-y := stm32-romem.o
|
||||||
|
obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||||
|
nvmem_sunxi_sid-y := sunxi_sid.o
|
||||||
|
-obj-$(CONFIG_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||||
|
nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||||
|
-obj-$(CONFIG_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
nvmem_meson_efuse-y := meson-efuse.o
|
||||||
|
-obj-$(CONFIG_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||||
|
nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||||
|
-obj-$(CONFIG_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||||
|
-obj-$(CONFIG_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||||
|
nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||||
|
nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||||
|
-obj-$(CONFIG_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
nvmem_sprd_efuse-y := sprd-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||||
|
nvmem-rmem-y := rmem.o
|
||||||
|
@@ -67,7 +67,7 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvm
|
||||||
|
nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
-obj-$(CONFIG_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
|
nvmem_u-boot-env-y := u-boot-env.o
|
||||||
|
--- a/drivers/thermal/qcom/Kconfig
|
||||||
|
+++ b/drivers/thermal/qcom/Kconfig
|
||||||
|
@@ -1,7 +1,7 @@
|
||||||
|
# SPDX-License-Identifier: GPL-2.0-only
|
||||||
|
config QCOM_TSENS
|
||||||
|
tristate "Qualcomm TSENS Temperature Alarm"
|
||||||
|
- depends on QCOM_QFPROM
|
||||||
|
+ depends on NVMEM_QCOM_QFPROM
|
||||||
|
depends on ARCH_QCOM || COMPILE_TEST
|
||||||
|
help
|
||||||
|
This enables the thermal sysfs driver for the TSENS device. It shows
|
@ -0,0 +1,535 @@
|
|||||||
|
From a06d9e5a63b7c2f622c908cd9600ce735e70f7c6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:55 +0100
|
||||||
|
Subject: [PATCH] nvmem: sort config symbols alphabetically
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
1. Match what most subsystems do
|
||||||
|
2. Simplify maintenance a bit
|
||||||
|
3. Reduce amount of conflicts for new drivers patches
|
||||||
|
|
||||||
|
While at it unify indent level in Makefile.
|
||||||
|
|
||||||
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-9-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 300 +++++++++++++++++++++--------------------
|
||||||
|
drivers/nvmem/Makefile | 114 ++++++++--------
|
||||||
|
2 files changed, 208 insertions(+), 206 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -21,6 +21,40 @@ config NVMEM_SYSFS
|
||||||
|
This interface is mostly used by userspace applications to
|
||||||
|
read/write directly into nvmem.
|
||||||
|
|
||||||
|
+# Devices
|
||||||
|
+
|
||||||
|
+config NVMEM_APPLE_EFUSES
|
||||||
|
+ tristate "Apple eFuse support"
|
||||||
|
+ depends on ARCH_APPLE || COMPILE_TEST
|
||||||
|
+ default ARCH_APPLE
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable support for reading eFuses on Apple SoCs
|
||||||
|
+ such as the M1. These are e.g. used to store factory programmed
|
||||||
|
+ calibration data required for the PCIe or the USB-C PHY.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module will
|
||||||
|
+ be called nvmem-apple-efuses.
|
||||||
|
+
|
||||||
|
+config NVMEM_BCM_OCOTP
|
||||||
|
+ tristate "Broadcom On-Chip OTP Controller support"
|
||||||
|
+ depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ default ARCH_BCM_IPROC
|
||||||
|
+ help
|
||||||
|
+ Say y here to enable read/write access to the Broadcom OTP
|
||||||
|
+ controller.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-bcm-ocotp.
|
||||||
|
+
|
||||||
|
+config NVMEM_BRCM_NVRAM
|
||||||
|
+ tristate "Broadcom's NVRAM support"
|
||||||
|
+ depends on ARCH_BCM_5301X || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver provides support for Broadcom's NVRAM that can be accessed
|
||||||
|
+ using I/O mapping.
|
||||||
|
+
|
||||||
|
config NVMEM_IMX_IIM
|
||||||
|
tristate "i.MX IC Identification Module support"
|
||||||
|
depends on ARCH_MXC || COMPILE_TEST
|
||||||
|
@@ -64,6 +98,19 @@ config NVMEM_JZ4780_EFUSE
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called nvmem_jz4780_efuse.
|
||||||
|
|
||||||
|
+config NVMEM_LAYERSCAPE_SFP
|
||||||
|
+ tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
+ depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ select REGMAP_MMIO
|
||||||
|
+ help
|
||||||
|
+ This driver provides support to read the eFuses on Freescale
|
||||||
|
+ Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
+ unique ID there.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called layerscape-sfp.
|
||||||
|
+
|
||||||
|
config NVMEM_LPC18XX_EEPROM
|
||||||
|
tristate "NXP LPC18XX EEPROM Memory Support"
|
||||||
|
depends on ARCH_LPC18XX || COMPILE_TEST
|
||||||
|
@@ -84,17 +131,32 @@ config NVMEM_LPC18XX_OTP
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called nvmem_lpc18xx_otp.
|
||||||
|
|
||||||
|
-config NVMEM_MXS_OCOTP
|
||||||
|
- tristate "Freescale MXS On-Chip OTP Memory Support"
|
||||||
|
- depends on ARCH_MXS || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
+config NVMEM_MESON_EFUSE
|
||||||
|
+ tristate "Amlogic Meson GX eFuse Support"
|
||||||
|
+ depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||||
|
help
|
||||||
|
- If you say Y here, you will get readonly access to the
|
||||||
|
- One Time Programmable memory pages that are stored
|
||||||
|
- on the Freescale i.MX23/i.MX28 processor.
|
||||||
|
+ This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
+ the Amlogic Meson GX SoCs.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-mxs-ocotp.
|
||||||
|
+ will be called nvmem_meson_efuse.
|
||||||
|
+
|
||||||
|
+config NVMEM_MESON_MX_EFUSE
|
||||||
|
+ tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||||
|
+ depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
+ help
|
||||||
|
+ This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
+ the Amlogic Meson6, Meson8 and Meson8b SoCs.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem_meson_mx_efuse.
|
||||||
|
+
|
||||||
|
+config NVMEM_MICROCHIP_OTPC
|
||||||
|
+ tristate "Microchip OTPC support"
|
||||||
|
+ depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
+ help
|
||||||
|
+ This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
+ SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
|
||||||
|
config NVMEM_MTK_EFUSE
|
||||||
|
tristate "Mediatek SoCs EFUSE support"
|
||||||
|
@@ -107,12 +169,17 @@ config NVMEM_MTK_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called efuse-mtk.
|
||||||
|
|
||||||
|
-config NVMEM_MICROCHIP_OTPC
|
||||||
|
- tristate "Microchip OTPC support"
|
||||||
|
- depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
+config NVMEM_MXS_OCOTP
|
||||||
|
+ tristate "Freescale MXS On-Chip OTP Memory Support"
|
||||||
|
+ depends on ARCH_MXS || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
help
|
||||||
|
- This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
- SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
+ If you say Y here, you will get readonly access to the
|
||||||
|
+ One Time Programmable memory pages that are stored
|
||||||
|
+ on the Freescale i.MX23/i.MX28 processor.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-mxs-ocotp.
|
||||||
|
|
||||||
|
config NVMEM_NINTENDO_OTP
|
||||||
|
tristate "Nintendo Wii and Wii U OTP Support"
|
||||||
|
@@ -137,13 +204,21 @@ config NVMEM_QCOM_QFPROM
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_qfprom.
|
||||||
|
|
||||||
|
-config NVMEM_SPMI_SDAM
|
||||||
|
- tristate "SPMI SDAM Support"
|
||||||
|
- depends on SPMI
|
||||||
|
+config NVMEM_RAVE_SP_EEPROM
|
||||||
|
+ tristate "Rave SP EEPROM Support"
|
||||||
|
+ depends on RAVE_SP_CORE
|
||||||
|
help
|
||||||
|
- This driver supports the Shared Direct Access Memory Module on
|
||||||
|
- Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||||
|
- an interface to read/write to the SDAM module's shared memory.
|
||||||
|
+ Say y here to enable Rave SP EEPROM support.
|
||||||
|
+
|
||||||
|
+config NVMEM_RMEM
|
||||||
|
+ tristate "Reserved Memory Based Driver Support"
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver maps reserved memory into an nvmem device. It might be
|
||||||
|
+ useful to expose information left by firmware in memory.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-rmem.
|
||||||
|
|
||||||
|
config NVMEM_ROCKCHIP_EFUSE
|
||||||
|
tristate "Rockchip eFuse Support"
|
||||||
|
@@ -167,79 +242,16 @@ config NVMEM_ROCKCHIP_OTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem_rockchip_otp.
|
||||||
|
|
||||||
|
-config NVMEM_BCM_OCOTP
|
||||||
|
- tristate "Broadcom On-Chip OTP Controller support"
|
||||||
|
- depends on ARCH_BCM_IPROC || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- default ARCH_BCM_IPROC
|
||||||
|
- help
|
||||||
|
- Say y here to enable read/write access to the Broadcom OTP
|
||||||
|
- controller.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-bcm-ocotp.
|
||||||
|
-
|
||||||
|
-config NVMEM_STM32_ROMEM
|
||||||
|
- tristate "STMicroelectronics STM32 factory-programmed memory support"
|
||||||
|
- depends on ARCH_STM32 || COMPILE_TEST
|
||||||
|
- help
|
||||||
|
- Say y here to enable read-only access for STMicroelectronics STM32
|
||||||
|
- factory-programmed memory area.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-stm32-romem.
|
||||||
|
-
|
||||||
|
-config NVMEM_SUNXI_SID
|
||||||
|
- tristate "Allwinner SoCs SID support"
|
||||||
|
- depends on ARCH_SUNXI
|
||||||
|
- help
|
||||||
|
- This is a driver for the 'security ID' available on various Allwinner
|
||||||
|
- devices.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem_sunxi_sid.
|
||||||
|
-
|
||||||
|
-config NVMEM_UNIPHIER_EFUSE
|
||||||
|
- tristate "UniPhier SoCs eFuse support"
|
||||||
|
- depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This is a simple driver to dump specified values of UniPhier SoC
|
||||||
|
- from eFuse.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-uniphier-efuse.
|
||||||
|
-
|
||||||
|
-config NVMEM_VF610_OCOTP
|
||||||
|
- tristate "VF610 SoC OCOTP support"
|
||||||
|
- depends on SOC_VF610 || COMPILE_TEST
|
||||||
|
+config NVMEM_SC27XX_EFUSE
|
||||||
|
+ tristate "Spreadtrum SC27XX eFuse Support"
|
||||||
|
+ depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||||
|
depends on HAS_IOMEM
|
||||||
|
help
|
||||||
|
- This is a driver for the 'OCOTP' peripheral available on Vybrid
|
||||||
|
- devices like VF5xx and VF6xx.
|
||||||
|
-
|
||||||
|
- This driver can also be build as a module. If so, the module will
|
||||||
|
- be called nvmem-vf610-ocotp.
|
||||||
|
-
|
||||||
|
-config NVMEM_MESON_EFUSE
|
||||||
|
- tristate "Amlogic Meson GX eFuse Support"
|
||||||
|
- depends on (ARCH_MESON || COMPILE_TEST) && MESON_SM
|
||||||
|
- help
|
||||||
|
- This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
- the Amlogic Meson GX SoCs.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem_meson_efuse.
|
||||||
|
-
|
||||||
|
-config NVMEM_MESON_MX_EFUSE
|
||||||
|
- tristate "Amlogic Meson6/Meson8/Meson8b eFuse Support"
|
||||||
|
- depends on ARCH_MESON || COMPILE_TEST
|
||||||
|
- help
|
||||||
|
- This is a driver to retrieve specific values from the eFuse found on
|
||||||
|
- the Amlogic Meson6, Meson8 and Meson8b SoCs.
|
||||||
|
+ This is a simple driver to dump specified values of Spreadtrum
|
||||||
|
+ SC27XX PMICs from eFuse.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem_meson_mx_efuse.
|
||||||
|
+ will be called nvmem-sc27xx-efuse.
|
||||||
|
|
||||||
|
config NVMEM_SNVS_LPGPR
|
||||||
|
tristate "Support for Low Power General Purpose Register"
|
||||||
|
@@ -251,32 +263,13 @@ config NVMEM_SNVS_LPGPR
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-snvs-lpgpr.
|
||||||
|
|
||||||
|
-config NVMEM_RAVE_SP_EEPROM
|
||||||
|
- tristate "Rave SP EEPROM Support"
|
||||||
|
- depends on RAVE_SP_CORE
|
||||||
|
- help
|
||||||
|
- Say y here to enable Rave SP EEPROM support.
|
||||||
|
-
|
||||||
|
-config NVMEM_SC27XX_EFUSE
|
||||||
|
- tristate "Spreadtrum SC27XX eFuse Support"
|
||||||
|
- depends on MFD_SC27XX_PMIC || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This is a simple driver to dump specified values of Spreadtrum
|
||||||
|
- SC27XX PMICs from eFuse.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-sc27xx-efuse.
|
||||||
|
-
|
||||||
|
-config NVMEM_ZYNQMP
|
||||||
|
- bool "Xilinx ZYNQMP SoC nvmem firmware support"
|
||||||
|
- depends on ARCH_ZYNQMP
|
||||||
|
+config NVMEM_SPMI_SDAM
|
||||||
|
+ tristate "SPMI SDAM Support"
|
||||||
|
+ depends on SPMI
|
||||||
|
help
|
||||||
|
- This is a driver to access hardware related data like
|
||||||
|
- soc revision, IDCODE... etc by using the firmware
|
||||||
|
- interface.
|
||||||
|
-
|
||||||
|
- If sure, say yes. If unsure, say no.
|
||||||
|
+ This driver supports the Shared Direct Access Memory Module on
|
||||||
|
+ Qualcomm Technologies, Inc. PMICs. It provides the clients
|
||||||
|
+ an interface to read/write to the SDAM module's shared memory.
|
||||||
|
|
||||||
|
config NVMEM_SPRD_EFUSE
|
||||||
|
tristate "Spreadtrum SoC eFuse Support"
|
||||||
|
@@ -289,36 +282,15 @@ config NVMEM_SPRD_EFUSE
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-sprd-efuse.
|
||||||
|
|
||||||
|
-config NVMEM_RMEM
|
||||||
|
- tristate "Reserved Memory Based Driver Support"
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This driver maps reserved memory into an nvmem device. It might be
|
||||||
|
- useful to expose information left by firmware in memory.
|
||||||
|
-
|
||||||
|
- This driver can also be built as a module. If so, the module
|
||||||
|
- will be called nvmem-rmem.
|
||||||
|
-
|
||||||
|
-config NVMEM_BRCM_NVRAM
|
||||||
|
- tristate "Broadcom's NVRAM support"
|
||||||
|
- depends on ARCH_BCM_5301X || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- help
|
||||||
|
- This driver provides support for Broadcom's NVRAM that can be accessed
|
||||||
|
- using I/O mapping.
|
||||||
|
-
|
||||||
|
-config NVMEM_LAYERSCAPE_SFP
|
||||||
|
- tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
- depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
- depends on HAS_IOMEM
|
||||||
|
- select REGMAP_MMIO
|
||||||
|
+config NVMEM_STM32_ROMEM
|
||||||
|
+ tristate "STMicroelectronics STM32 factory-programmed memory support"
|
||||||
|
+ depends on ARCH_STM32 || COMPILE_TEST
|
||||||
|
help
|
||||||
|
- This driver provides support to read the eFuses on Freescale
|
||||||
|
- Layerscape SoC's. For example, the vendor provides a per part
|
||||||
|
- unique ID there.
|
||||||
|
+ Say y here to enable read-only access for STMicroelectronics STM32
|
||||||
|
+ factory-programmed memory area.
|
||||||
|
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
- will be called layerscape-sfp.
|
||||||
|
+ will be called nvmem-stm32-romem.
|
||||||
|
|
||||||
|
config NVMEM_SUNPLUS_OCOTP
|
||||||
|
tristate "Sunplus SoC OTP support"
|
||||||
|
@@ -332,17 +304,15 @@ config NVMEM_SUNPLUS_OCOTP
|
||||||
|
This driver can also be built as a module. If so, the module
|
||||||
|
will be called nvmem-sunplus-ocotp.
|
||||||
|
|
||||||
|
-config NVMEM_APPLE_EFUSES
|
||||||
|
- tristate "Apple eFuse support"
|
||||||
|
- depends on ARCH_APPLE || COMPILE_TEST
|
||||||
|
- default ARCH_APPLE
|
||||||
|
+config NVMEM_SUNXI_SID
|
||||||
|
+ tristate "Allwinner SoCs SID support"
|
||||||
|
+ depends on ARCH_SUNXI
|
||||||
|
help
|
||||||
|
- Say y here to enable support for reading eFuses on Apple SoCs
|
||||||
|
- such as the M1. These are e.g. used to store factory programmed
|
||||||
|
- calibration data required for the PCIe or the USB-C PHY.
|
||||||
|
+ This is a driver for the 'security ID' available on various Allwinner
|
||||||
|
+ devices.
|
||||||
|
|
||||||
|
- This driver can also be built as a module. If so, the module will
|
||||||
|
- be called nvmem-apple-efuses.
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem_sunxi_sid.
|
||||||
|
|
||||||
|
config NVMEM_U_BOOT_ENV
|
||||||
|
tristate "U-Boot environment variables support"
|
||||||
|
@@ -357,4 +327,36 @@ config NVMEM_U_BOOT_ENV
|
||||||
|
|
||||||
|
If compiled as module it will be called nvmem_u-boot-env.
|
||||||
|
|
||||||
|
+config NVMEM_UNIPHIER_EFUSE
|
||||||
|
+ tristate "UniPhier SoCs eFuse support"
|
||||||
|
+ depends on ARCH_UNIPHIER || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This is a simple driver to dump specified values of UniPhier SoC
|
||||||
|
+ from eFuse.
|
||||||
|
+
|
||||||
|
+ This driver can also be built as a module. If so, the module
|
||||||
|
+ will be called nvmem-uniphier-efuse.
|
||||||
|
+
|
||||||
|
+config NVMEM_VF610_OCOTP
|
||||||
|
+ tristate "VF610 SoC OCOTP support"
|
||||||
|
+ depends on SOC_VF610 || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This is a driver for the 'OCOTP' peripheral available on Vybrid
|
||||||
|
+ devices like VF5xx and VF6xx.
|
||||||
|
+
|
||||||
|
+ This driver can also be build as a module. If so, the module will
|
||||||
|
+ be called nvmem-vf610-ocotp.
|
||||||
|
+
|
||||||
|
+config NVMEM_ZYNQMP
|
||||||
|
+ bool "Xilinx ZYNQMP SoC nvmem firmware support"
|
||||||
|
+ depends on ARCH_ZYNQMP
|
||||||
|
+ help
|
||||||
|
+ This is a driver to access hardware related data like
|
||||||
|
+ soc revision, IDCODE... etc by using the firmware
|
||||||
|
+ interface.
|
||||||
|
+
|
||||||
|
+ If sure, say yes. If unsure, say no.
|
||||||
|
+
|
||||||
|
endif
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -7,67 +7,67 @@ obj-$(CONFIG_NVMEM) += nvmem_core.o
|
||||||
|
nvmem_core-y := core.o
|
||||||
|
|
||||||
|
# Devices
|
||||||
|
-obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o
|
||||||
|
-nvmem-bcm-ocotp-y := bcm-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o
|
||||||
|
-nvmem-imx-iim-y := imx-iim.o
|
||||||
|
-obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o
|
||||||
|
-nvmem-imx-ocotp-y := imx-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
+nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
+obj-$(CONFIG_NVMEM_BCM_OCOTP) += nvmem-bcm-ocotp.o
|
||||||
|
+nvmem-bcm-ocotp-y := bcm-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||||
|
+nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
+obj-$(CONFIG_NVMEM_IMX_IIM) += nvmem-imx-iim.o
|
||||||
|
+nvmem-imx-iim-y := imx-iim.o
|
||||||
|
+obj-$(CONFIG_NVMEM_IMX_OCOTP) += nvmem-imx-ocotp.o
|
||||||
|
+nvmem-imx-ocotp-y := imx-ocotp.o
|
||||||
|
obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvmem-imx-ocotp-scu.o
|
||||||
|
-nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
-obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
-nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
+nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
+obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
+nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
+nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||||
|
-nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||||
|
-obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o
|
||||||
|
-nvmem_lpc18xx_otp-y := lpc18xx_otp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o
|
||||||
|
-nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||||
|
-nvmem-nintendo-otp-y := nintendo-otp.o
|
||||||
|
+nvmem_lpc18xx_eeprom-y := lpc18xx_eeprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LPC18XX_OTP) += nvmem_lpc18xx_otp.o
|
||||||
|
+nvmem_lpc18xx_otp-y := lpc18xx_otp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
+nvmem_meson_efuse-y := meson-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
+nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
+nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
obj-$(CONFIG_NVMEM_MTK_EFUSE) += nvmem_mtk-efuse.o
|
||||||
|
-nvmem_mtk-efuse-y := mtk-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
-nvmem_qfprom-y := qfprom.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||||
|
-nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||||
|
+nvmem_mtk-efuse-y := mtk-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_MXS_OCOTP) += nvmem-mxs-ocotp.o
|
||||||
|
+nvmem-mxs-ocotp-y := mxs-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_NINTENDO_OTP) += nvmem-nintendo-otp.o
|
||||||
|
+nvmem-nintendo-otp-y := nintendo-otp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_QCOM_QFPROM) += nvmem_qfprom.o
|
||||||
|
+nvmem_qfprom-y := qfprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
+nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||||
|
+obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||||
|
+nvmem-rmem-y := rmem.o
|
||||||
|
obj-$(CONFIG_NVMEM_ROCKCHIP_EFUSE) += nvmem_rockchip_efuse.o
|
||||||
|
-nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||||
|
+nvmem_rockchip_efuse-y := rockchip-efuse.o
|
||||||
|
obj-$(CONFIG_NVMEM_ROCKCHIP_OTP) += nvmem-rockchip-otp.o
|
||||||
|
-nvmem-rockchip-otp-y := rockchip-otp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||||
|
-nvmem_stm32_romem-y := stm32-romem.o
|
||||||
|
-obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||||
|
-nvmem_sunxi_sid-y := sunxi_sid.o
|
||||||
|
-obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
-nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||||
|
-nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MESON_EFUSE) += nvmem_meson_efuse.o
|
||||||
|
-nvmem_meson_efuse-y := meson-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MESON_MX_EFUSE) += nvmem_meson_mx_efuse.o
|
||||||
|
-nvmem_meson_mx_efuse-y := meson-mx-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||||
|
-nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||||
|
-obj-$(CONFIG_NVMEM_RAVE_SP_EEPROM) += nvmem-rave-sp-eeprom.o
|
||||||
|
-nvmem-rave-sp-eeprom-y := rave-sp-eeprom.o
|
||||||
|
+nvmem-rockchip-otp-y := rockchip-otp.o
|
||||||
|
obj-$(CONFIG_NVMEM_SC27XX_EFUSE) += nvmem-sc27xx-efuse.o
|
||||||
|
-nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||||
|
-nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
||||||
|
-obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
-nvmem_sprd_efuse-y := sprd-efuse.o
|
||||||
|
-obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o
|
||||||
|
-nvmem-rmem-y := rmem.o
|
||||||
|
-obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o
|
||||||
|
-nvmem_brcm_nvram-y := brcm_nvram.o
|
||||||
|
-obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
-nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
+nvmem-sc27xx-efuse-y := sc27xx-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SNVS_LPGPR) += nvmem_snvs_lpgpr.o
|
||||||
|
+nvmem_snvs_lpgpr-y := snvs_lpgpr.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SPMI_SDAM) += nvmem_qcom-spmi-sdam.o
|
||||||
|
+nvmem_qcom-spmi-sdam-y += qcom-spmi-sdam.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SPRD_EFUSE) += nvmem_sprd_efuse.o
|
||||||
|
+nvmem_sprd_efuse-y := sprd-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_STM32_ROMEM) += nvmem_stm32_romem.o
|
||||||
|
+nvmem_stm32_romem-y := stm32-romem.o
|
||||||
|
obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o
|
||||||
|
-nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
-obj-$(CONFIG_NVMEM_APPLE_EFUSES) += nvmem-apple-efuses.o
|
||||||
|
-nvmem-apple-efuses-y := apple-efuses.o
|
||||||
|
-obj-$(CONFIG_NVMEM_MICROCHIP_OTPC) += nvmem-microchip-otpc.o
|
||||||
|
-nvmem-microchip-otpc-y := microchip-otpc.o
|
||||||
|
-obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
|
-nvmem_u-boot-env-y := u-boot-env.o
|
||||||
|
+nvmem_sunplus_ocotp-y := sunplus-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o
|
||||||
|
+nvmem_sunxi_sid-y := sunxi_sid.o
|
||||||
|
+obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o
|
||||||
|
+nvmem_u-boot-env-y := u-boot-env.o
|
||||||
|
+obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o
|
||||||
|
+nvmem-uniphier-efuse-y := uniphier-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_VF610_OCOTP) += nvmem-vf610-ocotp.o
|
||||||
|
+nvmem-vf610-ocotp-y := vf610-ocotp.o
|
||||||
|
+obj-$(CONFIG_NVMEM_ZYNQMP) += nvmem_zynqmp_nvmem.o
|
||||||
|
+nvmem_zynqmp_nvmem-y := zynqmp_nvmem.o
|
@ -1,6 +1,6 @@
|
|||||||
From d69efcf951df4dcc74a0e1554969c533aec8aa9b Mon Sep 17 00:00:00 2001
|
From d4d432670f7dee0a5432fcffcfc8699b25181ace Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Thu, 15 Sep 2022 22:06:29 +0200
|
Date: Fri, 16 Sep 2022 13:20:57 +0100
|
||||||
Subject: [PATCH] nvmem: u-boot-env: find Device Tree nodes for NVMEM cells
|
Subject: [PATCH] nvmem: u-boot-env: find Device Tree nodes for NVMEM cells
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -13,6 +13,8 @@ This allows NVMEM consumers to use U-Boot environment variables.
|
|||||||
|
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-11-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 1 +
|
drivers/nvmem/u-boot-env.c | 1 +
|
||||||
1 file changed, 1 insertion(+)
|
1 file changed, 1 insertion(+)
|
@ -0,0 +1,274 @@
|
|||||||
|
From 9e8f208ad5229ddda97cd4a83ecf89c735d99592 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Date: Fri, 16 Sep 2022 13:20:59 +0100
|
||||||
|
Subject: [PATCH] nvmem: lan9662-otp: add support
|
||||||
|
|
||||||
|
Add support for OTP controller available on LAN9662. The OTPC controls
|
||||||
|
the access to a non-volatile memory. The size of the memory is 8KB.
|
||||||
|
The OTPC can access the memory based on an offset.
|
||||||
|
Implement both the read and the write functionality.
|
||||||
|
|
||||||
|
Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-13-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 8 ++
|
||||||
|
drivers/nvmem/Makefile | 2 +
|
||||||
|
drivers/nvmem/lan9662-otpc.c | 222 +++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 232 insertions(+)
|
||||||
|
create mode 100644 drivers/nvmem/lan9662-otpc.c
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -98,6 +98,14 @@ config NVMEM_JZ4780_EFUSE
|
||||||
|
To compile this driver as a module, choose M here: the module
|
||||||
|
will be called nvmem_jz4780_efuse.
|
||||||
|
|
||||||
|
+config NVMEM_LAN9662_OTPC
|
||||||
|
+ tristate "Microchip LAN9662 OTP controller support"
|
||||||
|
+ depends on SOC_LAN966 || COMPILE_TEST
|
||||||
|
+ depends on HAS_IOMEM
|
||||||
|
+ help
|
||||||
|
+ This driver enables the OTP controller available on Microchip LAN9662
|
||||||
|
+ SoCs. It controls the access to the OTP memory connected to it.
|
||||||
|
+
|
||||||
|
config NVMEM_LAYERSCAPE_SFP
|
||||||
|
tristate "Layerscape SFP (Security Fuse Processor) support"
|
||||||
|
depends on ARCH_LAYERSCAPE || COMPILE_TEST
|
||||||
|
--- a/drivers/nvmem/Makefile
|
||||||
|
+++ b/drivers/nvmem/Makefile
|
||||||
|
@@ -21,6 +21,8 @@ obj-$(CONFIG_NVMEM_IMX_OCOTP_SCU) += nvm
|
||||||
|
nvmem-imx-ocotp-scu-y := imx-ocotp-scu.o
|
||||||
|
obj-$(CONFIG_NVMEM_JZ4780_EFUSE) += nvmem_jz4780_efuse.o
|
||||||
|
nvmem_jz4780_efuse-y := jz4780-efuse.o
|
||||||
|
+obj-$(CONFIG_NVMEM_LAN9662_OTPC) += nvmem-lan9662-otpc.o
|
||||||
|
+nvmem-lan9662-otpc-y := lan9662-otpc.o
|
||||||
|
obj-$(CONFIG_NVMEM_LAYERSCAPE_SFP) += nvmem-layerscape-sfp.o
|
||||||
|
nvmem-layerscape-sfp-y := layerscape-sfp.o
|
||||||
|
obj-$(CONFIG_NVMEM_LPC18XX_EEPROM) += nvmem_lpc18xx_eeprom.o
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/nvmem/lan9662-otpc.c
|
||||||
|
@@ -0,0 +1,222 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0
|
||||||
|
+
|
||||||
|
+#include <linux/iopoll.h>
|
||||||
|
+#include <linux/module.h>
|
||||||
|
+#include <linux/nvmem-provider.h>
|
||||||
|
+#include <linux/of.h>
|
||||||
|
+#include <linux/platform_device.h>
|
||||||
|
+
|
||||||
|
+#define OTP_OTP_PWR_DN(t) (t + 0x00)
|
||||||
|
+#define OTP_OTP_PWR_DN_OTP_PWRDN_N BIT(0)
|
||||||
|
+#define OTP_OTP_ADDR_HI(t) (t + 0x04)
|
||||||
|
+#define OTP_OTP_ADDR_LO(t) (t + 0x08)
|
||||||
|
+#define OTP_OTP_PRGM_DATA(t) (t + 0x10)
|
||||||
|
+#define OTP_OTP_PRGM_MODE(t) (t + 0x14)
|
||||||
|
+#define OTP_OTP_PRGM_MODE_OTP_PGM_MODE_BYTE BIT(0)
|
||||||
|
+#define OTP_OTP_RD_DATA(t) (t + 0x18)
|
||||||
|
+#define OTP_OTP_FUNC_CMD(t) (t + 0x20)
|
||||||
|
+#define OTP_OTP_FUNC_CMD_OTP_PROGRAM BIT(1)
|
||||||
|
+#define OTP_OTP_FUNC_CMD_OTP_READ BIT(0)
|
||||||
|
+#define OTP_OTP_CMD_GO(t) (t + 0x28)
|
||||||
|
+#define OTP_OTP_CMD_GO_OTP_GO BIT(0)
|
||||||
|
+#define OTP_OTP_PASS_FAIL(t) (t + 0x2c)
|
||||||
|
+#define OTP_OTP_PASS_FAIL_OTP_READ_PROHIBITED BIT(3)
|
||||||
|
+#define OTP_OTP_PASS_FAIL_OTP_WRITE_PROHIBITED BIT(2)
|
||||||
|
+#define OTP_OTP_PASS_FAIL_OTP_FAIL BIT(0)
|
||||||
|
+#define OTP_OTP_STATUS(t) (t + 0x30)
|
||||||
|
+#define OTP_OTP_STATUS_OTP_CPUMPEN BIT(1)
|
||||||
|
+#define OTP_OTP_STATUS_OTP_BUSY BIT(0)
|
||||||
|
+
|
||||||
|
+#define OTP_MEM_SIZE 8192
|
||||||
|
+#define OTP_SLEEP_US 10
|
||||||
|
+#define OTP_TIMEOUT_US 500000
|
||||||
|
+
|
||||||
|
+struct lan9662_otp {
|
||||||
|
+ struct device *dev;
|
||||||
|
+ void __iomem *base;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static bool lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag)
|
||||||
|
+{
|
||||||
|
+ u32 val;
|
||||||
|
+
|
||||||
|
+ return readl_poll_timeout(reg, val, !(val & flag),
|
||||||
|
+ OTP_SLEEP_US, OTP_TIMEOUT_US);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_power(struct lan9662_otp *otp, bool up)
|
||||||
|
+{
|
||||||
|
+ void __iomem *pwrdn = OTP_OTP_PWR_DN(otp->base);
|
||||||
|
+
|
||||||
|
+ if (up) {
|
||||||
|
+ writel(readl(pwrdn) & ~OTP_OTP_PWR_DN_OTP_PWRDN_N, pwrdn);
|
||||||
|
+ if (lan9662_otp_wait_flag_clear(OTP_OTP_STATUS(otp->base),
|
||||||
|
+ OTP_OTP_STATUS_OTP_CPUMPEN))
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
+ } else {
|
||||||
|
+ writel(readl(pwrdn) | OTP_OTP_PWR_DN_OTP_PWRDN_N, pwrdn);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_execute(struct lan9662_otp *otp)
|
||||||
|
+{
|
||||||
|
+ if (lan9662_otp_wait_flag_clear(OTP_OTP_CMD_GO(otp->base),
|
||||||
|
+ OTP_OTP_CMD_GO_OTP_GO))
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
+
|
||||||
|
+ if (lan9662_otp_wait_flag_clear(OTP_OTP_STATUS(otp->base),
|
||||||
|
+ OTP_OTP_STATUS_OTP_BUSY))
|
||||||
|
+ return -ETIMEDOUT;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void lan9662_otp_set_address(struct lan9662_otp *otp, u32 offset)
|
||||||
|
+{
|
||||||
|
+ writel(0xff & (offset >> 8), OTP_OTP_ADDR_HI(otp->base));
|
||||||
|
+ writel(0xff & offset, OTP_OTP_ADDR_LO(otp->base));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_read_byte(struct lan9662_otp *otp, u32 offset, u8 *dst)
|
||||||
|
+{
|
||||||
|
+ u32 pass;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_set_address(otp, offset);
|
||||||
|
+ writel(OTP_OTP_FUNC_CMD_OTP_READ, OTP_OTP_FUNC_CMD(otp->base));
|
||||||
|
+ writel(OTP_OTP_CMD_GO_OTP_GO, OTP_OTP_CMD_GO(otp->base));
|
||||||
|
+ rc = lan9662_otp_execute(otp);
|
||||||
|
+ if (!rc) {
|
||||||
|
+ pass = readl(OTP_OTP_PASS_FAIL(otp->base));
|
||||||
|
+ if (pass & OTP_OTP_PASS_FAIL_OTP_READ_PROHIBITED)
|
||||||
|
+ return -EACCES;
|
||||||
|
+ *dst = (u8) readl(OTP_OTP_RD_DATA(otp->base));
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_write_byte(struct lan9662_otp *otp, u32 offset, u8 data)
|
||||||
|
+{
|
||||||
|
+ u32 pass;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_set_address(otp, offset);
|
||||||
|
+ writel(OTP_OTP_PRGM_MODE_OTP_PGM_MODE_BYTE, OTP_OTP_PRGM_MODE(otp->base));
|
||||||
|
+ writel(data, OTP_OTP_PRGM_DATA(otp->base));
|
||||||
|
+ writel(OTP_OTP_FUNC_CMD_OTP_PROGRAM, OTP_OTP_FUNC_CMD(otp->base));
|
||||||
|
+ writel(OTP_OTP_CMD_GO_OTP_GO, OTP_OTP_CMD_GO(otp->base));
|
||||||
|
+
|
||||||
|
+ rc = lan9662_otp_execute(otp);
|
||||||
|
+ if (!rc) {
|
||||||
|
+ pass = readl(OTP_OTP_PASS_FAIL(otp->base));
|
||||||
|
+ if (pass & OTP_OTP_PASS_FAIL_OTP_WRITE_PROHIBITED)
|
||||||
|
+ return -EACCES;
|
||||||
|
+ if (pass & OTP_OTP_PASS_FAIL_OTP_FAIL)
|
||||||
|
+ return -EIO;
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_read(void *context, unsigned int offset,
|
||||||
|
+ void *_val, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct lan9662_otp *otp = context;
|
||||||
|
+ u8 *val = _val;
|
||||||
|
+ uint8_t data;
|
||||||
|
+ int i, rc = 0;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_power(otp, true);
|
||||||
|
+ for (i = 0; i < bytes; i++) {
|
||||||
|
+ rc = lan9662_otp_read_byte(otp, offset + i, &data);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ break;
|
||||||
|
+ *val++ = data;
|
||||||
|
+ }
|
||||||
|
+ lan9662_otp_power(otp, false);
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_write(void *context, unsigned int offset,
|
||||||
|
+ void *_val, size_t bytes)
|
||||||
|
+{
|
||||||
|
+ struct lan9662_otp *otp = context;
|
||||||
|
+ u8 *val = _val;
|
||||||
|
+ u8 data, newdata;
|
||||||
|
+ int i, rc = 0;
|
||||||
|
+
|
||||||
|
+ lan9662_otp_power(otp, true);
|
||||||
|
+ for (i = 0; i < bytes; i++) {
|
||||||
|
+ /* Skip zero bytes */
|
||||||
|
+ if (val[i]) {
|
||||||
|
+ rc = lan9662_otp_read_byte(otp, offset + i, &data);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ newdata = data | val[i];
|
||||||
|
+ if (newdata == data)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ rc = lan9662_otp_write_byte(otp, offset + i,
|
||||||
|
+ newdata);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ lan9662_otp_power(otp, false);
|
||||||
|
+
|
||||||
|
+ return rc;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct nvmem_config otp_config = {
|
||||||
|
+ .name = "lan9662-otp",
|
||||||
|
+ .stride = 1,
|
||||||
|
+ .word_size = 1,
|
||||||
|
+ .reg_read = lan9662_otp_read,
|
||||||
|
+ .reg_write = lan9662_otp_write,
|
||||||
|
+ .size = OTP_MEM_SIZE,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int lan9662_otp_probe(struct platform_device *pdev)
|
||||||
|
+{
|
||||||
|
+ struct device *dev = &pdev->dev;
|
||||||
|
+ struct nvmem_device *nvmem;
|
||||||
|
+ struct lan9662_otp *otp;
|
||||||
|
+
|
||||||
|
+ otp = devm_kzalloc(&pdev->dev, sizeof(*otp), GFP_KERNEL);
|
||||||
|
+ if (!otp)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ otp->dev = dev;
|
||||||
|
+ otp->base = devm_platform_ioremap_resource(pdev, 0);
|
||||||
|
+ if (IS_ERR(otp->base))
|
||||||
|
+ return PTR_ERR(otp->base);
|
||||||
|
+
|
||||||
|
+ otp_config.priv = otp;
|
||||||
|
+ otp_config.dev = dev;
|
||||||
|
+
|
||||||
|
+ nvmem = devm_nvmem_register(dev, &otp_config);
|
||||||
|
+
|
||||||
|
+ return PTR_ERR_OR_ZERO(nvmem);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct of_device_id lan9662_otp_match[] = {
|
||||||
|
+ { .compatible = "microchip,lan9662-otp", },
|
||||||
|
+ { },
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(of, lan9662_otp_match);
|
||||||
|
+
|
||||||
|
+static struct platform_driver lan9662_otp_driver = {
|
||||||
|
+ .probe = lan9662_otp_probe,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "lan9662-otp",
|
||||||
|
+ .of_match_table = lan9662_otp_match,
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_platform_driver(lan9662_otp_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Horatiu Vultur <horatiu.vultur@microchip.com>");
|
||||||
|
+MODULE_DESCRIPTION("lan9662 OTP driver");
|
||||||
|
+MODULE_LICENSE("GPL");
|
@ -1,6 +1,6 @@
|
|||||||
From 60bbaad38109684b156e21112322e0a922f92cde Mon Sep 17 00:00:00 2001
|
From 3717ca3e0cc8683f93b41d3f06ca79631eb58715 Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Thu, 18 Aug 2022 06:38:37 +0200
|
Date: Fri, 16 Sep 2022 13:21:00 +0100
|
||||||
Subject: [PATCH] nvmem: u-boot-env: fix crc32 casting type
|
Subject: [PATCH] nvmem: u-boot-env: fix crc32 casting type
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -9,10 +9,12 @@ Content-Transfer-Encoding: 8bit
|
|||||||
This fixes:
|
This fixes:
|
||||||
drivers/nvmem/u-boot-env.c:141:17: sparse: sparse: cast to restricted __le32
|
drivers/nvmem/u-boot-env.c:141:17: sparse: sparse: cast to restricted __le32
|
||||||
|
|
||||||
|
Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables")
|
||||||
Reported-by: kernel test robot <lkp@intel.com>
|
Reported-by: kernel test robot <lkp@intel.com>
|
||||||
Fixes: f955dc1445069 ("nvmem: add driver handling U-Boot environment variables")
|
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20220916122100.170016-14-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 2 +-
|
drivers/nvmem/u-boot-env.c | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
@ -0,0 +1,34 @@
|
|||||||
|
From 1aeb122d214b92474c86fde00a03d6e2d69381b5 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Date: Wed, 28 Sep 2022 21:51:12 +0200
|
||||||
|
Subject: [PATCH] nvmem: lan9662-otp: Fix compatible string
|
||||||
|
|
||||||
|
The device tree bindings for lan9662-otp expects the compatible string
|
||||||
|
to be one of following compatible strings:
|
||||||
|
microchip,lan9662-otpc
|
||||||
|
microchip,lan9668-otpc
|
||||||
|
|
||||||
|
The problem is that the lan9662-otp driver contains the
|
||||||
|
microchip,lan9662-otp compatible string instead of
|
||||||
|
microchip,lan9662-otpc.
|
||||||
|
Fix this by updating the compatible string in the driver.
|
||||||
|
|
||||||
|
Fixes: 9e8f208ad5229d ("nvmem: lan9662-otp: add support")
|
||||||
|
Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Link: https://lore.kernel.org/r/20220928195112.630351-1-horatiu.vultur@microchip.com
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/lan9662-otpc.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/lan9662-otpc.c
|
||||||
|
+++ b/drivers/nvmem/lan9662-otpc.c
|
||||||
|
@@ -203,7 +203,7 @@ static int lan9662_otp_probe(struct plat
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct of_device_id lan9662_otp_match[] = {
|
||||||
|
- { .compatible = "microchip,lan9662-otp", },
|
||||||
|
+ { .compatible = "microchip,lan9662-otpc", },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(of, lan9662_otp_match);
|
@ -1,4 +1,4 @@
|
|||||||
From 7a69ff9c9bde03a690ea783970f664782fc303d8 Mon Sep 17 00:00:00 2001
|
From ee424f7d3960152f5f862bbb6943e59828dc7917 Mon Sep 17 00:00:00 2001
|
||||||
From: Christian Lamparter <chunkeey@gmail.com>
|
From: Christian Lamparter <chunkeey@gmail.com>
|
||||||
Date: Fri, 4 Nov 2022 17:52:03 +0100
|
Date: Fri, 4 Nov 2022 17:52:03 +0100
|
||||||
Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant
|
Subject: [PATCH] nvmem: u-boot-env: fix crc32_data_offset on redundant
|
||||||
@ -37,8 +37,11 @@ crc32 sum... which is unfortunate :(
|
|||||||
|
|
|
|
||||||
|
|
||||||
[0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951
|
[0] https://github.com/sbabic/libubootenv/blob/master/src/uboot_env.c#L951
|
||||||
|
|
||||||
Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables")
|
Fixes: d5542923f200 ("nvmem: add driver handling U-Boot environment variables")
|
||||||
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/70a16eae113e08db2390b76e174f4837caa135c3.1667580636.git.chunkeey@gmail.com
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 2 +-
|
drivers/nvmem/u-boot-env.c | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
@ -0,0 +1,35 @@
|
|||||||
|
From 022b68f271de0e53024e6d5e96fee8e76d25eb95 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:38:40 +0000
|
||||||
|
Subject: [PATCH] nvmem: lan9662-otp: Change return type of
|
||||||
|
lan9662_otp_wait_flag_clear()
|
||||||
|
|
||||||
|
The blamed commit introduced the following smatch warning in the
|
||||||
|
function lan9662_otp_wait_flag_clear:
|
||||||
|
drivers/nvmem/lan9662-otpc.c:43 lan9662_otp_wait_flag_clear() warn: signedness bug returning '(-110)'
|
||||||
|
|
||||||
|
Fix this by changing the return type of the function
|
||||||
|
lan9662_otp_wait_flag_clear() to be int instead of bool.
|
||||||
|
|
||||||
|
Fixes: 9e8f208ad5229d ("nvmem: lan9662-otp: add support")
|
||||||
|
Reported-by: kernel test robot <lkp@intel.com>
|
||||||
|
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||||
|
Signed-off-by: Horatiu Vultur <horatiu.vultur@microchip.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063840.6357-5-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/lan9662-otpc.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/lan9662-otpc.c
|
||||||
|
+++ b/drivers/nvmem/lan9662-otpc.c
|
||||||
|
@@ -36,7 +36,7 @@ struct lan9662_otp {
|
||||||
|
void __iomem *base;
|
||||||
|
};
|
||||||
|
|
||||||
|
-static bool lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag)
|
||||||
|
+static int lan9662_otp_wait_flag_clear(void __iomem *reg, u32 flag)
|
||||||
|
{
|
||||||
|
u32 val;
|
||||||
|
|
@ -0,0 +1,82 @@
|
|||||||
|
From fbfc4ca465a1f8d81bf2d67d95bf7fc67c3cf0c2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:20 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: move STM32MP15_BSEC_NUM_LOWER in config
|
||||||
|
|
||||||
|
Support STM32MP15_BSEC_NUM_LOWER in stm32 romem config to prepare
|
||||||
|
the next SoC in STM32MP family.
|
||||||
|
|
||||||
|
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-2-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 21 ++++++++++++++++-----
|
||||||
|
1 file changed, 16 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -22,16 +22,15 @@
|
||||||
|
/* shadow registers offest */
|
||||||
|
#define STM32MP15_BSEC_DATA0 0x200
|
||||||
|
|
||||||
|
-/* 32 (x 32-bits) lower shadow registers */
|
||||||
|
-#define STM32MP15_BSEC_NUM_LOWER 32
|
||||||
|
-
|
||||||
|
struct stm32_romem_cfg {
|
||||||
|
int size;
|
||||||
|
+ u8 lower;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct stm32_romem_priv {
|
||||||
|
void __iomem *base;
|
||||||
|
struct nvmem_config cfg;
|
||||||
|
+ u8 lower;
|
||||||
|
};
|
||||||
|
|
||||||
|
static int stm32_romem_read(void *context, unsigned int offset, void *buf,
|
||||||
|
@@ -85,7 +84,7 @@ static int stm32_bsec_read(void *context
|
||||||
|
for (i = roffset; (i < roffset + rbytes); i += 4) {
|
||||||
|
u32 otp = i >> 2;
|
||||||
|
|
||||||
|
- if (otp < STM32MP15_BSEC_NUM_LOWER) {
|
||||||
|
+ if (otp < priv->lower) {
|
||||||
|
/* read lower data from shadow registers */
|
||||||
|
val = readl_relaxed(
|
||||||
|
priv->base + STM32MP15_BSEC_DATA0 + i);
|
||||||
|
@@ -159,6 +158,8 @@ static int stm32_romem_probe(struct plat
|
||||||
|
priv->cfg.priv = priv;
|
||||||
|
priv->cfg.owner = THIS_MODULE;
|
||||||
|
|
||||||
|
+ priv->lower = 0;
|
||||||
|
+
|
||||||
|
cfg = (const struct stm32_romem_cfg *)
|
||||||
|
of_match_device(dev->driver->of_match_table, dev)->data;
|
||||||
|
if (!cfg) {
|
||||||
|
@@ -167,6 +168,7 @@ static int stm32_romem_probe(struct plat
|
||||||
|
priv->cfg.reg_read = stm32_romem_read;
|
||||||
|
} else {
|
||||||
|
priv->cfg.size = cfg->size;
|
||||||
|
+ priv->lower = cfg->lower;
|
||||||
|
priv->cfg.reg_read = stm32_bsec_read;
|
||||||
|
priv->cfg.reg_write = stm32_bsec_write;
|
||||||
|
}
|
||||||
|
@@ -174,8 +176,17 @@ static int stm32_romem_probe(struct plat
|
||||||
|
return PTR_ERR_OR_ZERO(devm_nvmem_register(dev, &priv->cfg));
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * STM32MP15 BSEC OTP regions: 4096 OTP bits (with 3072 effective bits)
|
||||||
|
+ * => 96 x 32-bits data words
|
||||||
|
+ * - Lower: 1K bits, 2:1 redundancy, incremental bit programming
|
||||||
|
+ * => 32 (x 32-bits) lower shadow registers = words 0 to 31
|
||||||
|
+ * - Upper: 2K bits, ECC protection, word programming only
|
||||||
|
+ * => 64 (x 32-bits) = words 32 to 95
|
||||||
|
+ */
|
||||||
|
static const struct stm32_romem_cfg stm32mp15_bsec_cfg = {
|
||||||
|
- .size = 384, /* 96 x 32-bits data words */
|
||||||
|
+ .size = 384,
|
||||||
|
+ .lower = 32,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct of_device_id stm32_romem_of_match[] = {
|
@ -0,0 +1,34 @@
|
|||||||
|
From d61784e6410f3df2028e6eb91b06ffed37a660e0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:21 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: add warning when upper OTPs are updated
|
||||||
|
|
||||||
|
As the upper OTPs are ECC protected, they support only one 32 bits word
|
||||||
|
programming.
|
||||||
|
For a second modification of this word, these ECC become invalid and
|
||||||
|
this OTP will be no more accessible, the shadowed value is invalid.
|
||||||
|
|
||||||
|
This patch adds a warning to indicate an upper OTP update, because this
|
||||||
|
operation is dangerous as OTP is not locked by the driver after the first
|
||||||
|
update to avoid a second update.
|
||||||
|
|
||||||
|
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-3-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -132,6 +132,9 @@ static int stm32_bsec_write(void *contex
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (offset + bytes >= priv->lower * 4)
|
||||||
|
+ dev_warn(dev, "Update of upper OTPs with ECC protection (word programming, only once)\n");
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
From a3816a7d7c097c1da46aad5f5d1e229b607dce04 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:22 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: add nvmem type attribute
|
||||||
|
|
||||||
|
Inform NVMEM framework of type attribute for stm32-romem as NVMEM_TYPE_OTP
|
||||||
|
so userspace is able to know how the data is stored in BSEC.
|
||||||
|
|
||||||
|
Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-4-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -160,6 +160,7 @@ static int stm32_romem_probe(struct plat
|
||||||
|
priv->cfg.dev = dev;
|
||||||
|
priv->cfg.priv = priv;
|
||||||
|
priv->cfg.owner = THIS_MODULE;
|
||||||
|
+ priv->cfg.type = NVMEM_TYPE_OTP;
|
||||||
|
|
||||||
|
priv->lower = 0;
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
From 06aac0e11960a7ddccc1888326b5906d017e0f24 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jiangshan Yi <yijiangshan@kylinos.cn>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:24 +0000
|
||||||
|
Subject: [PATCH] nvmem: stm32: fix spelling typo in comment
|
||||||
|
|
||||||
|
Fix spelling typo in comment.
|
||||||
|
|
||||||
|
Reported-by: k2ci <kernel-bot@kylinos.cn>
|
||||||
|
Signed-off-by: Jiangshan Yi <yijiangshan@kylinos.cn>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-6-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/stm32-romem.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/stm32-romem.c
|
||||||
|
+++ b/drivers/nvmem/stm32-romem.c
|
||||||
|
@@ -19,7 +19,7 @@
|
||||||
|
#define STM32_SMC_WRITE_SHADOW 0x03
|
||||||
|
#define STM32_SMC_READ_OTP 0x04
|
||||||
|
|
||||||
|
-/* shadow registers offest */
|
||||||
|
+/* shadow registers offset */
|
||||||
|
#define STM32MP15_BSEC_DATA0 0x200
|
||||||
|
|
||||||
|
struct stm32_romem_cfg {
|
@ -0,0 +1,27 @@
|
|||||||
|
From fb817c4ef63e8cfb6e77ae4a2875ae854c80708f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Colin Ian King <colin.i.king@gmail.com>
|
||||||
|
Date: Fri, 18 Nov 2022 06:39:26 +0000
|
||||||
|
Subject: [PATCH] nvmem: Kconfig: Fix spelling mistake "controlls" ->
|
||||||
|
"controls"
|
||||||
|
|
||||||
|
There is a spelling mistake in a Kconfig description. Fix it.
|
||||||
|
|
||||||
|
Signed-off-by: Colin Ian King <colin.i.king@gmail.com>
|
||||||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-8-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
|
---
|
||||||
|
drivers/nvmem/Kconfig | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
--- a/drivers/nvmem/Kconfig
|
||||||
|
+++ b/drivers/nvmem/Kconfig
|
||||||
|
@@ -164,7 +164,7 @@ config NVMEM_MICROCHIP_OTPC
|
||||||
|
depends on ARCH_AT91 || COMPILE_TEST
|
||||||
|
help
|
||||||
|
This driver enable the OTP controller available on Microchip SAMA7G5
|
||||||
|
- SoCs. It controlls the access to the OTP memory connected to it.
|
||||||
|
+ SoCs. It controls the access to the OTP memory connected to it.
|
||||||
|
|
||||||
|
config NVMEM_MTK_EFUSE
|
||||||
|
tristate "Mediatek SoCs EFUSE support"
|
@ -1,6 +1,6 @@
|
|||||||
From 5b4eaafbeac472fc19049152f18e88aecb2b2829 Mon Sep 17 00:00:00 2001
|
From ada84d07af6097b2addd18262668ce6cb9e15206 Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
|
||||||
Date: Mon, 17 Oct 2022 09:17:22 +0200
|
Date: Fri, 18 Nov 2022 06:39:27 +0000
|
||||||
Subject: [PATCH] nvmem: u-boot-env: add Broadcom format support
|
Subject: [PATCH] nvmem: u-boot-env: add Broadcom format support
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
@ -15,6 +15,8 @@ Add support for Broadcom's specific binding and their custom format.
|
|||||||
Ref: 6b0584c19d87 ("dt-bindings: nvmem: u-boot,env: add Broadcom's variant binding")
|
Ref: 6b0584c19d87 ("dt-bindings: nvmem: u-boot,env: add Broadcom's variant binding")
|
||||||
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
|
||||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20221118063932.6418-9-srinivas.kandagatla@linaro.org
|
||||||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||||
---
|
---
|
||||||
drivers/nvmem/u-boot-env.c | 14 ++++++++++++++
|
drivers/nvmem/u-boot-env.c | 14 ++++++++++++++
|
||||||
1 file changed, 14 insertions(+)
|
1 file changed, 14 insertions(+)
|
@ -36,7 +36,7 @@ Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
|||||||
|
|
||||||
--- a/drivers/nvmem/u-boot-env.c
|
--- a/drivers/nvmem/u-boot-env.c
|
||||||
+++ b/drivers/nvmem/u-boot-env.c
|
+++ b/drivers/nvmem/u-boot-env.c
|
||||||
@@ -143,7 +143,7 @@ static int u_boot_env_parse(struct u_boo
|
@@ -156,7 +156,7 @@ static int u_boot_env_parse(struct u_boo
|
||||||
crc32_data_len = priv->mtd->size - crc32_data_offset;
|
crc32_data_len = priv->mtd->size - crc32_data_offset;
|
||||||
data_len = priv->mtd->size - data_offset;
|
data_len = priv->mtd->size - data_offset;
|
||||||
|
|
@ -541,6 +541,7 @@ CONFIG_NUMA=y
|
|||||||
CONFIG_NUMA_BALANCING=y
|
CONFIG_NUMA_BALANCING=y
|
||||||
CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y
|
CONFIG_NUMA_BALANCING_DEFAULT_ENABLED=y
|
||||||
CONFIG_NVMEM=y
|
CONFIG_NVMEM=y
|
||||||
|
# CONFIG_NVMEM_LAYERSCAPE_SFP is not set
|
||||||
# CONFIG_NVMEM_SPMI_SDAM is not set
|
# CONFIG_NVMEM_SPMI_SDAM is not set
|
||||||
CONFIG_NVMEM_SYSFS=y
|
CONFIG_NVMEM_SYSFS=y
|
||||||
CONFIG_OF=y
|
CONFIG_OF=y
|
||||||
|
Loading…
x
Reference in New Issue
Block a user