1*0749f646SMaxime Ripard // SPDX-License-Identifier: GPL-2.0+ 2*0749f646SMaxime Ripard /* 3*0749f646SMaxime Ripard * 4*0749f646SMaxime Ripard * Copyright (c) 2015 Free Electrons 5*0749f646SMaxime Ripard * Copyright (c) 2015 NextThing Co 6*0749f646SMaxime Ripard * Copyright (c) 2018 Microchip Technology, Inc. 7*0749f646SMaxime Ripard * 8*0749f646SMaxime Ripard */ 9*0749f646SMaxime Ripard 10*0749f646SMaxime Ripard #include <common.h> 11*0749f646SMaxime Ripard #include <linux/err.h> 12*0749f646SMaxime Ripard #include <dm.h> 13*0749f646SMaxime Ripard #include <w1-eeprom.h> 14*0749f646SMaxime Ripard #include <w1.h> 15*0749f646SMaxime Ripard 16*0749f646SMaxime Ripard #define W1_F2D_READ_EEPROM 0xf0 17*0749f646SMaxime Ripard 18*0749f646SMaxime Ripard static int ds24xxx_read_buf(struct udevice *dev, unsigned int offset, 19*0749f646SMaxime Ripard u8 *buf, unsigned int count) 20*0749f646SMaxime Ripard { 21*0749f646SMaxime Ripard w1_reset_select(dev); 22*0749f646SMaxime Ripard 23*0749f646SMaxime Ripard w1_write_byte(dev, W1_F2D_READ_EEPROM); 24*0749f646SMaxime Ripard w1_write_byte(dev, offset & 0xff); 25*0749f646SMaxime Ripard w1_write_byte(dev, offset >> 8); 26*0749f646SMaxime Ripard 27*0749f646SMaxime Ripard return w1_read_buf(dev, buf, count); 28*0749f646SMaxime Ripard } 29*0749f646SMaxime Ripard 30*0749f646SMaxime Ripard static int ds24xxx_probe(struct udevice *dev) 31*0749f646SMaxime Ripard { 32*0749f646SMaxime Ripard struct w1_device *w1; 33*0749f646SMaxime Ripard 34*0749f646SMaxime Ripard w1 = dev_get_platdata(dev); 35*0749f646SMaxime Ripard w1->id = 0; 36*0749f646SMaxime Ripard return 0; 37*0749f646SMaxime Ripard } 38*0749f646SMaxime Ripard 39*0749f646SMaxime Ripard static const struct w1_eeprom_ops ds24xxx_ops = { 40*0749f646SMaxime Ripard .read_buf = ds24xxx_read_buf, 41*0749f646SMaxime Ripard }; 42*0749f646SMaxime Ripard 43*0749f646SMaxime Ripard static const struct udevice_id ds24xxx_id[] = { 44*0749f646SMaxime Ripard { .compatible = "maxim,ds24b33", .data = W1_FAMILY_DS24B33 }, 45*0749f646SMaxime Ripard { .compatible = "maxim,ds2431", .data = W1_FAMILY_DS2431 }, 46*0749f646SMaxime Ripard { }, 47*0749f646SMaxime Ripard }; 48*0749f646SMaxime Ripard 49*0749f646SMaxime Ripard U_BOOT_DRIVER(ds24xxx) = { 50*0749f646SMaxime Ripard .name = "ds24xxx", 51*0749f646SMaxime Ripard .id = UCLASS_W1_EEPROM, 52*0749f646SMaxime Ripard .of_match = ds24xxx_id, 53*0749f646SMaxime Ripard .ops = &ds24xxx_ops, 54*0749f646SMaxime Ripard .probe = ds24xxx_probe, 55*0749f646SMaxime Ripard }; 56