1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * 4 * Copyright (c) 2015 Free Electrons 5 * Copyright (c) 2015 NextThing Co. 6 * Copyright (c) 2018 Microchip Technology, Inc. 7 * 8 * Maxime Ripard <maxime.ripard@free-electrons.com> 9 * Eugen Hristev <eugen.hristev@microchip.com> 10 * 11 */ 12 13#define LOG_CATEGORY UCLASS_W1_EEPROM 14 15#include <common.h> 16#include <dm.h> 17#include <log.h> 18#include <w1.h> 19#include <w1-eeprom.h> 20 21#include <dm/device-internal.h> 22 23int w1_eeprom_read_buf(struct udevice *dev, unsigned int offset, 24 u8 *buf, unsigned int count) 25{ 26 const struct w1_eeprom_ops *ops = device_get_ops(dev); 27 u64 id = 0; 28 int ret; 29 30 if (!ops->read_buf) 31 return -ENOSYS; 32 33 ret = w1_eeprom_get_id(dev, &id); 34 if (ret) 35 return ret; 36 if (!id) 37 return -ENODEV; 38 39 return ops->read_buf(dev, offset, buf, count); 40} 41 42int w1_eeprom_get_id(struct udevice *dev, u64 *id) 43{ 44 struct w1_device *w1 = dev_get_parent_plat(dev); 45 46 if (!w1) 47 return -ENODEV; 48 *id = w1->id; 49 50 return 0; 51} 52 53UCLASS_DRIVER(w1_eeprom) = { 54 .name = "w1_eeprom", 55 .id = UCLASS_W1_EEPROM, 56 .flags = DM_UC_FLAG_SEQ_ALIAS, 57#if CONFIG_IS_ENABLED(OF_CONTROL) 58 .post_bind = dm_scan_fdt_dev, 59#endif 60}; 61 62int w1_eeprom_dm_init(void) 63{ 64 struct udevice *dev; 65 struct uclass *uc; 66 int ret; 67 68 ret = uclass_get(UCLASS_W1_EEPROM, &uc); 69 if (ret) { 70 debug("W1_EEPROM uclass not available\n"); 71 return ret; 72 } 73 74 uclass_foreach_dev(dev, uc) { 75 ret = device_probe(dev); 76 if (ret == -ENODEV) { /* No such device. */ 77 debug("W1_EEPROM not available.\n"); 78 continue; 79 } 80 81 if (ret) { /* Other error. */ 82 printf("W1_EEPROM probe failed, error %d\n", ret); 83 continue; 84 } 85 } 86 87 return 0; 88} 89