forked from AsahiLinux/u-boot
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
W1-EEPROM: Add an W1-EEPROM uclass for 1 wire EEPROMs
We might want to access data stored onto one wire EEPROMs. Create a framework to provide a consistent API. Signed-off-by: Maxime Ripard <[email protected]> [[email protected]: reworked patch] Signed-off-by: Eugen Hristev <[email protected]>
- Loading branch information
Showing
7 changed files
with
172 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# | ||
# EEPROM subsystem configuration | ||
# | ||
|
||
menu "1-wire EEPROM support" | ||
|
||
config W1_EEPROM | ||
bool "Enable support for EEPROMs on 1wire interface" | ||
depends on DM | ||
help | ||
Support for the EEPROMs connected on 1-wire Dallas protocol interface | ||
|
||
if W1_EEPROM | ||
|
||
endif | ||
|
||
endmenu |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
obj-$(CONFIG_W1_EEPROM) += w1-eeprom-uclass.o | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
// SPDX-License-Identifier: GPL-2.0+ | ||
/* | ||
* | ||
* Copyright (c) 2015 Free Electrons | ||
* Copyright (c) 2015 NextThing Co. | ||
* Copyright (c) 2018 Microchip Technology, Inc. | ||
* | ||
* Maxime Ripard <[email protected]> | ||
* Eugen Hristev <[email protected]> | ||
* | ||
*/ | ||
|
||
#include <common.h> | ||
#include <dm.h> | ||
#include <w1.h> | ||
#include <w1-eeprom.h> | ||
|
||
#include <dm/device-internal.h> | ||
|
||
int w1_eeprom_read_buf(struct udevice *dev, unsigned int offset, | ||
u8 *buf, unsigned int count) | ||
{ | ||
const struct w1_eeprom_ops *ops = device_get_ops(dev); | ||
u64 id = 0; | ||
int ret; | ||
|
||
if (!ops->read_buf) | ||
return -ENOSYS; | ||
|
||
ret = w1_eeprom_get_id(dev, &id); | ||
if (ret) | ||
return ret; | ||
if (!id) | ||
return -ENODEV; | ||
|
||
return ops->read_buf(dev, offset, buf, count); | ||
} | ||
|
||
int w1_eeprom_register_new_device(u64 id) | ||
{ | ||
u8 family = id & 0xff; | ||
int ret; | ||
struct udevice *dev; | ||
|
||
for (ret = uclass_first_device(UCLASS_W1_EEPROM, &dev); | ||
!ret && dev; | ||
uclass_next_device(&dev)) { | ||
if (ret || !dev) { | ||
debug("cannot find w1 eeprom dev\n"); | ||
return ret; | ||
} | ||
if (dev_get_driver_data(dev) == family) { | ||
struct w1_device *w1; | ||
|
||
w1 = dev_get_parent_platdata(dev); | ||
if (w1->id) /* device already in use */ | ||
continue; | ||
w1->id = id; | ||
debug("%s: Match found: %s:%s %llx\n", __func__, | ||
dev->name, dev->driver->name, id); | ||
return 0; | ||
} | ||
} | ||
|
||
debug("%s: No matches found: error %d\n", __func__, ret); | ||
|
||
return ret; | ||
} | ||
|
||
int w1_eeprom_get_id(struct udevice *dev, u64 *id) | ||
{ | ||
struct w1_device *w1 = dev_get_parent_platdata(dev); | ||
|
||
if (!w1) | ||
return -ENODEV; | ||
*id = w1->id; | ||
|
||
return 0; | ||
} | ||
|
||
UCLASS_DRIVER(w1_eeprom) = { | ||
.name = "w1_eeprom", | ||
.id = UCLASS_W1_EEPROM, | ||
.flags = DM_UC_FLAG_SEQ_ALIAS, | ||
#if CONFIG_IS_ENABLED(OF_CONTROL) | ||
.post_bind = dm_scan_fdt_dev, | ||
#endif | ||
}; | ||
|
||
int w1_eeprom_dm_init(void) | ||
{ | ||
struct udevice *dev; | ||
struct uclass *uc; | ||
int ret; | ||
|
||
ret = uclass_get(UCLASS_W1_EEPROM, &uc); | ||
if (ret) { | ||
debug("W1_EEPROM uclass not available\n"); | ||
return ret; | ||
} | ||
|
||
uclass_foreach_dev(dev, uc) { | ||
ret = device_probe(dev); | ||
if (ret == -ENODEV) { /* No such device. */ | ||
debug("W1_EEPROM not available.\n"); | ||
continue; | ||
} | ||
|
||
if (ret) { /* Other error. */ | ||
printf("W1_EEPROM probe failed, error %d\n", ret); | ||
continue; | ||
} | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/* SPDX-License-Identifier: GPL-2.0+ | ||
* | ||
* Copyright (c) 2015 Free Electrons | ||
* Copyright (c) 2015 NextThing Co | ||
* Copyright (c) 2018 Microchip Technology, Inc. | ||
* | ||
*/ | ||
|
||
#ifndef __W1_EEPROM_H | ||
#define __W1_EEPROM_H | ||
|
||
struct udevice; | ||
|
||
struct w1_eeprom_ops { | ||
/* | ||
* Reads a buff from the given EEPROM memory, starting at | ||
* given offset and place the results into the given buffer. | ||
* Should read given count of bytes. | ||
* Should return 0 on success, and normal error.h on error | ||
*/ | ||
int (*read_buf)(struct udevice *dev, unsigned int offset, | ||
u8 *buf, unsigned int count); | ||
}; | ||
|
||
int w1_eeprom_read_buf(struct udevice *dev, unsigned int offset, | ||
u8 *buf, unsigned int count); | ||
|
||
int w1_eeprom_dm_init(void); | ||
|
||
int w1_eeprom_register_new_device(u64 id); | ||
|
||
int w1_eeprom_get_id(struct udevice *dev, u64 *id); | ||
#endif |