Skip to content

Commit

Permalink
nvmem: eeprom: at25: export FRAM serial num
Browse files Browse the repository at this point in the history
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
ef cd ab 89 67 45 23 01

Signed-off-by: Jiri Prchal <jiri.prchal@aksignal.cz>
  • Loading branch information
prchal authored and intel-lab-lkp committed Jun 16, 2021
1 parent 59d2f02 commit a1e8314
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
11 changes: 11 additions & 0 deletions Documentation/ABI/testing/sysfs-class-spi-eeprom
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,14 @@ Description:
Contains the FRAM binary data. Same as EEPROM, just another file
name to indicate that it employs ferroelectric process.
It performs write operations at bus speed - no write delays.

What: /sys/class/spi_master/spi<bus>/spi<bus>.<dev>/sernum
Date: May 2021
KernelVersion: 5.14
Contact: Jiri Prchal <jiri.prchal@aksignal.cz>
Description:
Contains the serial number of the Cypress FRAM (FM25VN) if it is
present. It will be displayed as a 8 byte hex string, as read
from the device.

This is a read-only attribute.
27 changes: 27 additions & 0 deletions drivers/misc/eeprom/at25.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@
* AT25M02, AT25128B
*/

#define FM25_SN_LEN 8 /* serial number length */
struct at25_data {
struct spi_device *spi;
struct mutex lock;
struct spi_eeprom chip;
unsigned addrlen;
struct nvmem_config nvmem_config;
struct nvmem_device *nvmem;
u8 sernum[FM25_SN_LEN];
};

#define AT25_WREN 0x06 /* latch the write enable */
Expand Down Expand Up @@ -171,6 +173,21 @@ static int fm25_aux_read(struct at25_data *at25, u8 *buf, uint8_t command,
return status;
}

static ssize_t sernum_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct at25_data *at25;

at25 = dev_get_drvdata(dev);
return sysfs_emit(buf, "%*ph\n", sizeof(at25->sernum), at25->sernum);
}
static DEVICE_ATTR_RO(sernum);

static struct attribute *sernum_attrs[] = {
&dev_attr_sernum.attr,
NULL,
};
ATTRIBUTE_GROUPS(sernum);

static int at25_ee_write(void *priv, unsigned int off, void *val, size_t count)
{
struct at25_data *at25 = priv;
Expand Down Expand Up @@ -359,6 +376,8 @@ static int at25_probe(struct spi_device *spi)
int err;
int sr;
u8 id[FM25_ID_LEN];
u8 sernum[FM25_SN_LEN];
int i;
const struct of_device_id *match;
int is_fram = 0;

Expand Down Expand Up @@ -415,6 +434,13 @@ static int at25_probe(struct spi_device *spi)
else
at25->chip.flags |= EE_ADDR2;

if (id[8]) {
fm25_aux_read(at25, sernum, FM25_RDSN, FM25_SN_LEN);
/* swap byte order */
for (i = 0; i < FM25_SN_LEN; i++)
at25->sernum[i] = sernum[FM25_SN_LEN - 1 - i];
}

at25->chip.page_size = PAGE_SIZE;
strncpy(at25->chip.name, "fm25", sizeof(at25->chip.name));
}
Expand Down Expand Up @@ -465,6 +491,7 @@ static struct spi_driver at25_driver = {
.driver = {
.name = "at25",
.of_match_table = at25_of_match,
.dev_groups = sernum_groups,
},
.probe = at25_probe,
};
Expand Down

0 comments on commit a1e8314

Please sign in to comment.