summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugen Hristev <eugen.hristev@microchip.com>2018-09-18 10:35:31 +0300
committerTom Rini <trini@konsulko.com>2018-09-28 20:22:36 -0400
commit84e55bdd8bcaba8548bedd1c0b46427e93c9ef75 (patch)
tree0badbd37bee0cab8fb8416258fae30ea178166df
parent0fb667ae19f3dca8840b5906320fc60009a895b2 (diff)
W1-EEPROM: add sandbox driver
Add a sandbox driver for a one wire EEPROM memory Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
-rw-r--r--drivers/w1-eeprom/Kconfig6
-rw-r--r--drivers/w1-eeprom/Makefile1
-rw-r--r--drivers/w1-eeprom/eep_sandbox.c61
-rw-r--r--include/w1.h1
4 files changed, 69 insertions, 0 deletions
diff --git a/drivers/w1-eeprom/Kconfig b/drivers/w1-eeprom/Kconfig
index 20ec5498b4..4b7f3c4e0b 100644
--- a/drivers/w1-eeprom/Kconfig
+++ b/drivers/w1-eeprom/Kconfig
@@ -18,6 +18,12 @@ config W1_EEPROM_DS24XXX
help
Maxim DS24 EEPROMs 1-Wire EEPROM support
+config W1_EEPROM_SANDBOX
+ bool "Enable sandbox onewire EEPROM driver"
+ depends on W1
+ help
+ Sandbox driver for a onewire EEPROM memory
+
endif
endmenu
diff --git a/drivers/w1-eeprom/Makefile b/drivers/w1-eeprom/Makefile
index 3f4aa1383e..03cc4c8ac8 100644
--- a/drivers/w1-eeprom/Makefile
+++ b/drivers/w1-eeprom/Makefile
@@ -2,3 +2,4 @@ obj-$(CONFIG_W1_EEPROM) += w1-eeprom-uclass.o
obj-$(CONFIG_W1_EEPROM_DS24XXX) += ds24xxx.o
+obj-$(CONFIG_W1_EEPROM_SANDBOX) += eep_sandbox.o
diff --git a/drivers/w1-eeprom/eep_sandbox.c b/drivers/w1-eeprom/eep_sandbox.c
new file mode 100644
index 0000000000..27c7f9f1b6
--- /dev/null
+++ b/drivers/w1-eeprom/eep_sandbox.c
@@ -0,0 +1,61 @@
+/* SPDX-License-Identifier: GPL-2.0+
+ *
+ * Copyright (c) 2018 Microchip Technology, Inc.
+ *
+ */
+
+#include <common.h>
+#include <linux/err.h>
+#include <dm.h>
+#include <w1-eeprom.h>
+#include <w1.h>
+
+#define W1_F2D_READ_EEPROM 0xf0
+
+#define EEP_SANDBOX_SAMPLE_MEM "this is a sample EEPROM memory string."
+
+static int eep_sandbox_read_buf(struct udevice *dev, unsigned int offset,
+ u8 *buf, unsigned int count)
+{
+ /* do not allow to copy more than our maximum sample string */
+ if (offset + count < strlen(EEP_SANDBOX_SAMPLE_MEM)) {
+ offset = 0;
+ count = strlen(EEP_SANDBOX_SAMPLE_MEM);
+ }
+ strncpy((char *)buf, EEP_SANDBOX_SAMPLE_MEM, count);
+
+ /*
+ * in case the w1 subsystem uses some different kind of sandbox testing,
+ * like randomized gpio values , we take the buffer from there
+ */
+
+ w1_reset_select(dev);
+
+ w1_write_byte(dev, W1_F2D_READ_EEPROM);
+ w1_write_byte(dev, offset & 0xff);
+ w1_write_byte(dev, offset >> 8);
+
+ w1_read_buf(dev, buf, count);
+
+ /*
+ * even if read buf from w1 fails, return success as we hardcoded
+ * the buffer.
+ */
+ return 0;
+}
+
+static const struct w1_eeprom_ops eep_sandbox_ops = {
+ .read_buf = eep_sandbox_read_buf,
+};
+
+static const struct udevice_id eep_sandbox_id[] = {
+ { .compatible = "sandbox,w1-eeprom", .data = W1_FAMILY_EEP_SANDBOX },
+ { },
+};
+
+U_BOOT_DRIVER(eep_sandbox) = {
+ .name = "eep_sandbox",
+ .id = UCLASS_W1_EEPROM,
+ .of_match = eep_sandbox_id,
+ .ops = &eep_sandbox_ops,
+};
diff --git a/include/w1.h b/include/w1.h
index b36e0f8d5d..399177a12e 100644
--- a/include/w1.h
+++ b/include/w1.h
@@ -12,6 +12,7 @@
#define W1_FAMILY_DS24B33 0x23
#define W1_FAMILY_DS2431 0x2d
+#define W1_FAMILY_EEP_SANDBOX 0xfe
struct w1_device {
u64 id;