diff mbox series

[v2,26/29] soc: realtek: chip: Detect RTD1294

Message ID 20200623025106.31273-27-afaerber@suse.de (mailing list archive)
State New, archived
Headers show
Series ARM: Realtek DHC SoC info | expand

Commit Message

Andreas Färber June 23, 2020, 2:51 a.m. UTC
Detection logic from downstream include/soc/realtek/rtd129x_cpu.h.

Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 Note: We don't have any RTD1294 .dtsi/.dts yet.
 
 v1 -> v2:
 * Instead of direct eFuse register access use nvmem cell API
 * Warn on errors other than deferred probing
 
 drivers/soc/realtek/chip.c | 39 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

Comments

Stanley Chang[昌育德] July 10, 2020, 8:07 a.m. UTC | #1
Reviewed-by: Stanley Chang <stanley_chang@realtek.com>

Thanks,
Stanley
diff mbox series

Patch

diff --git a/drivers/soc/realtek/chip.c b/drivers/soc/realtek/chip.c
index 9cee760bac35..bed028ce1b16 100644
--- a/drivers/soc/realtek/chip.c
+++ b/drivers/soc/realtek/chip.c
@@ -10,6 +10,7 @@ 
 #include <linux/io.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
+#include <linux/nvmem-consumer.h>
 #include <linux/of.h>
 #include <linux/of_address.h>
 #include <linux/platform_device.h>
@@ -26,6 +27,8 @@ 
 
 #define REG_ISO_CHIP_INFO1	0x028
 
+#define REG_EFUSE_PACKAGE_ID	0x1d8
+
 struct dhc_soc_revision {
 	const char *name;
 	u16 chip_rev;
@@ -76,6 +79,33 @@  struct dhc_soc {
 	const char *codename;
 };
 
+static int dhc_efuse_read_u8(struct device *dev, const char *cell_id, u8 *val)
+{
+	struct nvmem_cell *cell;
+	void *buf;
+	size_t len;
+
+	cell = nvmem_cell_get(dev, cell_id);
+	if (IS_ERR(cell))
+		return PTR_ERR(cell);
+
+	buf = nvmem_cell_read(cell, &len);
+	if (IS_ERR(buf)) {
+		nvmem_cell_put(cell);
+		return PTR_ERR(buf);
+	}
+	if (len != sizeof(*val)) {
+		kfree(buf);
+		nvmem_cell_put(cell);
+		return -EINVAL;
+	}
+	memcpy(val, buf, 1);
+	kfree(buf);
+	nvmem_cell_put(cell);
+
+	return 0;
+}
+
 static const char *default_name(struct device *dev, const struct dhc_soc *s)
 {
 	return s->family;
@@ -86,6 +116,15 @@  static const char *rtd1295_name(struct device *dev, const struct dhc_soc *s)
 	struct regmap *regmap;
 	unsigned int val;
 	int ret;
+	u8 b;
+
+	ret = dhc_efuse_read_u8(dev, "efuse_package_id", &b);
+	if (ret == -EPROBE_DEFER)
+		return ERR_PTR(ret);
+	else if (ret)
+		dev_warn(dev, "Could not read efuse package_id (%d)\n", ret);
+	else if (b == 0x1)
+		return "RTD1294";
 
 	regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "iso-syscon");
 	if (IS_ERR(regmap)) {