Hi Philipp, On 29 April 2017 at 21:48, Simon Glass <[email protected]> wrote: > > Hi Philipp, > > On 28 April 2017 at 09:11, Philipp Tomsich > <[email protected]> wrote: > > This adds a simple driver for reading the efuse block of the RK3399. > > It should be easy enough to add drivers for other devices (e.g. the > > RK3328, RK3368, etc.) by passing the device details via driver_data. > > > > Unlike the kernel driver (using the nvmem subsystem), we don't expose > > the efuse as multiple named cells, but rather as a linear memory that > > can be read using misc_read(...). > > > > The primary use case (as of today) is the generation of a 'serial#' > > (and a 'cpuid#') environment variable for the RK3399-Q7 (Puma) > > system-on-module. > > > > Note that this adds a debug-only (i.e. only if DEBUG is defined) > > command 'rk3399_dump_efuses' that dumps the efuse block's content. > > N.B.: The name 'rk3399_dump_efuses' was intentionally chosen to > > include a SoC-name (together with a comment in the function) to > > remind whoever adds support for additional SoCs that this > > function currently makes assumptions regarding the size of the > > fuse-box based on the RK3399. The hope is that the function is > > adjusted to reflect any changes resulting from generalising the > > driver for multiple SoCs and is then renamed. > > > > Signed-off-by: Philipp Tomsich <[email protected]> > > Tested-by: Klaus Goger <[email protected]> > > --- > > > > Changes in v2: None > > > > drivers/misc/Kconfig | 14 ++++ > > drivers/misc/Makefile | 1 + > > drivers/misc/rockchip-efuse.c | 163 > > ++++++++++++++++++++++++++++++++++++++++++ > > 3 files changed, 178 insertions(+) > > create mode 100644 drivers/misc/rockchip-efuse.c > > Reviewed-by: Simon Glass <[email protected]> > > But please see below. > > > > > diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig > > index 1aae4bc..ed57414 100644 > > --- a/drivers/misc/Kconfig > > +++ b/drivers/misc/Kconfig > > @@ -20,6 +20,19 @@ config ALTERA_SYSID > > Select this to enable a sysid for Altera devices. Please find > > details on the "Embedded Peripherals IP User Guide" of Altera. > > > > +config ROCKCHIP_EFUSE > > + bool "Rockchip e-fuse support" > > + depends on MISC > > + help > > + Enable (read-only) access for the e-fuse block found in Rockchip > > + SoCs: accesses can either be made using byte addressing and a > > length > > + or through child-nodes that are generated based on the e-fuse map > > + retrieved from the DTS. > > + > > + This driver currently supports the RK3399 only, but can easily be > > + extended (by porting the read function from the Linux kernel > > sources) > > + to support other recent Rockchip devices. > > + > > config CMD_CROS_EC > > bool "Enable crosec command" > > depends on CROS_EC > > @@ -167,4 +180,5 @@ config I2C_EEPROM > > depends on MISC > > help > > Enable a generic driver for EEPROMs attached via I2C. > > + > > endmenu > > diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile > > index e3151ea..77196fd 100644 > > --- a/drivers/misc/Makefile > > +++ b/drivers/misc/Makefile > > @@ -51,3 +51,4 @@ obj-$(CONFIG_PCA9551_LED) += pca9551_led.o > > obj-$(CONFIG_FSL_DEVICE_DISABLE) += fsl_devdis.o > > obj-$(CONFIG_WINBOND_W83627) += winbond_w83627.o > > obj-$(CONFIG_QFW) += qfw.o > > +obj-$(CONFIG_ROCKCHIP_EFUSE) += rockchip-efuse.o > > diff --git a/drivers/misc/rockchip-efuse.c b/drivers/misc/rockchip-efuse.c > > new file mode 100644 > > index 0000000..6eb3616 > > --- /dev/null > > +++ b/drivers/misc/rockchip-efuse.c > > @@ -0,0 +1,163 @@ > > +/* > > + * eFuse driver for Rockchip devices > > + * > > + * Copyright 2017, Theobroma Systems Design und Consulting GmbH > > + * Written by Philipp Tomsich <[email protected]> > > + * > > + * SPDX-License-Identifier: GPL-2.0+ > > + */ > > + > > +#define DEBUG > > + > > +#include <common.h> > > +#include <asm/io.h> > > +#include <command.h> > > +#include <display_options.h> > > +#include <dm.h> > > +#include <linux/bitops.h> > > +#include <linux/delay.h> > > +#include <misc.h> > > + > > +#define RK3399_A_SHIFT 16 > > +#define RK3399_A_MASK 0x3ff > > +#define RK3399_NFUSES 32 > > +#define RK3399_BYTES_PER_FUSE 4 > > +#define RK3399_STROBSFTSEL BIT(9) > > +#define RK3399_RSB BIT(7) > > +#define RK3399_PD BIT(5) > > +#define RK3399_PGENB BIT(3) > > +#define RK3399_LOAD BIT(2) > > +#define RK3399_STROBE BIT(1) > > +#define RK3399_CSB BIT(0) > > + > > +struct rockchip_efuse_regs { > > + u32 ctrl; /* 0x00 efuse control register */ > > + u32 dout; /* 0x04 efuse data out register */ > > + u32 rf; /* 0x08 efuse redundancy bit used register */ > > + u32 _rsvd0; > > + u32 jtag_pass; /* 0x10 JTAG password */ > > + u32 strobe_finish_ctrl; > > + /* 0x14 efuse strobe finish control register */ > > +}; > > + > > +struct rockchip_efuse_platdata { > > + void __iomem *base; > > + struct clk *clk; > > +}; > > + > > +#if defined(DEBUG) > > +static int dump_efuses(cmd_tbl_t *cmdtp, int flag, > > + int argc, char * const argv[]) > > +{ > > + /* > > + * N.B.: This function is tailored towards the RK3399 and assumes > > that > > + * there's always 32 fuses x 32 bits (i.e. 128 bytes of data) > > to > > + * be read. > > + */ > > + > > + struct udevice *dev; > > + u8 fuses[128]; > > + int ret; > > + > > + /* the first misc device will be used */ > > + ret = uclass_first_device_err(UCLASS_MISC, &dev); > > This might pick up a different device. Can you use > uclass_get_device_by_driver() perhaps?
I've applied just the first patch in this series for now. Let me know if you would rather keep the driver finding as you have it. Regards, Simon _______________________________________________ U-Boot mailing list [email protected] https://lists.denx.de/listinfo/u-boot

