W1-EEPROM: add sandbox driver
authorEugen Hristev <eugen.hristev@microchip.com>
Tue, 18 Sep 2018 07:35:31 +0000 (10:35 +0300)
committerTom Rini <trini@konsulko.com>
Sat, 29 Sep 2018 00:22:36 +0000 (20:22 -0400)
Add a sandbox driver for a one wire EEPROM memory

Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
drivers/w1-eeprom/Kconfig
drivers/w1-eeprom/Makefile
drivers/w1-eeprom/eep_sandbox.c [new file with mode: 0644]
include/w1.h

index 20ec5498b4dd94c180d1e4511f6b792ebd93991a..4b7f3c4e0b84f29e0f61a9158a28b2f422fbc38f 100644 (file)
@@ -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
index 3f4aa1383e953de55c0ca3c2609d7e1c40f759a9..03cc4c8ac8db79b56db9e00d6f21ace715773432 100644 (file)
@@ -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 (file)
index 0000000..27c7f9f
--- /dev/null
@@ -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,
+};
index b36e0f8d5d4c88da4979331905d63f07eaf5f644..399177a12e34b5c651f0373905d35d950c3763ff 100644 (file)
@@ -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;