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 <maxime.ripard@bootlin.com> [eugen.hristev@microchip.com: reworked patch] Signed-off-by: Eugen Hristev <eugen.hristev@microchip.com>
This commit is contained in:
parent
e1721ba0e6
commit
c924ee25aa
@ -108,6 +108,8 @@ source "drivers/video/Kconfig"
|
||||
|
||||
source "drivers/w1/Kconfig"
|
||||
|
||||
source "drivers/w1-eeprom/Kconfig"
|
||||
|
||||
source "drivers/watchdog/Kconfig"
|
||||
|
||||
config PHYS_TO_BUS
|
||||
|
@ -106,6 +106,7 @@ obj-y += soc/
|
||||
obj-y += thermal/
|
||||
obj-y += axi/
|
||||
obj-$(CONFIG_W1) += w1/
|
||||
obj-$(CONFIG_W1_EEPROM) += w1-eeprom/
|
||||
|
||||
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
|
||||
endif
|
||||
|
17
drivers/w1-eeprom/Kconfig
Normal file
17
drivers/w1-eeprom/Kconfig
Normal file
@ -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
|
2
drivers/w1-eeprom/Makefile
Normal file
2
drivers/w1-eeprom/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
obj-$(CONFIG_W1_EEPROM) += w1-eeprom-uclass.o
|
||||
|
116
drivers/w1-eeprom/w1-eeprom-uclass.c
Normal file
116
drivers/w1-eeprom/w1-eeprom-uclass.c
Normal file
@ -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 <maxime.ripard@free-electrons.com>
|
||||
* Eugen Hristev <eugen.hristev@microchip.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#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;
|
||||
}
|
@ -94,6 +94,7 @@ enum uclass_id {
|
||||
UCLASS_VIDEO_BRIDGE, /* Video bridge, e.g. DisplayPort to LVDS */
|
||||
UCLASS_VIDEO_CONSOLE, /* Text console driver for video device */
|
||||
UCLASS_W1, /* Dallas 1-Wire bus */
|
||||
UCLASS_W1_EEPROM, /* one-wire EEPROMs */
|
||||
UCLASS_WDT, /* Watchdot Timer driver */
|
||||
|
||||
UCLASS_COUNT,
|
||||
|
33
include/w1-eeprom.h
Normal file
33
include/w1-eeprom.h
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user