All of lore.kernel.org
 help / color / mirror / Atom feed
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.

  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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.