From: Alexander Sverdlin <alexander.sverdlin@gmail.com>
To: Markus Heidelberg <m.heidelberg@cab.de>,
Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
devicetree@vger.kernel.org
Cc: Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Christian Eggers <ceggers@arri.de>,
Jiri Prchal <jiri.prchal@aksignal.cz>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] eeprom: at25: support Cypress FRAMs without device ID
Date: Thu, 14 Aug 2025 14:24:06 +0200 [thread overview]
Message-ID: <cfdff4f068c98feba252b28fb61de7629637dc45.camel@gmail.com> (raw)
In-Reply-To: <20250814111546.617131-3-m.heidelberg@cab.de>
On Thu, 2025-08-14 at 13:15 +0200, Markus Heidelberg wrote:
> Not all FRAM chips have a device ID and implement the corresponding read
> command. For such chips this led to the following error on module
> loading:
>
> at25 spi2.0: Error: no Cypress FRAM (id 00)
>
> The device ID contains the memory size, so devices without this ID are
> supported now by setting the size manually in Devicetree using the
> "size" property.
>
> Tested with FM25L16B and "size = <2048>;":
>
> at25 spi2.0: 2 KByte fm25 fram, pagesize 4096
>
> According to Infineon/Cypress datasheets, these FRAMs have a device ID:
>
> FM25V01A
> FM25V02A
> FM25V05
> FM25V10
> FM25V20A
> FM25VN10
>
> but these do not:
>
> FM25040B
> FM25640B
> FM25C160B
> FM25CL64B
> FM25L04B
> FM25L16B
> FM25W256
>
> So all "FM25V*" FRAMs and only these have a device ID. The letter after
> "FM25" (V/C/L/W) only describes the voltage range, though.
>
> Link: https://lore.kernel.org/all/20250401133148.38330-1-m.heidelberg@cab.de/
> Signed-off-by: Markus Heidelberg <m.heidelberg@cab.de>
Reviewed-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
> ---
> drivers/misc/eeprom/at25.c | 67 ++++++++++++++++++++------------------
> 1 file changed, 36 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/misc/eeprom/at25.c b/drivers/misc/eeprom/at25.c
> index 2d0492867054..c90150f72836 100644
> --- a/drivers/misc/eeprom/at25.c
> +++ b/drivers/misc/eeprom/at25.c
> @@ -379,37 +379,49 @@ static int at25_fram_to_chip(struct device *dev, struct spi_eeprom *chip)
> struct at25_data *at25 = container_of(chip, struct at25_data, chip);
> u8 sernum[FM25_SN_LEN];
> u8 id[FM25_ID_LEN];
> + u32 val;
> int i;
>
> strscpy(chip->name, "fm25", sizeof(chip->name));
>
> - /* Get ID of chip */
> - fm25_aux_read(at25, id, FM25_RDID, FM25_ID_LEN);
> - /* There are inside-out FRAM variations, detect them and reverse the ID bytes */
> - if (id[6] == 0x7f && id[2] == 0xc2)
> - for (i = 0; i < ARRAY_SIZE(id) / 2; i++) {
> - u8 tmp = id[i];
> - int j = ARRAY_SIZE(id) - i - 1;
> + if (!device_property_read_u32(dev, "size", &val)) {
> + chip->byte_len = val;
> + } else {
> + /* Get ID of chip */
> + fm25_aux_read(at25, id, FM25_RDID, FM25_ID_LEN);
> + /* There are inside-out FRAM variations, detect them and reverse the ID bytes */
> + if (id[6] == 0x7f && id[2] == 0xc2)
> + for (i = 0; i < ARRAY_SIZE(id) / 2; i++) {
> + u8 tmp = id[i];
> + int j = ARRAY_SIZE(id) - i - 1;
> +
> + id[i] = id[j];
> + id[j] = tmp;
> + }
> + if (id[6] != 0xc2) {
> + dev_err(dev, "Error: no Cypress FRAM (id %02x)\n", id[6]);
> + return -ENODEV;
> + }
>
> - id[i] = id[j];
> - id[j] = tmp;
> + switch (id[7]) {
> + case 0x21 ... 0x26:
> + chip->byte_len = BIT(id[7] - 0x21 + 4) * 1024;
> + break;
> + case 0x2a ... 0x30:
> + /* CY15B116QN ... CY15B116QN */
> + chip->byte_len = BIT(((id[7] >> 1) & 0xf) + 13);
> + break;
> + default:
> + dev_err(dev, "Error: unsupported size (id %02x)\n", id[7]);
> + return -ENODEV;
> }
> - if (id[6] != 0xc2) {
> - dev_err(dev, "Error: no Cypress FRAM (id %02x)\n", id[6]);
> - return -ENODEV;
> - }
>
> - switch (id[7]) {
> - case 0x21 ... 0x26:
> - chip->byte_len = BIT(id[7] - 0x21 + 4) * 1024;
> - break;
> - case 0x2a ... 0x30:
> - /* CY15B116QN ... CY15B116QN */
> - chip->byte_len = BIT(((id[7] >> 1) & 0xf) + 13);
> - break;
> - default:
> - dev_err(dev, "Error: unsupported size (id %02x)\n", id[7]);
> - return -ENODEV;
> + 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];
> + }
> }
>
> if (chip->byte_len > 64 * 1024)
> @@ -417,13 +429,6 @@ static int at25_fram_to_chip(struct device *dev, struct spi_eeprom *chip)
> else
> 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];
> - }
> -
> chip->page_size = PAGE_SIZE;
> return 0;
> }
> --
> 2.43.0
--
Alexander Sverdlin.
next prev parent reply other threads:[~2025-08-14 12:24 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-14 11:15 [PATCH 0/3] eeprom: at25: support Cypress FRAMs without device ID Markus Heidelberg
2025-08-14 11:15 ` [PATCH 1/3] dt-bindings: eeprom: at25: use "size" for " Markus Heidelberg
2025-08-14 20:47 ` Conor Dooley
2025-08-14 11:15 ` [PATCH 2/3] eeprom: at25: support Cypress " Markus Heidelberg
2025-08-14 12:24 ` Alexander Sverdlin [this message]
2025-08-14 11:15 ` [PATCH 3/3] eeprom: at25: make FRAM device ID error message more precise Markus Heidelberg
2025-08-14 12:25 ` Alexander Sverdlin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cfdff4f068c98feba252b28fb61de7629637dc45.camel@gmail.com \
--to=alexander.sverdlin@gmail.com \
--cc=arnd@arndb.de \
--cc=ceggers@arri.de \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jiri.prchal@aksignal.cz \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=m.heidelberg@cab.de \
--cc=robh@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox