mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 09:12:39 +00:00
88 lines
2.8 KiB
Diff
88 lines
2.8 KiB
Diff
|
From 044ee8f85267599a9b0112911f5c16d4548b4289 Mon Sep 17 00:00:00 2001
|
||
|
From: Evan Green <evgreen@chromium.org>
|
||
|
Date: Fri, 27 Nov 2020 10:28:36 +0000
|
||
|
Subject: [PATCH] nvmem: qfprom: Don't touch certain fuses
|
||
|
|
||
|
Some fuse ranges are protected by the XPU such that the AP cannot
|
||
|
access them. Attempting to do so causes an SError. Use the newly
|
||
|
introduced per-soc compatible string, and the newly introduced
|
||
|
nvmem keepout support to attach the set of regions
|
||
|
we should not access.
|
||
|
|
||
|
Reviewed-by: Douglas Anderson <dianders@chromium.org>
|
||
|
Signed-off-by: Evan Green <evgreen@chromium.org>
|
||
|
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||
|
Link: https://lore.kernel.org/r/20201127102837.19366-5-srinivas.kandagatla@linaro.org
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
---
|
||
|
drivers/nvmem/qfprom.c | 30 ++++++++++++++++++++++++++++++
|
||
|
1 file changed, 30 insertions(+)
|
||
|
|
||
|
--- a/drivers/nvmem/qfprom.c
|
||
|
+++ b/drivers/nvmem/qfprom.c
|
||
|
@@ -12,6 +12,7 @@
|
||
|
#include <linux/mod_devicetable.h>
|
||
|
#include <linux/nvmem-provider.h>
|
||
|
#include <linux/platform_device.h>
|
||
|
+#include <linux/property.h>
|
||
|
#include <linux/regulator/consumer.h>
|
||
|
|
||
|
/* Blow timer clock frequency in Mhz */
|
||
|
@@ -89,6 +90,28 @@ struct qfprom_touched_values {
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
+ * struct qfprom_soc_compatible_data - Data matched against the SoC
|
||
|
+ * compatible string.
|
||
|
+ *
|
||
|
+ * @keepout: Array of keepout regions for this SoC.
|
||
|
+ * @nkeepout: Number of elements in the keepout array.
|
||
|
+ */
|
||
|
+struct qfprom_soc_compatible_data {
|
||
|
+ const struct nvmem_keepout *keepout;
|
||
|
+ unsigned int nkeepout;
|
||
|
+};
|
||
|
+
|
||
|
+static const struct nvmem_keepout sc7180_qfprom_keepout[] = {
|
||
|
+ {.start = 0x128, .end = 0x148},
|
||
|
+ {.start = 0x220, .end = 0x228}
|
||
|
+};
|
||
|
+
|
||
|
+static const struct qfprom_soc_compatible_data sc7180_qfprom = {
|
||
|
+ .keepout = sc7180_qfprom_keepout,
|
||
|
+ .nkeepout = ARRAY_SIZE(sc7180_qfprom_keepout)
|
||
|
+};
|
||
|
+
|
||
|
+/**
|
||
|
* qfprom_disable_fuse_blowing() - Undo enabling of fuse blowing.
|
||
|
* @priv: Our driver data.
|
||
|
* @old: The data that was stashed from before fuse blowing.
|
||
|
@@ -302,6 +325,7 @@ static int qfprom_probe(struct platform_
|
||
|
struct device *dev = &pdev->dev;
|
||
|
struct resource *res;
|
||
|
struct nvmem_device *nvmem;
|
||
|
+ const struct qfprom_soc_compatible_data *soc_data;
|
||
|
struct qfprom_priv *priv;
|
||
|
int ret;
|
||
|
|
||
|
@@ -320,6 +344,11 @@ static int qfprom_probe(struct platform_
|
||
|
econfig.priv = priv;
|
||
|
|
||
|
priv->dev = dev;
|
||
|
+ soc_data = device_get_match_data(dev);
|
||
|
+ if (soc_data) {
|
||
|
+ econfig.keepout = soc_data->keepout;
|
||
|
+ econfig.nkeepout = soc_data->nkeepout;
|
||
|
+ }
|
||
|
|
||
|
/*
|
||
|
* If more than one region is provided then the OS has the ability
|
||
|
@@ -375,6 +404,7 @@ static int qfprom_probe(struct platform_
|
||
|
|
||
|
static const struct of_device_id qfprom_of_match[] = {
|
||
|
{ .compatible = "qcom,qfprom",},
|
||
|
+ { .compatible = "qcom,sc7180-qfprom", .data = &sc7180_qfprom},
|
||
|
{/* sentinel */},
|
||
|
};
|
||
|
MODULE_DEVICE_TABLE(of, qfprom_of_match);
|