mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-08-31 06:18:51 +09:00
![Simon Glass](/assets/img/avatar_default.png)
We use 'priv' for private data but often use 'platdata' for platform data. We can't really use 'pdata' since that is ambiguous (it could mean private or platform data). Rename some of the latter variables to end with 'plat' for consistency. Signed-off-by: Simon Glass <sjg@chromium.org>
118 lines
2.2 KiB
C
118 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
*
|
|
* Copyright (c) 2015 Free Electrons
|
|
* Copyright (c) 2015 NextThing Co.
|
|
* Copyright (c) 2018 Microchip Technology, Inc.
|
|
*
|
|
* Maxime Ripard <maxime.ripard@free-electrons.com>
|
|
* Eugen Hristev <eugen.hristev@microchip.com>
|
|
*
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <dm.h>
|
|
#include <log.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_plat(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_plat(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;
|
|
}
|