1 /* SPDX-License-Identifier: GPL-2.0+ 2 * 3 * Copyright (c) 2018 Microchip Technology, Inc. 4 * 5 */ 6 7 #include <common.h> 8 #include <linux/err.h> 9 #include <dm.h> 10 #include <w1-eeprom.h> 11 #include <w1.h> 12 13 #define W1_F2D_READ_EEPROM 0xf0 14 15 #define EEP_SANDBOX_SAMPLE_MEM "this is a sample EEPROM memory string." 16 17 static int eep_sandbox_read_buf(struct udevice *dev, unsigned int offset, 18 u8 *buf, unsigned int count) 19 { 20 /* do not allow to copy more than our maximum sample string */ 21 if (offset + count < strlen(EEP_SANDBOX_SAMPLE_MEM)) { 22 offset = 0; 23 count = strlen(EEP_SANDBOX_SAMPLE_MEM); 24 } 25 strncpy((char *)buf, EEP_SANDBOX_SAMPLE_MEM, count); 26 27 /* 28 * in case the w1 subsystem uses some different kind of sandbox testing, 29 * like randomized gpio values , we take the buffer from there 30 */ 31 32 w1_reset_select(dev); 33 34 w1_write_byte(dev, W1_F2D_READ_EEPROM); 35 w1_write_byte(dev, offset & 0xff); 36 w1_write_byte(dev, offset >> 8); 37 38 w1_read_buf(dev, buf, count); 39 40 /* 41 * even if read buf from w1 fails, return success as we hardcoded 42 * the buffer. 43 */ 44 return 0; 45 } 46 47 static const struct w1_eeprom_ops eep_sandbox_ops = { 48 .read_buf = eep_sandbox_read_buf, 49 }; 50 51 static const struct udevice_id eep_sandbox_id[] = { 52 { .compatible = "sandbox,w1-eeprom", .data = W1_FAMILY_EEP_SANDBOX }, 53 { }, 54 }; 55 56 U_BOOT_DRIVER(eep_sandbox) = { 57 .name = "eep_sandbox", 58 .id = UCLASS_W1_EEPROM, 59 .of_match = eep_sandbox_id, 60 .ops = &eep_sandbox_ops, 61 }; 62