From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mout.kundenserver.de (mout.kundenserver.de [212.227.126.130]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 047EA30F95C for ; Tue, 2 Dec 2025 11:33:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=212.227.126.130 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764675225; cv=none; b=GLux8uyMj9sLXL2tP882d0gteGVEbCVq2H6zvNf5x9zlQUkBX4zgY9fcQqIYw+p7dYcA1djtQ1FHg95/PYid13mHteDQxk9/XBM7jI+z1DURuv24D1KXiplp5L/dfZ+gA2tvQ3lrT1SeKQEScK1qmqW9QVWFoX86r7t1eHbJAq0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764675225; c=relaxed/simple; bh=QEC3K9N6oWFf9q5HYZ2ikV5sy4c8d3FwOcgxS4Tks5o=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=r3Qn1fU/govmwT5njzKlfpbntN/lo5aEJHoaGwuyX2b9w9TA7aKAh7z6BsH0OOiR1sVz4NWH4Cr5FpmjVpn2QQD5gEm6kzpkpEtI9/Y2W3EQKo020AHe/Op30q3FSjG0LUf16VEzYWMwJu3/iUwFnRgwf47rsjtUk+Yat7pk5jI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=notsyncing.net; spf=pass smtp.mailfrom=notsyncing.net; arc=none smtp.client-ip=212.227.126.130 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=notsyncing.net Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=notsyncing.net Received: from kronii.fritz.box ([88.130.217.14]) by mrelayeu.kundenserver.de (mreue012 [212.227.15.167]) with ESMTPSA (Nemesis) id 1MUD7D-1vYsZl2NwB-00T5Tg; Tue, 02 Dec 2025 11:50:42 +0100 From: Markus Perkins To: Arnd Bergmann , Greg Kroah-Hartman Cc: agust@denx.de, linkmauve@linkmauve.fr, Markus Perkins , linux-kernel@vger.kernel.org Subject: [PATCH] misc: eeprom: Fix EWEN/EWDS/ERAL commands for 93xx56 and 93xx66 Date: Tue, 2 Dec 2025 11:48:24 +0100 Message-ID: <20251202104823.429869-3-markus@notsyncing.net> X-Mailer: git-send-email 2.51.2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Provags-ID: V03:K1:fhiBmEYWJBVZvo5OabpLOfMMH3ejESecdbncuW4FLVNxxdMBqzp mK7/Bx4McVMtTQbtxCaXUV8LFDb9VjHVCyovpFo2z2nZlcPPUwizyG5DCa+ANYeedCZhbTf DRwT2qNQjQ93tvQOguiCVBQLgZN3d735S39Eahi7jeQL1rsY6DB4o07vMJ5qYLZ673rBCuZ qEVJm2TKQzLbXuGiaLggw== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:clnOx9zFGjA=;4msBX7iDTtp4R9/tkfUORqzRxMH c2m2+RHR9jBljY/fEUa7xK7C48vVlhT9TjE5paBWfPgSmJd7HLNXoDkvBTZKkRdxdyGI9R64e B9BUEeK3uSsLmuODicTScsrTTyX0hmMbc7vD8kvW+VqLPusbd+eNAT8c2TWuCJT9CnUF483sa cwZxSe61ldlWmLEkO6FQsWx6PRCg/PU6ijYcIfP0Ix1aj8I95kDisfnJrnQGEqgKPin9eA19f /Ah5uM0DQmAaYa2Hw3VlppLrZzTx2R6w5DHQU5LOaXGScYpmM/+4MFi6UznvmQBj41iBohbY1 M6ZqJb81fokpoSCRCFKP2xdKK5Q/UKiqRlS8yae7DNXETQMnKAD2raWrTx7G+kU9OV//SOqUo Lh6hUP0l9u7dRd5m316no4Q9lewzdGp8hh+f6aZp/wbGfEZLsJXO4KlgW4IFsZrjdQIg9OwZl D/yRrBYXTzD1MHqKEHD/OQjB5scLI7pTJ1iXiG3JpQPa94LMy/abADzF2Vp7M1QpEL2ms+PfJ aiZh9GRYgpYitBQIfwXymFHTsAQPGSvsJwPh3eDiidYiCT2pXL5bmAW5QapvfhmIaQL71KIsg 2kFVMN8RX1p85opPlCG6x8Pytobp8PX0cLbtXJXsQRCpaft36ohwVvxIhdZKOqGrEkTI8ndAQ dc9CL81QZIfnm9MCpiNrzKapVvgOUVhdgxONBP0RsweQUe8SkTi0D9D/m4pVdHsUJP1DXNTHK PvVOMUtTk9lkJ1WF7Nh5JFKOP5U8Z1HqqJ/VG41xOjyh2VidfYtKuZwoczz8rj3vIpeoE3k1s Trv34lVy+o+Qf9snEzRyO7NaCdN3+ULpjxjcbLyXw35NyyIAzRLgXcxXiCMrvNVrMEnnIBrXd Qs8g34ctlvr+g0mPxBaKm+bcNRvfyzeCdQt5N14vH+gNOo5fIeTE5kIaEspKqmX/P0ste+Z4S UJ7HTWHAW/WXTjz+hfSPpwdFztnnF9P2DCB2x/Q8F3YgewMgka3diFds+wQ/rR5HZZXaNc4YT SnoXWNOm5Nqce0AoaGOEw75HfNDwvIkI+ynzFaJKT9tQGHYvBoFY8oEHFZx7BjPEm6nNDBYhh JhFuK7Yf5zZ4XLrZ/hSaqM+J09fnWleCTA6FKBxEHFf30u6p6Yc6H/d9jWFz5sifXRcB+qvd1 exha7Vcf5BMdGok2S5KtxEd0OJ9ZQwFQRmsqOFts98u4fI47o+lMlGnrQqzoOBihKoBOBFf3Z JQNDBEfkbJ248CumaHySc2Qn60tH4uJJDvYv2UGpXrfGsa5kf4Uc5toX+iR7V8CcCJ6mu25SM Pfkl1ZrksFq/PPxraybrIrx+K53j5h/gU2gg7ut+fHS3inTXM4sptOAFKyBWMaNYMI2GoarVy YSGKiG3saSfTjpbTxtRUBFSLl8qj7X8YzBdX9oDZcDOVU6ABm0V8wbys4yuPYpkyxn0pJoWKA O17t3GAXkS579FFLd4nwkb/tcLrZ8UkoNa0TBdWXZnKDUPmuPUReCICTxne3zhNsU5FWSdczm C4d1flMGxQXXlfJDGr7pBjAG1rmQY5Rpmy5XBqYmfBkQ0N4EnCP+xSxoP04jBzACQXwvO6N8+ VWf4HJNx08z5zS1X3WdhXPuyp3fu46T5tMR47I12chI8hX8mMA1JaLG0+vGMYzk58lnVerTQD sdYOcQeR8VNcG1/vHI/Jo/oSEPrcKBsXFmpAJwVIN64nUASQhnMoWYsWpFNf8QqfT5X3erQpj EjsrrDqJRgGJw commit 14374fbb3f06 ("misc: eeprom_93xx46: Add new 93c56 and 93c66 compatible strings") added support for 93xx56 and 93xx66 eeproms, but didn't take into account that the write enable/disable + erase all commands are hardcoded for the 6-bit address of the 93xx46. This commit fixes the command word generation by increasing the number of shifts as the address field grows, keeping the command intact. Also, the check for 8-bit or 16-bit mode is no longer required as this is already taken into account in the edev->addrlen field. Signed-off-by: Markus Perkins --- I verified this update with an AT93C66 EEPROM connected to a Raspberry Pi 3 with the gpio-spi driver. (I need the gpio-spi driver because the Broadcom SoC only supports 8-bit SPI transfer lengths.) Here are the waveforms recorded by my logic analyzer (write command): * Before: https://notsyncing.net/downloads/scrot/93c66_broken.png * After: https://notsyncing.net/downloads/scrot/93c66_fixed.png CC'ing Emmanuel and Anatolij as potential reviewers. drivers/misc/eeprom/eeprom_93xx46.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/drivers/misc/eeprom/eeprom_93xx46.c b/drivers/misc/eeprom/eeprom_93xx46.c index 9cae6f530679..5230e910a1d1 100644 --- a/drivers/misc/eeprom/eeprom_93xx46.c +++ b/drivers/misc/eeprom/eeprom_93xx46.c @@ -45,6 +45,7 @@ struct eeprom_93xx46_platform_data { #define OP_START 0x4 #define OP_WRITE (OP_START | 0x1) #define OP_READ (OP_START | 0x2) +/* The following addresses are offset for the 1K EEPROM variant in 16-bit mode */ #define ADDR_EWDS 0x00 #define ADDR_ERAL 0x20 #define ADDR_EWEN 0x30 @@ -191,10 +192,7 @@ static int eeprom_93xx46_ew(struct eeprom_93xx46_dev *edev, int is_on) bits = edev->addrlen + 3; cmd_addr = OP_START << edev->addrlen; - if (edev->pdata->flags & EE_ADDR8) - cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << 1; - else - cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS); + cmd_addr |= (is_on ? ADDR_EWEN : ADDR_EWDS) << (edev->addrlen - 6); if (has_quirk_instruction_length(edev)) { cmd_addr <<= 2; @@ -328,10 +326,7 @@ static int eeprom_93xx46_eral(struct eeprom_93xx46_dev *edev) bits = edev->addrlen + 3; cmd_addr = OP_START << edev->addrlen; - if (edev->pdata->flags & EE_ADDR8) - cmd_addr |= ADDR_ERAL << 1; - else - cmd_addr |= ADDR_ERAL; + cmd_addr |= ADDR_ERAL << (edev->addrlen - 6); if (has_quirk_instruction_length(edev)) { cmd_addr <<= 2; -- 2.51.2