Thread (12 messages) flat view 12 messages, 2 authors, 2021-05-20

Re: [PATCH v4 4/4] nvmem: eeprom: at25: export FRAM serial num

From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Date: 2021-05-20 05:52:41
Also in: lkml

On Thu, May 20, 2021 at 07:47:14AM +0200, Jiri Prchal wrote:
This exports serial number of FRAM in sysfs file named "sernum".
Formatted in hex, each byte separated by space.
Example:
$ cat /sys/class/spi_master/spi0/spi0.0/sernum
No new Documentation/ABI/ entry for this?
quoted hunk ↗ jump to hunk
a4 36 44 f2 ae 6c 00 00

Signed-off-by: Jiri Prchal <redacted>
---
v2: no change here
v3: resend and added more recipients
v4: resend
---
 drivers/misc/eeprom/at25.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)
diff --git a/drivers/misc/eeprom/at25.c b/drivers/misc/eeprom/at25.c
index 4f6e983c278b..b2cffeb3af2c 100644
--- a/drivers/misc/eeprom/at25.c
+++ b/drivers/misc/eeprom/at25.c
@@ -38,6 +38,7 @@ struct at25_data {
 	struct nvmem_config	nvmem_config;
 	struct nvmem_device	*nvmem;
 	int has_sernum;
+	char *sernum;
 };

 #define	AT25_WREN	0x06		/* latch the write enable */
@@ -172,6 +173,19 @@ static int fm25_aux_read(struct at25_data *at25, char *buf, uint8_t command,
 	return status;
 }

+static ssize_t sernum_show(struct device *dev, struct device_attribute *attr, char *buf)
+{
+	struct at25_data *at25;
+	int i;
+
+	at25 = dev_get_drvdata(dev);
+	for (i = 0; i < FM25_SN_LEN; i++)
+		buf += sprintf(buf, "%02x ", at25->sernum[i]);
+	sprintf(--buf, "\n");
+	return (3 * i);
No, that is not how sysfs files work, sorry.  They are "one value per
file".  This looks like multiple values in the same file, why not just
one file per "sernum"?

Also, please use sysfs_emit() in the future.


quoted hunk ↗ jump to hunk
+}
+static DEVICE_ATTR_RO(sernum);
+
 static int at25_ee_write(void *priv, unsigned int off, void *val, size_t count)
 {
 	struct at25_data *at25 = priv;
@@ -427,8 +441,13 @@ static int at25_probe(struct spi_device *spi)
 		else
 			at25->chip.flags |= EE_ADDR2;

-		if (id[8])
+		if (id[8]) {
 			at25->has_sernum = 1;
+			at25->sernum = kzalloc(FM25_SN_LEN, GFP_KERNEL);
+			if (!at25->sernum)
+				return -ENOMEM;
+			fm25_aux_read(at25, at25->sernum, FM25_RDSN, FM25_SN_LEN);
+		}
 		else
 			at25->has_sernum = 0;
@@ -467,6 +486,13 @@ static int at25_probe(struct spi_device *spi)
 	if (IS_ERR(at25->nvmem))
 		return PTR_ERR(at25->nvmem);

+	/* Export the FM25 serial number */
+	if (at25->has_sernum) {
+		err = device_create_file(&spi->dev, &dev_attr_sernum);
You just raced with userspace and lost :(

Please do this correctly, by setting the driver group if you need a file
like this.

thanks,

greg k-h
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help